楼主的程序很乱,可以先把其它程序屏蔽掉,只保留频率计的基本部分,调试正常后再逐渐加进其它程序。对于这种要求反应速度快的应用千万不要采用delay阻滞型延时。给你删减了,只保留频率计的基本部分供参考。另外指出楼主的程序与仿真图不符。
- #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++;
- }
复制代码
|