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的简易数字钟相关推荐

  1. 基于51单片机LCD1602的简易矩阵键盘密码锁

    写在前面 初次开始写博客,表达方面也许会有很多不足,希望自己能通过这种方式巩固自己的学习和锻炼表达能力,同时也是对于自己学习的记录. 一.功能介绍 四位密码锁,密码可更改,输入仅四次以内有效 矩阵键盘 ...

  2. 基于51单片机LCD1602显示

    基于51单片机LCD1602显示 要在1602上显示字符,要大概明白1602液晶显示屏工作原理. 一般的液晶显示器(Liquid Crystal Display, LCD) 的主要原理是以电流刺激液晶 ...

  3. 51lcd显示光传感器c语言程序,基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例...

    基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器.51单片机最小系统.1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的.1 ...

  4. 基于51单片机LCD1602电子时钟实物制作

    之前写了51单片机的LCD1602的程序,现在画了电路图,焊接了电路板,做出了基于51单片机LCD1602电子时钟的实物. 注意事项: 焊接过程中,注意提前布局电路. 对应好端口(避免接线错误),我由 ...

  5. 多功能数字钟c语言单片机PPT,基于STC89C52单片机的多功能数字钟的设计

    2010年第35期.本刊重稿.科技信囊 基于STC89C52单片机的多功能数字钟的设计 张开碧王浩曾勇斌 (重庆邮电大学自动化学院中国重庆400065) I摘要]本文主要介绍了数字钟的功能以及相应的硬 ...

  6. 单片机多功能电子琴课设_基于51单片机设计的简易电子琴

    基于51单片机设计的简易电子琴 下面直接给出proteus仿真电路 代码如下:#include #define uint unsigned int #define uchar unsigned cha ...

  7. 《电子DIY》之《单片机实践项目》之基于51单片机+光敏电阻的简易光照强度测量系统设计电路图绘制及讲解

    <电子DIY>之<单片机实践项目>之基于51单片机+光敏电阻的简易光照强度测量系统设计电路图绘制及讲解 添加链接描述

  8. 基于51单片机LCD1602温度显示(DS18B20测温)

    基于51单片机DS18B20测温 要在1602上显示温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 DS18B20是美国DALLAS半导体公司推出的第一片支持&q ...

  9. DIY基于51单片机的旋转LED数字电子钟(红外线遥控调时)

    在网上看到不少老外做的各种旋转LED显示屏,非常COOL,我也动手用洞洞板试做了一个类似的显示屏,结果感觉还不错.于是再接再励继续努力,将作品进一步改进,完善后制成如今这个样子. 由于刚学51单片机, ...

最新文章

  1. 用python写脚本看什么书-终于知晓python编写脚本入门教程
  2. Maven教程详细总结+学习路线
  3. Linux提高工作效率的命令
  4. 计算机操作系统在线作业,【在线】电子科大17春《计算机操作系统》在线作业1...
  5. NFS exports命令
  6. oracle怎么定位效率,oracle查询效率,该怎么解决
  7. PhotoshopCS2相关教程网址
  8. 追加文件内容的三种方法
  9. 【AR优秀开源项目】ARCore项目工程汇总
  10. DHT分布式哈希表通俗讲解
  11. thx是什么意思_thx是什么意思?
  12. 一篇文章搞懂php文件系统基本操作
  13. leetcode-292-Nim游戏(java|python)
  14. 奇迹网站系统IGC奇迹mu S18网站可视化装备模板
  15. 两周之后,英特尔或将宣布启用芯片代工:直接4nm,2023年出货?
  16. 【RAC】oracle 11g RAC两个机器重启后节点二能找到asm磁盘,节点一没有找到
  17. 交通流预测爬坑记(一):交通流数据集,原始数据
  18. html对颜色加深,css字体阴影如何加深?
  19. vi/vim简介及使用教程
  20. 计算机考研难度2017,2017大专生考研难度分析

热门文章

  1. 「钱途」无量:自动卖货引擎
  2. 扫二维码自动跳转【java】
  3. 挣脱Windows的枷锁:MPlayer - linux下的暴风影音
  4. 记一次解决 Feign 提交批量添加请求收到 400 报错的经历
  5. Idea代码自动补全,良心插件推荐:Codota,再也不用担心写不出代码了。
  6. 电子计算机模拟考试word,职高计算机模拟考试-
  7. 均线颜色怎么区分_怎么看均线,股市均线颜色区分
  8. Linux——让程序在后台运行(四种方法+使用推荐)
  9. buuctf misc 间谍启示录
  10. mysql把两个表语句_select语句将两个表连在一起查询---MySQL