基于51单片机的数码管闹钟设计

您所在的位置:网站首页 闹钟原理图含蜂鸣器报警 基于51单片机的数码管闹钟设计

基于51单片机的数码管闹钟设计

2023-08-24 23:27| 来源: 网络整理| 查看: 265

系统功能:利用定时器实现时钟,时钟可以通过独立按键设置,设有一个闹钟,闹钟时间可通过按键进行设置,时钟界面和闹钟界面可通过按键切换,当时钟和闹钟时间相同,蜂鸣器响,提示闹钟时间到等。

此系统重点在于:数码管动态驱动的使用方法,单片机内部定时器的配置及使用方法、显示屏显示界面的切换设置方法、独立按键的驱动方法、蜂鸣器的驱动方法、以及各个模块整合为完整系统的方法等

系统所需硬件:51单片机最小系统(包括STC89C52芯片、晶振、电容、电阻、独立按键、上拉电阻等)、八位共阳极数码管、LED、三极管、蜂鸣器、独立按键等。

系统软件编写:采用C语言和keil4软件编译

系统电路搭建:采用Proteus8.10软件搭建

系统仿真过程:时钟界面

闹钟界面: 

系统编写的程序:

#include #include #define uchar unsigned char #define uint unsigned int uchar dd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //数码管断码表 uchar shi=9,fen=59,miao=55; //时间初始值 uchar shi1=10,fen1=5,miao1=0;//闹钟初始值 uchar yi,er,san,si,wu,liu,qi,ba; uchar count=0;//计数变量 sbit led=P1^0; //LED端口 sbit buzz=P1^1;//蜂鸣器 sbit k1=P1^2; //模式切换 sbit k2=P1^3; //加 sbit k3=P1^4; //减 sbit k4=P1^5; //时间 时分秒切换 sbit k5=P1^6; //闹钟 时分秒切换 bit k1_flag=0; uchar k4_flag=0,k5_flag=0; void delay1ms() //@11.0592MHz { unsigned char i, j; _nop_(); _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); } //数码管显示时间 void display(uchar yi,uchar er,uchar san,uchar si,uchar wu,uchar liu,uchar qi,uchar ba) { P3=0x01; //位选 P2=dd[yi]; //段选 delay1ms(); P3=0x02; P2=dd[er]; delay1ms(); P3=0x04; //位选 P2=dd[san]; //段选 delay1ms(); P3=0x08; P2=dd[si]; delay1ms(); P3=0x10; //位选 P2=dd[wu]; //段选 delay1ms(); P3=0x20; P2=dd[liu]; delay1ms(); P3=0x40; //位选 P2=dd[qi]; //段选 delay1ms(); P3=0x80; P2=dd[ba]; delay1ms(); } void keys() { if(k1==0) { delay1ms(); if(k1==0) // { k1_flag=~k1_flag; if(k1_flag==0) {ET0=1;} }while(k1==0); } if(k2==0) { delay1ms(); if(k2==0) // { if(k4_flag==1) {shi++;if(shi==24){shi=0;}} if(k4_flag==2) {fen++;if(fen==60){fen=0;}} if(k4_flag==3) {miao++;if(miao==60){miao=0;}} if(k5_flag==1) {shi1++;if(shi1==24){shi1=0;}} if(k5_flag==2) {fen1++;if(fen1==60){fen1=0;}} if(k5_flag==3) {miao1++;if(miao1==60){miao1=0;}} }while(k2==0); } if(k3==0) { delay1ms(); if(k3==0) // { if(k4_flag==1) {shi--;if(shi==-1){shi=23;}} if(k4_flag==2) {fen--;if(fen==-1){fen=59;}} if(k4_flag==3) {miao--;if(miao==-1){miao=59;}} if(k5_flag==1) {shi1--;if(shi1==-1){shi1=23;}} if(k5_flag==2) {fen1--;if(fen1==-1){fen1=59;}} if(k5_flag==3) {miao1--;if(miao1==-1){miao1=59;}} }while(k3==0); } if(k4==0) { delay1ms(); if(k4==0) // { ET0=0; if(k1_flag==0) { k4_flag++; if(k4_flag==4) {ET0=1;k4_flag=0;} } }while(k4==0); } if(k5==0) { delay1ms(); if(k5==0) // { ET0=0; if(k1_flag==1) { k5_flag++; if(k5_flag==4) {k5_flag=0;} } }while(k5==0); } } void Timer0Init(void) //100微秒@11.0592MHz { TMOD = 0x01; //设置定时器模式 TL0 =(65536-50000)%256; //设置定时初值 TH0 =(65536-50000)/256; //设置定时初值 TF0 = 1; //清除TF0标志 TR0 = 1; //定时器0开始计时 EA=1; ET0=1; } void serviceTimer0Init() interrupt 1 { TL0 =(65536-50000)%256; //设置定时初值 TH0 =(65536-50000)/256; count++; if(count==20) //20*50000=1秒 { count=0; miao++; } if(miao==60) // { miao=0;fen++; } if(fen==60) // { fen=0;shi++; } if(shi==24) {shi=0;} if((shi==shi1)&&(fen==fen1)&&(miao==miao1)) { led=~led;buzz=0; } else { buzz=1;led=0; } } //主函数 void main() { yi=1,er=2,san=3,si=4, wu=5,liu=6,qi=7,ba=8; Timer0Init(); led=0;buzz=1; while(1) { if(k1_flag==0) { yi=shi/10,er=shi%10,san=10,si=fen/10, wu=fen%10,liu=10,qi=miao/10,ba=miao%10; } else if(k1_flag==1) { yi=shi1/10,er=shi1%10,san=10,si=fen1/10, wu=fen1%10,liu=10,qi=miao1/10,ba=miao1%10; } keys(); display(yi,er,san,si,wu,liu,qi,ba); } }

 下载链接:

(注意:若软件版本低于设计版本,则打不开图和程序)

链接:https://pan.baidu.com/s/1b8Pdt-RdxpJsRRiY-ARh7Q?pwd=na7e  提取码:na7e 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3