初学51单片机(STC89C52)一个倒计时显示器和大家分享 |
您所在的位置:网站首页 › 十五分钟加十四分钟开始计时吗 › 初学51单片机(STC89C52)一个倒计时显示器和大家分享 |
想要实现倒计时显示器,首先得确定从哪个时间开始倒计时,这就需要写出一个计数的程序来,通过按键来控制需要的数,从而开始倒计时。我的开发板上用的Key2,Key3,Key4,Key5这四个键,分别对应着加1,减1,乘2,开始计时四个功能。 通过加一,减一,乘2三个操作,可以较快地得到想要设置的数。然后将所得到的数显示在数码管上(我这里使用的是共阴数码管)。这样就可以实时地看到自己所设置的数,然后就可以开始计时了。 具体实现步骤: 1.定义所用到的端口 2.定义一个数组,里面装0~9这十个数(用于后边的数码管显示,所以需要转化为对应的段选),例如0,就写成0X3F 3.写一个计数的程序,通过按键实现计数,并且在按下时数码管同步显示。 4.写一个计时的程序。(用时钟) 4.打开时钟中断,开始计时,运行计时程序。 5,打开蜂鸣器,提示计时结束。 以下为源代码: #include /****************************************** 程序作用:倒计时显示器 实现步骤:1.输入数字 2.开始倒计时 3.蜂鸣器响1s提示计时结束 *******************************************/ sbit Key2=P3^4; sbit Key3=P3^5; sbit Key4=P3^6; sbit Key5=P3^7;//定义按键端口 sbit wei1=P2^4; sbit wei2=P2^5; sbit wei3=P2^6; sbit wei4=P2^7;//定义数码管端口 sbit bing=P2^3;//定义蜂鸣器端口 /********************定义数组******************/ int base[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /********************定义数组******************/ /********************定义全局变量******************/ int num; int time=0; int time_1s=0; int qian;//千位数字 int bai;//百位数字 int shi;//十位数字 int ge;//个位数字 /********************定义全局变量******************/ void xianshi(); void Time_begin(); int num_scp(int num); int delay(int x);//函数声明 void main() { num=0; /*************初始化端口*************/ wei1=0;//第一位数码管 wei2=0;//第二位数码管 wei3=0;//第三位数码管 wei4=0;//第四位数码管 Key2=1;//加一开关 Key3=1;//减一开关 Key4=1;//乘二开关 Key5=1;//计时开关 /*************初始化端口*************/ while(1){ Key2=1;//加一开关 Key3=1;//减一开关 Key4=1;//乘2开关 Key5=1;//开始计时 if(Key2==0) { delay(10); while(Key2==1){num++;break;} }//按下Key2键 时间加1s if(Key3==0) { delay(10); while(Key3==1){num--;break;} }//按下Key3键 时间减1s if(Key4==0) { delay(10); while(Key4==1){num=num*2;break;} }//按下Key4键 时间乘2 if(Key5==0) { delay(10); while(Key5==1) { Time_begin(); while(1) { num_scp(time_1s); xianshi(); if(time_1s==1){bing=0;delay(1000);bing=1;} } } } //按下Key5键 开始计时 while(1) { num_scp(num); xianshi(); if(Key2==0||Key3==0||Key4==0||Key5==0){break;} }//显示设置的时间 } } /***************************** 定义函数num_scp sc代表scanf;p代表put 函数作用:扫描数据并进行拆分 参数列表:x *******************************/ int num_scp(int x) { qian=(x/1000)%10;//千位数字 bai=(x/100)%10;//百位数字 shi=(x/10)%10;//十位数字 ge=x%10;//个位数字 return 0; } /***************************** 定义函数delay 函数作用:延时x_ms 参数列表:x *******************************/ int delay(int x) { unsigned int time; time=9206*x-2; while(time--); return 0;//较粗略的延时函数,主要用于按键消抖,不可用于计时 } /***************************** 定义函数Timer0 函数作用:定时计数 参数列表:time time_1s *******************************/ void Timer0() interrupt 1 using 1//准确的时钟,可用于计时 { TH0=0x4c;//定时器0装初值 定时50ms TH1=0x00; time++; if(time>=20) { if(time_1s==0){time_1s=num+1;} time_1s--; time=0; } } /***************************** 定义函数Time_begin 函数作用:开启定时计数器 参数列表: *******************************/ void Time_begin(){ TMOD &=0xf0;//低四位全部置0 设置定时器0 方式1 TMOD |=0x01;//最低位置1 TH0=0x4c;//定时器0装初值 定时50ms TH1=0x00; TR0=1;//定时器0 启动计数 ET0=1;//打开ET0 中断允许位 EA=1;//打开总中断 } /***************************** 定义函数显示 函数作用:数码管显示 参数列表:qian bai shi ge *******************************/ void xianshi(){ P0=0x00; P0=base[qian]; wei1=1; wei1=0; P0=base[bai]; wei2=1; wei2=0; P0=base[shi]; wei3=1; wei3=0; P0=base[ge]; wei4=1; wei4=0;//显示具体数字 } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |