6.简易电子钟数码管动态扫描(使用定时器)有调时功能
2019-04-15 16:43发布
生成海报
- /*
- ***********************************************************************************************
- * Cool51
- * 51开发板例程
- *
- *
- * 文件名称:“main.c”
- * 摘 要:电子表
- * 作 者:Rays_ele
- *
- * 当前版本:1.0
- * 完成日期:2011/04/27
- * 版权所有:Rays - Copyright (C) 2011
- *
- ***********************************************************************************************
- */
- /*包含必要的头文件*/
- #include<reg52.h>//开发51单片机必须包含51单片机的头文件,该文件定义了51单片机内部寄存器的地址
- /*常用宏定义*/
- #define uchar unsigned char
- #define uint unsigned int
- /*程序接口定义*/
- //数码管的段码在原理图上已经和P0口相接,即P0.0对应数码管的a段,P0.1对于b段,依此类推,简单表示如下
- #define LED P0
- //LED_a-------P0.0
- //LED_b-------P0.1
- //LED_c-------P0.2
- //LED_d-------P0.3
- //LED_e-------P0.4
- //LED_f-------P0.5
- //LED_g-------P0.6
- //LED_s-------P0.7
- //下面是数码管的位定义,也就是数码管的公共端,具体电路讲解见Cool51原理图,该引脚为低电平即选通该位数码管
- sbit LED_1=P2^0;//LED_1-------P2.0
- sbit LED_2=P2^1;//LED_2-------P2.1
- sbit LED_3=P2^2;//LED_3-------P2.2
- sbit LED_4=P2^3;//LED_4-------P2.3
- //定义一个key 用来切换显示状态
- sbit key=P2^7;
- //定义两个,一个调节小时,一个调节分钟
- sbit Hour_adjust=P2^5;
- sbit Minute_adjust=P2^4;
- /*全局变量定义部分*/
- unsigned char code LED_Code[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};//共阳码
- // 0 1 2 3 4 5 6 7 8 9 灭 -
- unsigned char Hour,Minute,Second,Clock_Dot; //分别定义小时,分,秒,闪点
- uchar status=0; //定义一个变量代表状态,为0则显示分和秒,为1则显示时和分
- /*
- +---------------------------------------------------------------------------------------+
- |函数名称: Delay_ms |
- |---------------------------------------------------------------------------------------|
- |函数原型: void Delay_ms(uint ms) |
- |函数功能: 普通延时函数 |
- |入口参数: 延时时间,单位毫秒 |
- +---------------------------------------------------------------------------------------+
- */
- void Delay_ms(uint ms)
- {
- uchar t;
- while(ms--)
- {
- t=120;
- while(t--);
- }
- }
- /*
- +---------------------------------------------------------------------------------------+
- |函数名称: ShuMaGuan |
- |---------------------------------------------------------------------------------------|
- |函数原型: void ShuMaGuan(uint dat) |
- |函数功能: 数码管扫描显示程序,随意显示一个9999以内数据大小 |
- |入口参数: 要显示的0000-9999之间的数据,数据是多少,就显示多少 |
- +---------------------------------------------------------------------------------------+
- */
- void ShuMaGuan(uchar h,uchar l,uchar dot)
- {
- LED=LED_Code[h/10];//将dat的千位取出来,用千位数来索引LED_Code的对应段码,再将段码送到对应段码口上
- LED_1=0; //段码送出去后,再选通千位数码管的公共端,此时对应千位数码管会显示
- Delay_ms(3); //将显示延时一段时间,视觉暂留
- LED_1=1;
- LED=LED_Code[h%10];
- if(dot) //如果dot为真,则表的中间两个点显示,假则不显示
- LED&=0x7f;
- LED_2=0;
- Delay_ms(3);
- LED_2=1;
- LED=LED_Code[l/10];
- LED_3=0;
- Delay_ms(3);
- LED_3=1;
- LED=LED_Code[l%10];
- LED_4=0;
- Delay_ms(3);
- LED_4=1;
- }
- /*
- +---------------------------------------------------------------------------------------+
- |函数名称: main |
- |---------------------------------------------------------------------------------------|
- |函数原型: void main(void) |
- |函数功能: 数码管扫描显示程序,随意显示一个9999以内数据大小 |
- |入口参数: 无 |
- +---------------------------------------------------------------------------------------+
- */
- void main(void)
- {
- EA = 1; //允许CPU中断
- ET0 = 1; //定时器0中断打开
- TMOD = 0x1; //设定时器0为模式1,16位模式
- TH0=0x4c;
- TL0=0x00; //11.0592 溢出时间50000us=50ms
- TR0 = 1; //启动定时器
- Clock_Dot=0; //时钟刚开始秒点不亮
- status=1; //默认显示分和秒
- /**/
- while(1)
- {
- if(status==1)
- ShuMaGuan(Minute,Second,Clock_Dot);
- if(status==0)
- ShuMaGuan(Hour,Minute,0);
- //扫描一个按键程序,按键用来切换显示状态
- if(key==0) //如果有按键按下
- {
- while(key==0);
- status=!status;
- }
- //调时程序
- if(Hour_adjust==0)
- {
- if(Hour++==23)
- Hour=0;
- while(Hour_adjust==0);
- }
- if(Minute_adjust==0)
- {
- if(Minute++==59)
- Minute=0;
- while(Minute_adjust==0);
- }
- }
- }
- //定时器0中断外理中调用数码管显示程序
- /*
- +---------------------------------------------------------------------------------------+
- |函数名称
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮