输入波形有毛刺需要加低通滤波器,外部计数大于65535要开中断。程序中毛病较多,给你改了。
- #include <reg51.h>
- sbit export1 = P1^0; //将单片机的P1^0端口设定为输出
- sbit key1 = P1^7; //定义P1^7口是按键key1
- unsigned char code table[]={//共阴数码管段码"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); //做一个计数器声明
- void key(); //按键声明
- void display_service();
- void DigDisplay_Service(); //数码管数值显示
- /*****************************************************
- 函数名: main
- 功 能:主函数
- 参 数:
- 返回值:
- *****************************************************/
- void main()
- {
- Timer0Init(); //做一个调用 定时功能去刷新数码管
- Timer1Init(); //做一个调用 计数功能去做一个计数
- EA = 1;//中断中开开关
- 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、中断服务函数一定是一个没有返回值的函数
- 2、中断服务函数一定是一个没有参数的函数
- 3、中断服务函数名称后面跟一个关键字interrupt
- 4、interrupt 0--4共计5个中断源 8*n +0003H
- 0003H INT0
- 000BH T0
- 0013H INT1
- 001BH T1
- 0023H ES
- 5、中断服务函数不能被主程序或者其他程序调用
- 6、N后面跟using m (0--3)工作寄存器组
- *****************************************/
- void Timer0Init(void)//1毫秒@12.000MHz
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x18; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- TF0 = 0; //清除TF0标志
- ET0 = 1; //定时器0的中断开关
- EA = 1; //中断开关
- TR0 = 1; //定时器0开始计时
- }
- void Timer1Init(void) //1毫秒@12.00MHz
- {
- TMOD &= 0x0F; //设置计数器模式
- TMOD |= 0x50; //设置计数器模式
- TL1 = 0; //设置计数器初值
- TH1 = 0; //设置计数器初值
- TF1 = 0; //清除TF1标志
- ET1 = 1; //定时器1的中断开关
- TR1 = 1; //打开计数器1开始计数
- }
- /*******************************************
- 1、中断服务函数一定是一个没有返回值的一个函数
- 2、中断服务函数是一个没有参数的函数
- 3、中断服务函数函数名称后面跟一个关键字interrupt
- 4、interrupt 0——4 共计5各中断源 8*n + 0003H
- 0003H INT0
- 000BH T0
- 0013H INT1
- 001BH T1
- 0023H ES
- 5、中断服务函数不能被主程序或者其他程序调用
- 6、n后面跟using m (0——3)工作寄存器组
- *******************************************/
- void time0_ISR(void) interrupt 1 //终端定时器0标号1
- {
- TL0 = 0x18; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- if(!export1)
- {
- num1++;
- if(num1>=1000)
- {
- num1=0;
- export1=1;
- }
- }
- DigDisplay_Service();
- }
- void time1_ISR(void) interrupt 3
- {
- num++;
- }
复制代码
|