仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- void T0_init();
- unsigned char code table[]={0xC0,0XF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- unsigned char dat_T=0,aa;
- unsigned int counter=0;
- unsigned char dat_Q=0;
- void delay(unsigned int time)
- {
- unsigned int i,j;
- for(i=0;i<time;i++)
- for(j=0;j<120;j++)
- ;
- }
- void display1()
- {
- P2=0x01;
- P1=table[dat_T/10];
- delay(10);
- P2=0x02;
- P1=table[dat_T%10];
- delay(10);
-
- P2=0x04;
- P1=table[dat_Q/10];
- delay(10);
- P2=0x08;
- P1=table[dat_Q%10];
- delay(10);
- }
- void calspeed()
- {
- if(aa>=20) //20*50ms=1s计算一次 or aa==20
- {
- dat_T=counter;
- counter=0;//清零脉冲数
- aa=0; //清零标志
- }
- }
- main()
- {
- EA = 1; //开总中断
- EX0=1; //外部中断0
- IT0=1; //下降沿方式 触发方式
- TMOD = 0x01; //定时器0 工作方式一
- TH0= (65536 - 50000)/256; //定时50ms
- TL0= (65536 - 50000)%256;
- ET0 = 0; //定时器开关
- TR0 = 1;
- while(1)
- {
- display1();
- calspeed();
- }
-
- }
- void T0_init() interrupt 1 //定时器中断0
- {
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- aa++;
- }
- void int0() interrupt 0 //外部中断0
- {
- dat_T++;
- if(dat_T>11)
- {
- dat_Q++;
- dat_T=0;
- }
- }
复制代码
|