51单片机的,有中断函数,没0.5s计数一次
然后用LED数码管显示的,做的很烂,分享一下原理图
单片机
LED数码管
LED
单片机源程序如下:
- #include"STC12C5a60s2.H"
- //------------------------
- //LED接口
- sbit D2 = P3^0;
- sbit D3 = P3^1;
- sbit D4 = P3^2;
- sbit D5 = P3^3;
- //数码管接口
- sbit COM1 = P1^3;
- sbit COM2 = P1^4;
- sbit COM3 = P1^5;
- sbit COM4 = P1^6;
- //变量定义
- unsigned char segTab [] = {0XA0,0XBB,0X62,0X2A,0X39,0X2C,0X24,0XBA,0X20,0X28};
- unsigned char segTab2 [] = {0X80,0X9B,0X42,0X0A,0X19,0X0C,0X04,0X9A,0X00,0X08};
- unsigned int to1s=0;
- unsigned int to2ms = 0;
- unsigned int number = 0;
- unsigned int segDisplayBit = 0;
- unsigned int i = 0;
-
- //==================================
- //主函数
- void main()
- { P1M1 &=~0X78;
- P1M0 |= 0X78;
-
- //定时器初始化 T0约为100uS
- TMOD = 0x02; //定时器T0,方式2(8位计数,自动重载)
- TH0 = 163; //11.0592M晶振,约100uS
- TL0 = TH0; //自动重载计数值,计数值存于TH0中,而用TL0计数
- TR0 = 1; //开定时器T0
- ET0 = 1; //开定时器中断
- EA = 1; //开总中断
-
-
-
- while(1) //无限循环体
- {
-
- }
- }
- //==================
- //定时器中断函数
- void Timer0_ISR(void) interrupt 1 using 1
- { to2ms++;
- if(to2ms == 20)
- { to2ms = 0;
-
- segDisplayBit++;
- if(segDisplayBit>4) segDisplayBit = 1;
-
- if(segDisplayBit==1) //千位
- { COM1=0; COM2=0; COM3=0; COM4=0;
- P0 = segTab[number/1000];
- if(number/1000!=0)COM1=1;}
-
- if(segDisplayBit==2) //百位
- { COM1=0; COM2=0; COM3=0; COM4=0;
- P0 = segTab[number%1000/100]&0xDF;
- COM2=1;}
-
- if(segDisplayBit==3) //十位
- { COM1=0; COM2=0; COM3=0; COM4=0;
- P0 = segTab[number%100/10];
- COM3=1;}
-
- if(segDisplayBit==4) //个位
- { COM1=0; COM2=0; COM3=0; COM4=0;
- P0 = segTab[number%10];
- COM4=1;}
- to1s++;
- if(to1s == 50)
- { to1s=0;
- number++;
- if(number==9999)number=0;
- }
- }
- i++;
- if(i==1000)
- {
- D5=0;D4=1;D3=1;D2=1; }
- if(i==2000)
- { D5=1;D4=0;D3=1;D2=1;}
-
- if(i==3000)
- {D5=1;D4=1;D3=0;D2=1;}
- if(i==4000)
- { i=0; D5=1;D4=1;D3=1;D2=0;}
- }
复制代码
所有资料51hei提供下载:
定时中断0-9999程序.zip
(26.93 KB, 下载次数: 18)
|