51单片机时钟(闹钟)

您所在的位置:网站首页 52单片机电子时钟 51单片机时钟(闹钟)

51单片机时钟(闹钟)

2023-11-14 15:02| 来源: 网络整理| 查看: 265

题目要求

用按键设定时钟的时、分、秒。要求用4键方式,即选择、加、减、确认键,选择键用于选择修改起始时、分、秒值,每按一次,被修改数码管顺序移动并闪烁。用+,- 键修改数值,确认键确定修改结束。 用扫描方式动态显示时、分、秒,第2,4 数码管加小数点,并且要求第4数码管小数点每秒闪烁一次。 可以设置闹钟,到时间蜂鸣器报警。

功能

数码管闪烁,定时器,闹钟

源码 #include "reg52.h" //单片机寄存器 typedef unsigned int u16; //重命名无符号整形变量 typedef unsigned char u8; //重命名无符号字符型变量 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit k1=P3^1; sbit k2=P3^0; sbit k3=P3^2; sbit k4=P3^3; sbit beep=P2^5; u8 code lzl[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F u8 wei[8]; u8 ssec,sec,min,hour; u8 model=0; //记录修改状态变量 u8 sign=0; //数码管闪烁标志变量 u8 sec1=50; //闹钟时间设定 u8 min1=12; u8 hour1=6; /****************************** * 延时函数 *******************************/ void delay(u16 i) { while(i--); } /****************************** * 定时器0初始化函数 *******************************/ void Time0_Init() { TMOD|=0x01; //选择定时器模式,工作方式1 TH0=0xd8; //给定时器赋初值,定时10ms TL0=0xf0; ET0=1; //打开定时器0中断 EA=1; //打开总中断 TR0=1; //暂时关闭定时器 } /****************************** * 动态显示函数 *******************************/ void display() { u8 i; for(i=0;i case(0): LSA=1;LSB=1;LSC=1; break; case(1): LSA=0;LSB=1;LSC=1; break; case(2): LSA=1;LSB=0;LSC=1; break; case(3): LSA=0;LSB=0;LSC=1; break; case(4): LSA=1;LSB=1;LSC=0; break; case(5): LSA=0;LSB=1;LSC=0; break; case(6): LSA=1;LSB=0;LSC=0; break; case(7): LSA=0;LSB=0;LSC=0; break; } P0=wei[i]; //发送段码 delay(100); //间隔一段时间扫描 P0=0x00; } } /****************************** * 记录数码管显示 *******************************/ void show() { switch(model) { case 0: { wei[2]=lzl[hour/10]; if(sign%2==0) wei[3]=lzl[hour%10]|0x80; else wei[3]=lzl[hour%10]; wei[4]=lzl[min/10]; wei[5]=lzl[min%10]|0x80; wei[6]=lzl[sec/10]; wei[7]=lzl[sec%10]; break; } case 1: { if(sign%2==0) { wei[2]=lzl[hour/10]; if(sign%2==0) wei[3]=lzl[hour%10]|0x80; else wei[3]=lzl[hour%10]; wei[4]=lzl[min/10]; wei[5]=lzl[min%10]|0x80; wei[6]=0x00; wei[7]=0x00; } else { wei[2]=lzl[hour/10]; if(sign%2==0) wei[3]=lzl[hour%10]|0x80; else wei[3]=lzl[hour%10]; wei[4]=lzl[min/10]; wei[5]=lzl[min%10]|0x80; wei[6]=lzl[sec/10]; wei[7]=lzl[sec%10]; } break; } case 2: { if(sign%2==0) { wei[2]=lzl[hour/10]; if(sign%2==0) wei[3]=lzl[hour%10]|0x80; else wei[3]=lzl[hour%10]; wei[4]=0x00; wei[5]=0x00|0x80; wei[6]=lzl[sec/10]; wei[7]=lzl[sec%10]; } else { wei[2]=lzl[hour/10]; if(sign%2==0) wei[3]=lzl[hour%10]|0x80; else wei[3]=lzl[hour%10]; wei[4]=lzl[min/10]; wei[5]=lzl[min%10]|0x80; wei[6]=lzl[sec/10]; wei[7]=lzl[sec%10]; } } break; case 3: { if(sign%2==0) { wei[2]=0x00; if(sign%2==0) wei[3]=0x00|0x80; else wei[3]=0x00; wei[4]=lzl[min/10]; wei[5]=lzl[min%10]|0x80; wei[6]=lzl[sec/10]; wei[7]=lzl[sec%10]; } else { wei[2]=lzl[hour/10]; if(sign%2==0) wei[3]=lzl[hour%10]|0x80; else wei[3]=lzl[hour%10]; wei[4]=lzl[min/10]; wei[5]=lzl[min%10]|0x80; wei[6]=lzl[sec/10]; wei[7]=lzl[sec%10]; } break; } } } /****************************** * 按键扫描及处理 *******************************/ void key_scan() { if(k1==0) { delay(1000); if(k1==0) { model++; while(!k1); if(model==4) model=0; } } if(k2==0) { delay(1000); if(k2==0) { if(model==1) //修改秒 { sec++; if(sec>=60)sec=0; } else if(model==2) //修改分钟 { min++; if(min>=60)min=0; } else if(model==3) //修改小时 { hour++; if(hour>=24)hour=0; } while(!k2); } } if(k3==0) { delay(1000); if(k3==0) { if(model==1) //修改秒 { sec--; if(sec==255)sec=59; } else if(model==2) //修改分钟 { min--; if(min==255)min=59; } else if(model==3) //修改小时 { hour--; if(hour==255)hour=23; } while(!k3); } } if(k4==0) { delay(1000); if(k4==0) model=0; while(!k4); } } /****************************** * 闹钟以及蜂鸣器 *******************************/ void alarm() { if(hour==hour1 && min==min1 && sec==sec1) { while(1) { beep=~beep; delay(100); if(k4==0) break; } } } /****************************** * 主函数 *******************************/ void main() { Time0_Init(); // Time1_Init(); // Int0_Init(); while(1) { display(); show(); key_scan(); alarm(); } } /****************************** * 定时器0中断函数 *******************************/ void Time0() interrupt 1 { TH0=0Xd8; //赋初值,定时10ms TL0=0Xf0; ssec++; if(ssec>=100) //1s { ssec=0; sec++; sign++; if(sign>=100) sign=0; if(sec>=60) { sec=0; min++; if(min>=60) { min=0; hour++; if(hour>=25) hour=0; } } } }


【本文地址】


今日新闻


推荐新闻


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