51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)
首先展示硬件设计部分,此处采用proteus仿真演示。其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间。通过调节单刀双掷开关来改变正在调整的时间是实际时间还是闹钟时间。下面的三个按键依次用来调节模式(模式即正在调节的量是时、分或秒,通过最上面的三个LED灯来表达出来),下面的两个按键分别用来进行加减一的操作。
以上是硬件设计部分,下面展示软件部分代码。
1、变量及函数定义
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar data Set[4]={'S','e','t',':'};//初始显示
uchar data Rel[4]={'R','e','l',':'};//初始显示
uchar data rel_time[8]={'0','0','-','0','0','-','0','0'};//初始显示
uchar data set_time[8]={'0','3','-','0','5','-','0','0'};//初始显示
/*液晶的使能、读写端定义*/
sbit lcden=P2^2;
sbit lcdrs=P2^1;
sbit lcdrw=P2^0;
/*按键定义*/
sbit keymode=P2^7;
sbit keyadd=P2^6;
sbit keysub=P2^5;
sbit cho=P2^3;//开关定义
/*LED定义*/
sbit ledsec=P3^7;
sbit ledmin=P3^6;
sbit ledhour=P3^5;
sbit bee=P2^4;//蜂鸣器定义
uchar i=20;
uchar j;
uchar mode;
uchar choose;
uchar rel_sec=0,rel_min=0,rel_hour=0;
uchar set_sec=0,set_min=5,set_hour=3;
/*函数清单*/
void delay(uint x); //该延时大约100us
void baoshi(); //报时函数
void comp(); //闹钟函数,对实际值和设定闹钟值进行比较
void dis(); //显示函数
void Key(); //按键函数
/*液晶显示有关函数*/
void LCDdelay(uint x);//LCD延时函数
void write_com(uchar lcdcom);//写命令
void write_data(uchar lcddate);//写数据
void Init1602();//
2、与液晶显示有关的各种函数
void LCDdelay(uint x) //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{
uchar j;
while(x--)
for(j=0;j<120;j++);
}
//写命令
void write_com(uchar lcdcom)
{
lcdrs=0;
lcdrw=0;
P1=lcdcom;
LCDdelay(5);
lcden=1;
LCDdelay(5);
lcden=0;
}
//写数据
void write_data(uchar lcddate)
{
lcdrs=1;
lcdrw=0;
P1=lcddate;
LCDdelay(5);
lcden=1;
LCDdelay(5);
lcden=0;
}
//1602初始化
void Init1602()
{
lcden=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
write_com(0x80+2);
for(j=0;j<4;j++){
write_data(Rel[j]);
LCDdelay(5);
}
write_com(0x80+0x40+2);
for(j=0;j<4;j++){
write_data(Set[j]);
LCDdelay(5);
}
write_com(0x80+6);
for(j=0;j<8;j++){
write_data(rel_time[j]);
LCDdelay(5);
}
write_com(0x80+0x40+6);
for(j=0;j<8;j++){
write_data(set_time[j]);
LCDdelay(5);
}
}
3、其他各定时、调节等函数(电子钟功能实现)
/*定时1s*/
void timer0()interrupt 1
{
TH0=15536/256;
TL0=15536%256;
i--;
if(i==0){
i=20;
rel_sec++;
if(rel_sec==60){
rel_sec=0;
rel_min++;
if(rel_min==60)
{
rel_min=0;
rel_hour++;
if(rel_hour==24){
rel_hour=0;
}
}
}
Key();
comp();
baoshi();
dis();
}
}
void dis(){
rel_time[0]=rel_hour/10;
rel_time[1]=rel_hour%10;
rel_time[2]='-'-0x30;
rel_time[3]=rel_min/10;
rel_time[4]=rel_min%10;
rel_time[5]='-'-0x30;
rel_time[6]=rel_sec/10;
rel_time[7]=rel_sec%10;
set_time[0]=set_hour/10;
set_time[1]=set_hour%10;
set_time[2]='-'-0x30;
set_time[3]=set_min/10;
set_time[4]=set_min%10;
set_time[5]='-'-0x30;
set_time[6]=set_sec/10;
set_time[7]=set_sec%10;
write_com(0x80+6);
for(j=0;j<8;j++){
write_data(rel_time[j]+0x30);
LCDdelay(5);
}
write_com(0x80+0x40+6);
for(j=0;j<8;j++){
write_data(set_time[j]+0x30);
LCDdelay(5);
}
}
void Key(){
if(keymode==0){
mode++;
if(mode==4)
mode=1;
}
if(mode==1){
ledsec=1;
ledmin=0;
ledhour=0;
}
if(mode==2){
ledsec=0;
ledmin=1;
ledhour=0;
}
if(mode==3){
ledsec=0;
ledmin=0;
ledhour=1;
}
if(cho==0){
choose=0;
}
else{
choose=1;
}
if(keyadd==0){
if(mode==1){
if(choose==0){
rel_sec++;
if(rel_sec==60){
rel_sec=0;
}
}
else{
set_sec++;
if(set_sec==60){
set_sec=0;
}
}
}
else if(mode==2){
if(choose==0){
rel_min++;
if(rel_min==60){
rel_min=0;
}
}
else{
set_min++;
if(set_min==60){
set_min=0;
}
}
}
if(mode==3){
if(choose==0){
rel_hour++;
if(rel_hour==24){
rel_hour=0;
}
}
else{
set_hour++;
if(set_hour==24){
set_hour=0;
}
}
}
}
if(keysub==0){
if(mode==1){
if(choose==0){
if(rel_sec==0){
rel_sec=59;
}
else
rel_sec--;
}
else{
if(set_sec==0){
set_sec=59;
}
else
set_sec--;
}
}
else if(mode==2){
if(choose==0){
if(rel_min==0){
rel_min=59;
}
else
rel_min--;
}
else{
if(set_min==0){
set_min=59;
}
else
set_min--;
}
}
if(mode==3){
if(choose==0){
if(rel_hour==0){
rel_hour=23;
}
else
rel_hour--;
}
else{
if(set_hour==0){
set_hour=23;
}
else
set_hour--;
}
}
}
}
void delay(uint x) //该延时大约100us
{
uchar j;
while(x--)
for(j=0;j<120;j++);
}
void baoshi(){
if(rel_min==0&&rel_sec==1){
bee=1;
delay(500);
bee=0;
}
}
void comp(){
if(rel_hour==set_hour&&rel_min==set_min&&rel_sec==set_sec+1)
{bee=1;
delay(1000);
bee=0;}
}
4、主函数文章来源:https://www.toymoban.com/news/detail-504396.html
void main() {
cho=0;
bee=0;
ledsec=0;
ledmin=0;
ledhour=0;
mode=1;
keymode=1;
keyadd=1;
Init1602();
TMOD=0X01;
TH0=15536/256;
TL0=15536%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
基于以上,即可实现51单片机数字电子钟的设计,全部代码及仿真文件下载链接:https://download.csdn.net/download/creampang/85674151?spm=1001.2014.3001.5503文章来源地址https://www.toymoban.com/news/detail-504396.html
到了这里,关于51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!