|
- #include<reg52.h>
- bit timeint0,timeint1;
- unsigned char dispbuf[4];
- unsigned int period;
- unsigned int timecount=0;
- unsigned int count_1s;
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //7段數(shù)碼管代碼表
- HEX_TO_BCD(unsigned int n)
- {
- unsigned char i; //當(dāng)顯示的頻率超出范圍,顯示EEEE報(bào)錯(cuò)
- if (n>9361)
- for(i=0;i<4;i++)
- dispbuf[i]=0x0e;
- else
- {
- dispbuf[3]=n/1000; //取出千位字節(jié)
- dispbuf[2]=(n/100)%10; //取出百位字節(jié)
- dispbuf[1]=(n/10)%10; //取出十位字節(jié)
- dispbuf[0]=n%10; //取出個(gè)位字節(jié)
- }
- }
- void scandisp(void) //顯示子程序,
- //將顯示緩存數(shù)組中的BCD碼掃描并顯示在數(shù)碼管上
- {
- unsigned char posi=0x01;
- unsigned char i,j,temp;
- for(i=0;i<4;i++) //依次選中4個(gè)數(shù)碼管
- {
- temp=dispbuf[i];//查出字碼
- temp=table[temp];//第三位顯示小數(shù)點(diǎn)
- if(i==1)
- {
- for(j=0;j<200;j++)
- {
- P2=posi;
- P0=temp|0x80;
- }
- }
- else
- {
- for(j=0;j<200;j++)
- {
- P2=posi;
- P0 =temp;
- }
- }
- //依次點(diǎn)亮字位
- posi<<=1;
- }
- }
- void INIT_TMR1INT(void) //定時(shí)器初始化了程序,定義了兩種
- {
- //定時(shí)/計(jì)數(shù)器0工作定時(shí)器方式,定時(shí)/計(jì)數(shù)器1工作在計(jì)數(shù)器方式
- TMOD=0x51;
- ET1=1;//中斷0開(kāi)中斷
- ET0=1;//CPU開(kāi)中斷
- EA=1;
- count_1s=0;//啟動(dòng)定時(shí)/計(jì)數(shù)器0開(kāi)始定時(shí)
- TR0=1;
- TR1=1;
- }
- void time0(void) interrupt 1 //定時(shí)器0中斷服務(wù)程序,系統(tǒng)自動(dòng)調(diào)用,
- //每2.5ms執(zhí)行一次
- {
- TH0=0xf6;
- TH1=0x3c;//每次定時(shí)是2.5 ms, 40次即0.1s
- if(++count_1s>40)
- {
- count_1s=0;//每0.1s對(duì)計(jì)數(shù)器1所計(jì)數(shù)值進(jìn)行統(tǒng)計(jì)
- timecount=TH1*256+TL1;
- TH1=0;
- TL1=0;//精確到小數(shù)點(diǎn)后1位,以KHz為單位
- period=timecount/10;//四舍五入顯示
- if((timecount%10)>4)
- period++;
- timecount=0;
- HEX_TO_BCD(period);
- }
- }
- void timer1(void) interrupt 3 //定時(shí)器1中斷服務(wù)程序,溢出后中斷
- {
- TH1=0x00;
- TL1=0x00;
- }
- void main(void) //主函數(shù)
- {
- //初始化
- INIT_TMR1INT();
- while(1)
- {
- //顯示子程序
- scandisp();
- }
- }
復(fù)制代碼 |
|