基于51单片机LCD1602的简易数字钟
LCD1602简易数字钟
选用芯片:AT89S52
此函数功能为:用定时器的中断方式实现数字钟功能,然后在LCD1602上显示,能校时和校分,具有整点报时功能(四低一高)。
博主才疏学浅,可能会出现设计不足和错误,欢迎大家评论区交流。^ _ ^
/*******************************************************************
此函数功能为:用定时器的中断方式实现数字钟功能,然后在LCD1602上显示,能校时和校分,具有整点报时功能(四低一高)。
作者:Crazy Wind
日期:2020.10.10
version:1.0.0
********************************************************************/
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned intsbit RS=P2^0; //寄存器选择位RS为P2.0
sbit RW=P2^1; //读写选择位RW为P2.1
sbit E=P2^2; //使能信号位E为P2.2
sbit BF=P0^7; //忙碌标志位BF为P0.7
uint i,j;
uchar s=0; //秒
uchar m=0; //分
uchar h=0; //时
uint k=0;
uchar a;
sbit k1=P1^4; //校分按键
sbit k2=P1^5; //校时按键
sbit beep=P3^6; //蜂鸣器
uchar shuzi[9]; //存储秒分时转换成的对应的CGRAM字符(数组位数比实际位数多一位用来存放'\0')
uchar code bjtime[]={"BEIJING TIME"}; //自定义的一条字符
uchar code CGzifu[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20};//CGRAM中0~9和':'对应的字符码
/*****************************************************
函数功能:ms延时
******************************************************/
void delayms(uint ms) //毫秒延时
{for(i=0;i<ms;i++){for(j=115;j>0;j--);}
}
/*****************************************************
函数功能:打开定时器,使用中断方式
******************************************************/
void dsq(void) //定时器和中断
{TMOD=0x01; //定时器T0的模式1TH0=0x4C; //定时器T0的高8位赋初值 (11.0592MHz)TL0=0x00; //定时器T0的低8位赋初值TR0=1; //启动定时器T0EA=1; //开放总中断ET0=1; //允许使用定时器中断0
}
/*****************************************************
函数功能:定时器中断,秒分时进位
******************************************************/
void ms() interrupt 1 //50毫秒 进入此中断
{k++;TH0=0x4C; //重新赋初值TL0=0x00;if(k==20) //1秒{k=0;s++; if(s>59) //秒进位{s=0;m++;if(m>59) //分进位{m=0;h++;if(h>23){h=0;}}}}
}
/*****************************************************
函数功能:把秒分时的个位和十位分别转换成对应的CGRAM字符,
存在一个数组中。
******************************************************/
void shuxian(void)
{shuzi[7]=CGzifu[s%10]; //秒个位shuzi[6]=CGzifu[s/10]; //秒十位shuzi[5]=CGzifu[10];shuzi[4]=CGzifu[m%10]; //分个位shuzi[3]=CGzifu[m/10]; //分十位shuzi[2]=CGzifu[10];shuzi[1]=CGzifu[h%10]; //时个位shuzi[0]=CGzifu[h/10]; //时十位
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:busy。busy=1,忙碌;busy=0,不忙
******************************************************/
bit BusyTest(void)
{bit busy;RS=0; //RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作四个机器周期,给硬件反应时间_nop_();_nop_();_nop_();busy=BF; //将忙碌标志电平赋给mE=0;return busy; //将忙碌标志电平赋给m
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:z
******************************************************/
void Write_zl(uchar z)
{while(BusyTest()==1); //如果忙就等待RS=0; //RS和RW同时为低电平时,可以写入指令RW=0;E=0; //使能信号E置低电平(写指令前先赋低电平0)_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P0=z; //将数据送入P0口(数据总线line),即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //使能信号E上升沿(0到1)时读取信息_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //使能信号E下降沿(1到0)时执行指令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
******************************************************/
void WriteAddress(uchar x)
{Write_zl(x|0x80); //显示位置的确定方法规定为"地址码x+80H"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
******************************************************/
void WriteData(uchar y)
{while(BusyTest()==1); //如果忙就等待RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //使能信号E置低电平(写数据前先赋低电平0)_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P0=y; //将数据送入P0口(数据总线line),即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //使能信号E上升沿(0到1)时读取信息_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //使能信号E下降沿(1到0)时执行指令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
******************************************************/
void LcdInit(void)
{delayms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Write_zl(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delayms(5); //延时5ms Write_zl(0x38);delayms(5);Write_zl(0x38); //3次写 设置模式delayms(5);Write_zl(0x0c); //显示模式设置:显示开,无光标,光标不闪烁delayms(5);Write_zl(0x06); //显示模式设置:光标右移,字符不移delayms(5); Write_zl(0x01); //清屏幕指令,将以前的显示内容清除delayms(5);
}
/*****************************************************
函数功能:液晶屏显示
******************************************************/
void display(void)
{/**********在第一行写入**********/WriteAddress(0x02); //设置显示位置为第一行第3个delayms(5);a=0;while(bjtime[a]!='\0') //'\0'是数组结束标志{WriteData(bjtime[a]); //显示数组bjtime中字符a++; }/**********在第二行写入**********/WriteAddress(0x44); //设置显示位置为第二行第5个delayms(5);a=0;while(shuzi[a]!='\0') //'\0'是数组结束标志{WriteData(shuzi[a]); //显示数组shuzi,即显示时间a++; }
}
/*****************************************************
函数功能:校分
******************************************************/
void jiaofen(void) //校分
{if(k1==0){delayms(10); //消抖if(k1==0){m++;if(m>59){m=0;h++;if(h>23){h=0;}}while(!k1) //不松手走时{shuxian();display();}}}
}
/*****************************************************
函数功能:校时
******************************************************/
void jiaoshi(void) //校时
{ if(k2==0){delayms(10); //消抖if(k2==0){h++;if(h>23){h=0;}while(!k2) //不松手走时{shuxian();display();}}}
}
/*****************************************************
函数功能:高音蜂鸣器
******************************************************/
void speaker1() //蜂鸣器发声 高音
{beep=0; //500Hzdelayms(1);beep=1;delayms(1);
}
/*****************************************************
函数功能:低音蜂鸣器
******************************************************/
void speaker2() //蜂鸣器发声 低音
{beep=0; //250HZdelayms(2);beep=1;delayms(2);
}
/*****************************************************
函数功能:整点报时(四低一高)
******************************************************/
void baoshi() //整点报时
{ uchar r;if(k==0&&m==59&&s>55) //四低音(59分56——59秒时,每秒响一下低音)(k==0的时间为50ms){for(r=0;r<10;r++){speaker2();}}if(k==0&&m==0&&s==0) //一高音(整点时响高音){for(r=0;r<20;r++){speaker1();}}
}
void main(void) //主函数
{dsq();LcdInit(); //调用LCD初始化函数delayms(10);Write_zl(0x01); //清屏指令delayms(5);while(1){shuxian();jiaofen();jiaoshi();display();baoshi();}
}
基于51单片机LCD1602的简易数字钟相关推荐
- 基于51单片机LCD1602的简易矩阵键盘密码锁
写在前面 初次开始写博客,表达方面也许会有很多不足,希望自己能通过这种方式巩固自己的学习和锻炼表达能力,同时也是对于自己学习的记录. 一.功能介绍 四位密码锁,密码可更改,输入仅四次以内有效 矩阵键盘 ...
- 基于51单片机LCD1602显示
基于51单片机LCD1602显示 要在1602上显示字符,要大概明白1602液晶显示屏工作原理. 一般的液晶显示器(Liquid Crystal Display, LCD) 的主要原理是以电流刺激液晶 ...
- 51lcd显示光传感器c语言程序,基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例...
基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器.51单片机最小系统.1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的.1 ...
- 基于51单片机LCD1602电子时钟实物制作
之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...
- 多功能数字钟c语言单片机PPT,基于STC89C52单片机的多功能数字钟的设计
2010年第35期.本刊重稿.科技信囊 基于STC89C52单片机的多功能数字钟的设计 张开碧王浩曾勇斌 (重庆邮电大学自动化学院中国重庆400065) I摘要]本文主要介绍了数字钟的功能以及相应的硬 ...
- 单片机多功能电子琴课设_基于51单片机设计的简易电子琴
基于51单片机设计的简易电子琴 下面直接给出proteus仿真电路 代码如下:#include #define uint unsigned int #define uchar unsigned cha ...
- 《电子DIY》之《单片机实践项目》之基于51单片机+光敏电阻的简易光照强度测量系统设计电路图绘制及讲解
<电子DIY>之<单片机实践项目>之基于51单片机+光敏电阻的简易光照强度测量系统设计电路图绘制及讲解 添加链接描述
- 基于51单片机LCD1602温度显示(DS18B20测温)
基于51单片机DS18B20测温 要在1602上显示温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 DS18B20是美国DALLAS半导体公司推出的第一片支持&q ...
- DIY基于51单片机的旋转LED数字电子钟(红外线遥控调时)
在网上看到不少老外做的各种旋转LED显示屏,非常COOL,我也动手用洞洞板试做了一个类似的显示屏,结果感觉还不错.于是再接再励继续努力,将作品进一步改进,完善后制成如今这个样子. 由于刚学51单片机, ...
最新文章
- 用python写脚本看什么书-终于知晓python编写脚本入门教程
- Maven教程详细总结+学习路线
- Linux提高工作效率的命令
- 计算机操作系统在线作业,【在线】电子科大17春《计算机操作系统》在线作业1...
- NFS exports命令
- oracle怎么定位效率,oracle查询效率,该怎么解决
- PhotoshopCS2相关教程网址
- 追加文件内容的三种方法
- 【AR优秀开源项目】ARCore项目工程汇总
- DHT分布式哈希表通俗讲解
- thx是什么意思_thx是什么意思?
- 一篇文章搞懂php文件系统基本操作
- leetcode-292-Nim游戏(java|python)
- 奇迹网站系统IGC奇迹mu S18网站可视化装备模板
- 两周之后,英特尔或将宣布启用芯片代工:直接4nm,2023年出货?
- 【RAC】oracle 11g RAC两个机器重启后节点二能找到asm磁盘,节点一没有找到
- 交通流预测爬坑记(一):交通流数据集,原始数据
- html对颜色加深,css字体阴影如何加深?
- vi/vim简介及使用教程
- 计算机考研难度2017,2017大专生考研难度分析
热门文章
- 「钱途」无量:自动卖货引擎
- 扫二维码自动跳转【java】
- 挣脱Windows的枷锁:MPlayer - linux下的暴风影音
- 记一次解决 Feign 提交批量添加请求收到 400 报错的经历
- Idea代码自动补全,良心插件推荐:Codota,再也不用担心写不出代码了。
- 电子计算机模拟考试word,职高计算机模拟考试-
- 均线颜色怎么区分_怎么看均线,股市均线颜色区分
- Linux——让程序在后台运行(四种方法+使用推荐)
- buuctf misc 间谍启示录
- mysql把两个表语句_select语句将两个表连在一起查询---MySQL