|
簡易電壓表測量設(shè)備的制作proteus仿真及其C語言程序,供參考
#include <reg52.h>
#define TIMEFRQ 480 //定義定時器定時頻率
#define CLOCK 22118400 //系統(tǒng)時鐘
#define LED_SEG P0 //定義數(shù)碼管接口
#define LED_BIT P2
#define num 100 //50次測量求平均值
sbit key0 = P3^4;
sbit key1 = P3^5;
sbit wr = P3^6;
sbit rd = P3^7;
unsigned char segcode[]=
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0
};//共陰極
unsigned char led_buf[]={0,0,0,0,0,0,0}; //緩沖數(shù)組
delay(unsigned int t)
{
while(--t);
}
//定時器初始化
void Init_T1(void)
{
TMOD = (TMOD & 0X0F) | 0X10; //定時器1工作在模式1,16Bit定時器模式
TH1 = 255-CLOCK/TIMEFRQ/12/256;
TL1 = 255-CLOCK/TIMEFRQ/12%256;
EA = 1; //開總中斷
ET1 = 1;
TR1 = 1;//開啟定時器和中斷
}
//讀取ADC0804結(jié)果函數(shù)
unsigned char get_8bit()
{
unsigned int temp = 0;
wr=1;
rd=0;//ADC數(shù)據(jù)一直輸出
wr=0;
wr=1;//啟動ADC
delay(1000);//延時等待ADC結(jié)束
temp = P1;
return(temp);
}
main()
{
unsigned long int SUM = 0;
unsigned int counter;
unsigned char j;
j = num ; //num=50
Init_T1(); //定時器初始化
while(1)
{
/***更新顯示緩沖區(qū)***/
led_buf[2] = counter%10;
led_buf[3] = counter/10%10;
led_buf[4] = (counter/100)%10;
led_buf[5] = (counter/1000)%10+10;//+10就是加小數(shù)點
led_buf[0] = 20;//熄滅
led_buf[1] = 20;//熄滅
/*************************************/
SUM += get_8bit()*2; //從P1口讀二進制數(shù)據(jù)
j--;
if(j==0) //采集50次數(shù)據(jù)之后取平均值
{
counter = SUM/num;
counter = counter*2.50*1000/255;
SUM = 0;
j = num ;
}
}
}
/*定時器中斷,完成數(shù)碼管顯示刷新*/
void time() interrupt 3
{
static unsigned char i=0;
TH1 = 255-CLOCK/TIMEFRQ/12/256;
TL1 = 255-CLOCK/TIMEFRQ/12%256;
i=++i%6;
LED_BIT = 0x0; //關(guān)所有數(shù)碼管
LED_SEG = segcode[led_buf[i]];
LED_BIT = (1<<i);
}
|
|