C51定时器和计数器数码管
- 开发板:普中51—单核-A2
- 开发环境:Keil5
- 参考资料:普中51单片机开发攻略、开发板原理图
- 如有错误,感谢指正。若如侵权请联系博主
60秒倒计时计数器(精确到秒)
任务:使用动态数码管的后两个设计一个倒计时计数器,初始状态为60秒,按下K3启动倒计时,再次按下K3暂停,按第三下K3接着继续计时,按K4重新置为60秒的初始状态,暂停的时候,5管显示0。
#include<reg51.h>
/*start=0 暂停
start=1 启动
stop=1 重置
*/
unsigned char num,nums=0;start=0,stop=1,i=6,j=0; //num计时所用,start暂停所用,stop重置所用,i为个位,j为十位
char LED[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9LED灯的显示
sbit K3 = P3^2;
sbit K4 = P3^3;
sbit A0 = P2^2; //INT0\1\2为74HC138译码器的输入端
sbit A1 = P2^3;
sbit A2 = P2^4;
void delay(int h){
int i,j;
for(i=h;i>0;i--)
for(j=120;j>0;j--);
}
void T0_time() interrupt 1 //定时器中断,用于计时
{
TH0 = (65536-45872)/256; //重装初值
TL0 = (65536-45872)%256; //重装初值
if(start==1) num++; //num=20为1秒
if(num==20){
nums = 1;
num = 0;
}
}
void Int0() interrupt 0 //外部中断0,用于控制倒计时启动、暂停
{
stop = 0;
start++; //用于暂停标志,start=0为暂停
if(start == 2) start = 0;
}
void Int1() interrupt 2
{
stop = 1; //stop=1重置为60秒
}
void main(){
IE=0X87; //1000 0111,开启EA,EX0,EX1,ET01
IT0=1;
IT1=1; //下降沿触发方式
TR0 = 1;
TMOD=0X01; //T0选择方式1工作模式
K3 = 1;
K4 = 1;
while(1){
while(stop==1){ //
A0=0;A1=0;A2 = 0;
P0 = LED[0];delay(1);
A0=1;A1=0;A2 = 0;
P0 = LED[6];delay(1);
i = 6;
j = 0;
}
if(nums==1){
if(j==0){
if(i!=0){
i--;
j = 9;}
}else j--;
nums = 0;
}
A0=0;A1=0;A2 = 0;
P0 = LED[j];delay(1);
A0=1;A1=0;A2 = 0;
P0 = LED[i];delay(1);
if(start==0){
A0=1;A1=1;A2 = 0;
P0 = LED[0];delay(1);
}
}
}