51单片机LCD1602电子时钟

一.完成部分

基于51单片机用LCD1602实现时-分的显示
按键控制时-分的调整
能实现整时报时的功能(蜂鸣器响)
按键切换模式(模式一:时-分显示,模式二:60秒倒计时)
闹钟模式

二.未完成部分

电路板的焊接

三.从中学到了什么

1.新部分:首先我了解到了lcd1602的工作方式,其中:Vss接电源地,Vcc接5V电源,RS与WR为输入令与数据端口,D0~D7为输入数据口。以及可以选择地址进行输入。
2.单片机部分:进一步了解了各种外部中断的的应用,如:在考虑四种模式和按键的关系上,考虑相互的优先级和需求,进一步规划
3.同时要灵活应用已有的各种条件,如在整点报时上要求“不影响主程序的延时”首先计时器已经满足不影响主程序,并且每次运行都有一个比较固定的时间,只要设定好次数就可以做到

四.未来计划

1.争取了解多种解决问题的方法
2.尝试自己读懂每个原件的使用说明,做到深入了解每个原件
3.了解下载模块,在焊接上发挥
4.深入了解c51单片机的性能(此次存在内存超出的情况)

五.本次出现的问题

1.未合理分配内存,导致内存超出
解决方法:调整并在数组前加“code”
2.循环的失误导致闪屏
解决方法:调整初始化的位置
3.变量数据溢出
解决方法:考虑变量的内存大小,到达一定值后置初值

六.对本次要求的详细解读

1.首先,时钟显示模式需求的本质上还是数字的进位和显示的不断更新。再就是整点报时,这个可以通过位变化检测或者单纯的数字变化来确定蜂鸣器启动的时间点。
2.时钟调整模式要求对时分进行键位调整,当然,之后的时钟显示也应该是调整后的,可以采取先改变再对调,或者先暂停再改变。
3.再就是闹钟模式,闹钟模式调整上其实和调整模式差不多,关键就是设置一个值和时钟显示模式对应,让其能够再
对应的时间点使蜂鸣器启动。
4.倒计时其实关键并不在于显示和计时,因为这两点参考前面就行了,主要是可控性,也就是设置开关。

七.本次对自己个人觉得要注意的点

1.下面来满足这些需求,首先这里有四种模式,如果用两个外部中断肯定不够,况且0号口外度中断优先于计时器,
为了不干扰计时器,所以我将四种模式都置于主程序里,将中断作为一种改变判断的工具,并且尽量简短,以免影响主
程序的运行
2. 显示里面需要注意的是每次最好要重新标志好初始的输入点,避免输入错位

八.有关错误的查找

有些错误不一定会显示,如内存溢出这种就不会显示,这些还需要自己去了解,通过上网搜索等方式寻找解决方法

#include <reg51.h>
#include <math.h>sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;
sbit BUZ=P1^0;
sbit IN=P2^0;
sbit DE=P2^1;
sbit BA=P2^2;unsigned char code mod1[]=" workmod1:clock ";
unsigned char code mod2[]=" workmod2:setup ";
unsigned char code mod3[]=" workmod3:alarm ";
unsigned char code mod4[]=" workmod4:timer ";
unsigned int code timenumber[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0,1,2,3,4,5,6,7,8,9unsigned int o,p;
unsigned char bs,i;
unsigned int c1,c2,c3,c4,c5,c6,z,i3;//mod1
unsigned int s;//mod2
long int a;
long int kk,k2;//mod4
long int t,k,i1,i2;//timervoid delay(int t)//50us
{unsigned int x;for(;t>0;t--)for(x=19;x>0;x--);
}void writecom(unsigned char com)
{E=0;RS=0;RW=0;P0=com;delay(10);E=1;delay(20);E=0;
}void writedate(unsigned char dat)
{E=0;RS=1;RW=0;P0=dat;delay(10);E=1;delay(20);E=0;
}void innit()
{delay(30);writecom(0x38);delay(10);writecom(0x38);delay(10);writecom(0x38);writecom(0x38);writecom(0x08);writecom(0x01);writecom(0x06);writecom(0x0c);
}void workmod1()
{
innit();
s=0;
while(bs==0)
{writecom(0x80);for(i=0;i<16;i++){writedate(mod1[i]);}writecom(0x80+0x40);if(s==0)writedate('O'),writedate('F'),writedate('F');if(s==1)writedate('O'),writedate('N'),writedate(' ');c1=i1%10,c2=i1/10,c3=i2%60%10,c4=i2%60/10,c5=i2/60%24%10,c6=i2/60%24/10;writecom(0x80+0x45);writedate(timenumber[c6]);writedate(timenumber[c5]);writedate(':');writedate(timenumber[c4]);writedate(timenumber[c3]);writedate(':');writedate(timenumber[c2]);writedate(timenumber[c1]);i3=i2/60;if(i3!=z)//strike{o=1;  z=i3;}if(s==1&&a==i2)o=1;//alarm}
}void workmod2()
{
innit();
s=0;
writecom(0x80);
for(i=0;i<16;i++)
{writedate(mod2[i]);
}while(bs==1)
{i1=0;writecom(0x80+0x4a);writedate(':');writedate('0');writedate('0');writecom(0x80+0x40);switch(s){case 0:{writedate('M');if(IN==0){delay(500);i2++;delay(500);}else if(DE==0){delay(500);i2--;delay(500);}}break;case 1:{writedate('H');if(IN==0){delay(500);i2=i2+60;delay(500);}else if(DE==0){delay(500);i2=i2-60;delay(500);}}break;}c1=i1%10,c2=i1/10,c3=i2%60%10,c4=i2%60/10,c5=i2/60%24%10,c6=i2/60%24/10;writecom(0x80+0x45);writedate(timenumber[c6]);writedate(timenumber[c5]);writedate(':');writedate(timenumber[c4]);writedate(timenumber[c3]);
}
}void workmod3()
{
innit();
s=0;
writecom(0x80);
for(i=0;i<16;i++)
{writedate(mod3[i]);
}
while(bs==2){if(a==1440)a=0;writecom(0x80+0x40);switch(s){case 0:{writedate('M');if(IN==0){delay(500);a++;delay(500);}else if(DE==0){delay(500);a--;delay(500);}}break;case 1:{writedate('H');if(IN==0){delay(500);a=a+60;delay(500);}else if(DE==0){delay(500);a=a+60;delay(500);}}break;}writecom(0x80+0x45);c3=a%60%10,c4=a%60/10,c5=a/60%10,c6=a/60/10;writedate(timenumber[c6]);writedate(timenumber[c5]);writedate(':');writedate(timenumber[c4]);writedate(timenumber[c3]);}
}void workmod4()
{
innit();
kk=0;
writecom(0x80);
for(i=0;i<16;i++)
{writedate(mod4[i]);
}
while(bs==3){k2=0;if(s==0){writecom(0x80+0x45);writedate('R');writedate('E');writedate('A');writedate('D');writedate('Y');}else if(s==1){writecom(0x80+0x45);for(i=0;i<5;i++)writedate(' ');while(kk!=60&&bs==3&&s==1){kk=k2/20;writecom(0x80+0x47);writedate(timenumber[(60-kk)/10]);writedate(timenumber[(60-kk)%10]);}if(kk==60)o=1,s=0,kk=0;}}
}void main()
{
innit();
TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;
EA=1;EX0=1;EX1=1;
IT0=1;IT1=1;
ET0=1;TR0=1;
k=0;bs=0;s=0;z=0;k2=0;i1=0;i2=0;kk=0;a=0;o=0;p=0;
while(1)
{switch(bs){case 0:workmod1();break;case 1:workmod2();break;case 2:workmod3();break;case 3:workmod4();break;}
}
}void int0 () interrupt 0//buttion:affirm
{
s++;s=s%2;
BUZ=1;
}void timer0 () interrupt 1
{
for(t=0;t<20;t++)
{TH0=(65536-50000)/256;TL0=(65536-50000)%256;
}
k++;
if(k==20) i1++,k=0;
if(i1==60) i2++,i1=0;
if(i2==1440) i2=0;
k2++;//only mod4
if(o)BUZ=0,p++;
if(p==40)BUZ=1,o=0,p=0;
}void int2 () interrupt 2//buttion:set up
{
kk=0;BUZ=1;
bs++;
bs=bs%4;
}

51单片机LCD1602电子时钟相关推荐

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

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

  2. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

  3. 【036】基于51单片机的电子时钟与秒表Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的电子时钟与秒表proteus仿真设计一份: (2).基于51单片机的电子时钟与秒表proteus仿真设计keli源代码一份: (3).基于51单片机的电子时 ...

  4. c51单片机时钟c语言程序设计,基于51单片机的电子时钟设计..doc

    -- I -- - - I -- 设计题目: 基于 51 单片机的电子时钟设计 摘要 单片机,是集 CPU ,RAM ,ROM ,定时器,计数器和多种接口于一体的微控制器.自 20 世纪 70 年代问 ...

  5. 毕业设计 - 基于51单片机的电子时钟设计与实现

    文章目录 单片机电子时钟程序设计 实现效果 最后 单片机电子时钟程序设计 共用体除非必要,否则学长不推荐使用,枚举的用法比较简单,在本书19章的项目实践中有很好的示例,这节课我们先来练习一下结构体的使 ...

  6. 51单片机LCD1602温度时钟万年历带闹钟DS18B20实践制作DIY- GC0046-出租车计价器

    一.功能说明: 基于51单片机设计-万年历带闹钟 功能介绍: STC89C52最小系统板. LCD1602 .DS1302.DS18B20.4个按键.蜂鸣器. 1.单片机获取DS1302的年月日时分秒 ...

  7. 51单片机--数字电子时钟(单片机基础应用)

    前言 整理代码的时候发现之前写的一个单片机(STC89C51)代码,主要是利用3个中断源(计时中断,外部中断),蜂鸣器,8个LED灯,独立按键(矩阵按键)以及8片阴极数码管完成一个数字电子时钟,并且具 ...

  8. 51单片机定时器电子时钟 LCD1602显示时间日期带闹钟功能

    首先直接附上我的文件(懒得在csdn二次编辑了),里面说明文档,和电路图,protues仿真程序,keil程序.https://pan.baidu.com/s/1TC4AxBZJZ8d1Cv-X_dt ...

  9. 基于51单片机的电子时钟万年历带农历温度proteus仿真

    硬件设计 本设计由数据显示模块.温度采集模块.时间处理模块和调整设置模块四个模块组成.系统以AT89S52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年.月.日.时.分.秒进 ...

  10. 基于51单片机的电子时钟万年历温度仿真数码管显示

    硬件设计 仿真图1: A. 由数码管作为显示器,三个按键可以设置时间. 仿真图2: A 由数码管作为显示器,可通过开关设置年月日星期等时间: 程序设计1 #include <reg51.h> ...

最新文章

  1. css限制字体三行_CSS美化网页
  2. 001_SpringMVC入门
  3. 【Python】面向小白的Python可视化教程,超全的!
  4. PHP实现内部函数explode
  5. 如何在CentOS 7上使用HAproxy Loadbalancer设置Percona XtraDB集群(负载均衡)
  6. D3 BarChart
  7. memcmp与strcmp区别
  8. python装饰器测试_python 装饰器
  9. QT5.14.1安装教程
  10. json react 展示工具_如何基于jsoneditor二次封装一个可实时预览的json编辑器组件?(react版)...
  11. js 函数传参改变div属性
  12. mysql中if多重判断使用
  13. 【网络】吐血整理-Java网络合集
  14. 解方程(二分法) HDU
  15. 终端运行npm install @tinymce/tinymce-vue -S报错的解决办法
  16. 怎样抠图去背景?教你快速抠图的方法
  17. c#文本文件文本替换_如何替换许多文件中存在的文本?
  18. 股票成交价格确定方法详解
  19. NOI 2008 假面舞会
  20. 4.1 用格雷戈里公式求π的近似值

热门文章

  1. 日更第1天:Linux常用命令之dnf用法
  2. Node.js安装(window10需要管理员权限)
  3. 家里wifi网速越来越慢_家里网速变得很慢怎么排查原因
  4. 电台复活节_如何通过在控制台中隐藏复活节彩蛋使您的应用程序用户惊讶
  5. 一种简单的图像白平衡计算方法
  6. Android开关按键(左右复选)
  7. 计算机制图和应用cad哪个好,cad制图笔记本电脑排行,cad制图用哪款笔记本电脑好...
  8. 电脑硬件软件相关知识
  9. ctc系统通信前置服务器,CTC系统包括哪些接口服务器?
  10. oracle取差集效率如何,Oracle Minus 取差集