51单片机LCD1602定时器时钟实现年月日时分秒显示
51单⽚机LCD1602定时器时钟实现年⽉⽇时分秒显⽰
实现功能:利⽤51单⽚机的定时器原理制作时钟,显⽰使⽤LCD1602,可以显⽰时分秒年⽉⽇和星期 ,识别平年闰年,按键可调整时间⽇期,整点报时。
1、定时器中断实现时钟基本原理
若系统晶振为12MHZ,定时器⼯作在mode1模式时,每次最多可计数⾄65536,花费时间约为65ms。若只计数⾄50000,需要时间50ms,实现1s的定时需要重复上述过程20次。如此就利⽤
定时器实现了⼀秒钟的产⽣。我们仅需对定时器赋初值TH0=(65536-50000)/256;TL0=(65536-50000)%256;代码段如下
TH0 = 0x4c;  //⾼⼋位赋初值晶振位11.0592,赋初值位0x4c00
TL0 = 0x00;  //低⼋位赋初值
i++;
if(i == 20){
伏天2020时间表多少天
i = 0;  //满⼀秒清零
miao++; //i = 100 为⼀,秒标志位加 1
if(miao == 60){
miao = 0;  //满⼀分清零
fen++;
if(fen == 60){
fen = 0;  //满⼀时清零
四级考试时间分配及分值分配shi++;
mybeeplongplus();  //整点报时
if(shi == 24){
shi = 0;  //24⼩时制
fen = 0;
miao = 0;
2、LCD1602基本原理介绍
关于lcd1602的介绍⽹上资源实在太多可以参考这位博主的⽂章。他讲解的挺详细的,其中有关于LCD1602⾃定义字符的介绍与使⽤,我在这⾥推荐⼀款字符取模软件zimo221,百度直接可以搜索下载。
3、C语⾔如何利⽤数组存储“变量”
c语⾔的数组时不能够直接储存变量的,但是却可以储存变量的地址,再利⽤指针来间接储存变量。此处引⽤。
4、protues仿真图
此处未添加蜂鸣器,需要的可以直接接在P1^5⼝。
5、完整程序代码
main.c⽂件
//设计思路 1、利⽤定时器中断0⼆⼗次产⽣1s时间变量miao增加到60变量分+1并把miao清零,shi同理
//        2、采⽤4个按键长按key4进⼊设置模式后, key1选择调整对象 key2k3加减
//
番茄是水果还是蔬菜#include"LCD1602.h"
#include<reg52.h>
void LCD_display(void);
void keykan(void);
int num[10]={0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};  // lcd1602 0~9字码
uchar miao=0, fen=0, shi=0 , zhou=1 , yue=7 , nian=21 ;  //进位标志位秒分时周⽉年
uchar ri=9;                                              //进位标志位⽇不知道为啥放在上⾯会报错,单独定义就可以
uint i=0;      //定时器计时标志位
uchar *time[]={&miao , &fen , &shi, &zhou ,&ri ,&yue , &nian};  //指针变量time存放进位标志位的地址,由于数组不能存放标量,但是却可以存放标量的地址,采⽤指针                                                                //
uchar  SetPlace=0;    //功能选择标志
bit mod =0;            //设置模式标志位
sbit key1=P3^1;        //定义四个按键 key1选择需要调整的位
sbit key2=P3^0;        //key2加
sbit key3=P3^2;        //key3减
sbit key4=P3^3;        //长按两秒钟进⼊或退出设置模式,前⾯三个按键需要进⼊设置模式才能使⽤
void main(void)
{
T0_init();  //定时器初始化
LCD_init();  //lcd1602初始化
IT1=1;      //外部中断1初始化下降沿触发
EX1=1;      //启⽤外部中断1
LCD_disp_char(2,5,0x00);        //显⽰⾃定义字符“周”
delay(50);
while(1)    //死循环
{
keykan();
LCD_display();    //lcd1602显⽰时分秒年⽉⽇周
}
}
void keykan(void)
{
if (mod==0)                    //如果没有进⼊设置模式调整提⽰区域显⽰字符串time
{
LCD_row(2);
LCD_DispString("TIME");
delay(50);
}
LCD_disp_char(1,14,' ');        //清空第⼀⾏第15位的显⽰内容
delay(50);
if (mod==1)                    //如果进⼊设置模式显⽰⼀个1602字符库的⼀个特定字符
{
LCD_disp_char(1,14,0xef);
delay(50);
if(key1==0)  //检测按键key1是否按下
{
delay(10); //消除抖动
if(key1==0)
{                            //按⼀下功能选择位就+1,加到7就清零
SetPlace++;
if(SetPlace>=7)
SetPlace=0;
}
if (SetPlace==0)              //功能选择位为0就显⽰“miao”  为1就显⽰“fen” 以此类推,shi zhou ri yue nian                {全球童装品牌排行榜
LCD_row(2);
LCD_DispString("miao");
delay(50);
}
if (SetPlace==1)
{
LCD_row(2);
LCD_DispString(" fen");
delay(50);
}
if (SetPlace==2)
{
LCD_row(2);
LCD_DispString(" shi");
delay(50);
}
if (SetPlace==3)
{
LCD_row(2);
LCD_DispString("zhou");
delay(50);
}
if (SetPlace==4)
{
LCD_row(2);
LCD_DispString("  ri");
delay(50);
}
if (SetPlace==5)
{
LCD_row(2);
LCD_DispString(" yue");
delay(50);
}
if (SetPlace==6)
{
LCD_row(2);
LCD_DispString("nian");
delay(50);
}
mybeep();                  //蜂鸣器发声
while(key1==0)  //检测按键是否松开
{
delay(10);
}
}
if(key2==0)  //检测按键key2是否按下
{
delay(10); //消除抖动
if(key2==0)
(*time[SetPlace])++;                            //按键按⼀次指针数组*time[SetPlace]⾥对应的地址的数据值就
+1,也就是说进位标志位年⽉⽇时分秒的值就会+1                    if ((((*time[SetPlace]))>=60) && (SetPlace==0))
半年工作总结结尾{
(*time[SetPlace])=0;                            //秒只能加dao59
}
if ((((*time[SetPlace]))>=60) && (SetPlace==1))
{
(*time[SetPlace])=0;                            //分只能加到59
}
if ((((*time[SetPlace]))>=24) && (SetPlace==2))
{
(*time[SetPlace])=0;                            //时只能加到23
}
if ((((*time[SetPlace]))>=8) && (SetPlace==3))      //周只能加到7
{
(*time[SetPlace])=1;
}
if ((((*time[SetPlace]))>=29) && (SetPlace==4) && (yue==2) && ((nian%4)!=0))
{                                                                                  //平年的2⽉只能加到28
(*time[SetPlace])=1;
}
if ((((*time[SetPlace]))>=30) && (SetPlace==4) && (yue==2) && ((nian%4)==0))            //闰年的2⽉29天
{
(*time[SetPlace])=1;
}
if ((((*time[SetPlace]))>=31) && (SetPlace==4) && ((yue==4)||(yue==6)||(yue==9)||(yue==11)))        //4 6 9 11 ⽉只有30天
{
(*time[SetPlace])=1;
}
if ((((*time[SetPlace]))>=32) && (SetPlace==4) && ((yue==1)||(yue==3)||(yue==5)||(yue==7)||(yue==8)||(yue==10)||(yue==12)))
{
(*time[SetPlace])=1;                                                                            //1 3 5 7 8 10 12⽉有31天
}
if ((((*time[SetPlace]))>=13) && (SetPlace==5))        //⽉份只能加到12
{
(*time[SetPlace])=1;
}
mybeep();    //蜂鸣器响
while(key2==0)  //检测按键是否松开
{
delay(10);龙五行属什么
}
}
}
if(key3==0)  //检测按键key3是否按下
{                                                  //key3与key2按钮基本原理相同,key3表⽰对应值减1
delay(10); //消除抖动
if(key3==0)
{
if ((((*time[SetPlace]))<=0) && (SetPlace==0))
{
(*time[SetPlace])=60;
}
if ((((*time[SetPlace]))<=0) && (SetPlace==1))
{
(*time[SetPlace])=60;
}
if ((((*time[SetPlace]))<=0) && (SetPlace==2))
{
(*time[SetPlace])=24;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。