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小时内删除。
发表评论