用51单片机的定时器,按键实现两位数码管加减仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- sbit S1=P2^0; //第一个数码管
- sbit S2=P2^1; //第二个数码管
- sbit PWM=P2^2;
-
- uchar t,i; //定义周期 占空比
- uchar m; //扫描次数
- uchar code seg[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
- }; //0 1 2 3 4 5 6 7 8 9 */
-
- void InitTimer0() //定时器0中断初始化子函数
- {
- TMOD = 0x01; //设置T0为工作方式1 16位
- TH0 = (65536-200)/256;
- TL0 = (65536-200)%256;
- EA = 1; //允许总中断标志位
- ET0 = 1; //定时器0中断
- TR0 = 1; //启动定时器0
- EX0=1; //打开外部中断0
- EX1=1; //打开外部中断1
- IT0=1; //下降沿触发
- IT1=1; //下降沿触发
- }
- void display(void) //数码管显示占空比子函数
- {
- P0 =0;
- S1 =1;
- S2 =1; //Seg全输出低,Com全输出高,灭掉显示
- switch(m)
- {
- case 0:
- m++;
-
- P0=seg[i/10]; //数码管显示第一位数
- S1=0;
- break;
- case 1:
- m=0;
- P0=seg[i%10]; //数码管显示第二位数
- S2=0;
- break;
- default:
- break;
- }
- }
- void main() //主函数入口
- {
- InitTimer0();
- while(1); //无限循环
- }
- void Timer0Interrupt(void) interrupt 1 //定时器中断0
- {
- TH0 = (65536-200)/256; //重装初值
- TL0 = (65536-200)%256;
-
- if(++t>=99)
- {
- t=0;
- }
- if(t>i)
- {
- PWM =0;
- }
- else
- {
- PWM =1;
- }
- display();
- }
-
- void Timer1Interrupt(void) interrupt 0 //外部中断0中断服务函数
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
定时器按键控制数码管加减.zip
(60.41 KB, 下载次数: 96)
|