|
輸入波形有毛刺需要加低通濾波器,外部計數(shù)大于65535要開中斷。程序中毛病較多,給你改了。
無標(biāo)題.jpg (279.2 KB, 下載次數(shù): 55)
下載附件
2022-3-7 22:41 上傳
- #include <reg51.h>
- sbit export1 = P1^0; //將單片機(jī)的P1^0端口設(shè)定為輸出
- sbit key1 = P1^7; //定義P1^7口是按鍵key1
- unsigned char code table[]={//共陰數(shù)碼管段碼"0~f-."
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x40,0x80};
- unsigned char data LEDBuf[8];
- unsigned long NumCnt=0;
- unsigned int num,num1;
- void Timer0Init(void); //做一個計時器聲明
- void Timer1Init(void); //做一個計數(shù)器聲明
- void key(); //按鍵聲明
- void display_service();
- void DigDisplay_Service(); //數(shù)碼管數(shù)值顯示
- /*****************************************************
- 函數(shù)名: main
- 功 能:主函數(shù)
- 參 數(shù):
- 返回值:
- *****************************************************/
- void main()
- {
- Timer0Init(); //做一個調(diào)用 定時功能去刷新數(shù)碼管
- Timer1Init(); //做一個調(diào)用 計數(shù)功能去做一個計數(shù)
- EA = 1;//中斷中開開關(guān)
- while(1)
- {
- key();
- NumCnt=((unsigned long)num<<16)|((TH1<<8)|TL1);
- display_service();
- }
- }
- void key() //按一下輸出只維持1s
- {
- static unsigned char count;
- static bit sign=0;
- if(!key1) //檢測按鍵K1是否按下
- {
- if(++count>=5 && sign==0 && export1==1)
- {
- sign=1;
- export1=0;
- }
- }
- else
- {
- count=0;
- sign=0;
- }
- }
- void display_service()
- {
- static unsigned char i;
- switch(i)
- {
- case 0: LEDBuf[0] = table[NumCnt/10000000%10]; break; //千萬位
- case 1: LEDBuf[1] = table[NumCnt/1000000%10]; break;//百萬位
- case 2: LEDBuf[2] = table[NumCnt/100000%10]; break;//十萬位
- case 3: LEDBuf[3] = table[NumCnt/10000%10]; break;//萬位
- case 4: LEDBuf[4] = table[NumCnt/1000%10]; break;//千位
- case 5: LEDBuf[5] = table[NumCnt/100%10]; break;//百位
- case 6: LEDBuf[6] = table[NumCnt/10%10]; break;//十位
- case 7: LEDBuf[7] = table[NumCnt%10]; break;//個位
- }
- i=++i%8;
- }
- void DigDisplay_Service()
- {
- static unsigned char i;
- P0=0x00;
- P2=~(0x01<<i);
- P0=LEDBuf[i];
- i=++i%8;
- }
- /*****************************************
- 1、中斷服務(wù)函數(shù)一定是一個沒有返回值的函數(shù)
- 2、中斷服務(wù)函數(shù)一定是一個沒有參數(shù)的函數(shù)
- 3、中斷服務(wù)函數(shù)名稱后面跟一個關(guān)鍵字interrupt
- 4、interrupt 0--4共計5個中斷源 8*n +0003H
- 0003H INT0
- 000BH T0
- 0013H INT1
- 001BH T1
- 0023H ES
- 5、中斷服務(wù)函數(shù)不能被主程序或者其他程序調(diào)用
- 6、N后面跟using m (0--3)工作寄存器組
- *****************************************/
- void Timer0Init(void)//1毫秒@12.000MHz
- {
- TMOD &= 0xF0; //設(shè)置定時器模式
- TMOD |= 0x01; //設(shè)置定時器模式
- TL0 = 0x18; //設(shè)置定時初始值
- TH0 = 0xFC; //設(shè)置定時初始值
- TF0 = 0; //清除TF0標(biāo)志
- ET0 = 1; //定時器0的中斷開關(guān)
- EA = 1; //中斷開關(guān)
- TR0 = 1; //定時器0開始計時
- }
- void Timer1Init(void) //1毫秒@12.00MHz
- {
- TMOD &= 0x0F; //設(shè)置計數(shù)器模式
- TMOD |= 0x50; //設(shè)置計數(shù)器模式
- TL1 = 0; //設(shè)置計數(shù)器初值
- TH1 = 0; //設(shè)置計數(shù)器初值
- TF1 = 0; //清除TF1標(biāo)志
- ET1 = 1; //定時器1的中斷開關(guān)
- TR1 = 1; //打開計數(shù)器1開始計數(shù)
- }
- /*******************************************
- 1、中斷服務(wù)函數(shù)一定是一個沒有返回值的一個函數(shù)
- 2、中斷服務(wù)函數(shù)是一個沒有參數(shù)的函數(shù)
- 3、中斷服務(wù)函數(shù)函數(shù)名稱后面跟一個關(guān)鍵字interrupt
- 4、interrupt 0——4 共計5各中斷源 8*n + 0003H
- 0003H INT0
- 000BH T0
- 0013H INT1
- 001BH T1
- 0023H ES
- 5、中斷服務(wù)函數(shù)不能被主程序或者其他程序調(diào)用
- 6、n后面跟using m (0——3)工作寄存器組
- *******************************************/
- void time0_ISR(void) interrupt 1 //終端定時器0標(biāo)號1
- {
- TL0 = 0x18; //設(shè)置定時初始值
- TH0 = 0xFC; //設(shè)置定時初始值
- if(!export1)
- {
- num1++;
- if(num1>=1000)
- {
- num1=0;
- export1=1;
- }
- }
- DigDisplay_Service();
- }
- void time1_ISR(void) interrupt 3
- {
- num++;
- }
復(fù)制代碼
|
|