樓主的程序很亂,可以先把其它程序屏蔽掉,只保留頻率計的基本部分,調試正常后再逐漸加進其它程序。對于這種要求反應速度快的應用千萬不要采用delay阻滯型延時。給你刪減了,只保留頻率計的基本部分供參考。另外指出樓主的程序與仿真圖不符。
無標題.jpg (189.79 KB, 下載次數: 33)
下載附件
2020-6-5 23:41 上傳
- #include <reg52.h>//頭文件
- #define uchar unsigned char //宏定義,后面用uchar替代無符號字符
- #define uint unsigned int//后面用 uint替代無符號整形
- uchar code led_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x00,0x76,0x38};//數碼管段碼0~9,H,L
- uchar code wela[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- unsigned char dispbuf[6]={11,0,0,0,0,0}; //顯示緩沖區,存放要顯示的6個字符的段碼值
- unsigned int timecount; //中斷1累計次數定義
- bit flag; //1秒的標志
- unsigned int x,y; //
- void Init()
- {
- TMOD |= 0x02; //設置定時器0自動重裝模式
- TL0 = 0x06; //250微秒@12.000MHz
- TH0 = 0x06; //設置定時重載值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0=1; //開定時器0中斷
- EA=1; //開總中斷
- IT0 = 1; //下降沿觸發
- EX0 = 1; //開外部中斷
- }
- void display(void) //顯示
- {
- static uchar i=0;//數碼管的位置定義
- P0=0x00;
- P2=wela[i];
- P0=led_7[dispbuf[i]];
- i++;
- i%=6;
- }
- void main()//主函數
- {
- unsigned char i;
- Init();//初始化
- while(1)
- {
- if(flag)
- {
- flag=0;
- y=x;
- x=0;
- for(i=0;i<5;i++)
- {
- dispbuf[i+1]=y%10;//由低位到高位保存
- y/=10;
- }
- }
- display() ; //顯示
- }
- }
- void InterruptTimer0(void) interrupt 1
- {
- timecount++;
- if(timecount>=4000)
- {
- timecount=0;
- flag=1;
- }
- }
- void exint0() interrupt 0
- {
- x++;
- }
復制代碼
|