标题:
单片机1602显示电子时钟Proteus仿真程序
[打印本页]
作者:
白幽幽
时间:
2020-3-26 12:03
标题:
单片机1602显示电子时钟Proteus仿真程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png
(25.68 KB, 下载次数: 48)
下载附件
2020-3-30 01:19 上传
单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit LED = P2^4;
bit new_s=0, g = 0,k=0;
char t0, sec = 00, min = 00, hour = 00;
char code LCD_line1[] = "GOOD MORNING!";
char code LCD_line2[] = "Timer: 00:00:00 ";
char Timer_buf[] = "00:00:00";
void delay(uint z)//延时
{
uint x, y;
for(x = z; x > 0; x--)
for(y = 100; y > 0; y--);
}
void W_LCD_Com(uchar com) //写指令
{
LCD_RS = 0;
LCD_RW = 0;
P3 = com;
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void W_LCD_Dat(uchar dat)//写数据
{
LCD_RS = 1;
LCD_RW = 0;
P3 = dat;
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void W_LCD_STR(uchar *s) //写字符
{
while(*s) W_LCD_Dat(*s++);
}
void W_BUFF(void) //显示
{
Timer_buf[0] = hour / 10 + 48;
Timer_buf[1] = hour % 10 + 48;
Timer_buf[3] = min / 10 + 48;
Timer_buf[4] = min % 10 + 48;
Timer_buf[6] = sec / 10 + 48;
Timer_buf[7] = sec % 10 + 48;
W_LCD_Com(0xc0 + 7);
W_LCD_STR(Timer_buf);
}
uchar read_key(void)//扫描按键
{
uchar x1, x2;
P1 = 255;
x1 = P1;
if (x1 != 255) {
delay(100);
x2 = P1;
if (x1 != x2)
return 255;
while(x2 != 255)
x2 = P1;
if (x1 == 0xfe) return 0;
else if (x1 == 0xfb) return 1;
else if (x1 == 0xfd) return 2;
else if (x1 == 0xf7) return 3;
else if (x1 == 0xef) return 4;
else if(x1==0xdf)return 5;
}
return 255;
}
void Init()
{
LCD_RW = 0;
W_LCD_Com(0x38); //显示模式
delay(50);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);//显示光标移动位置
W_LCD_Com(0x01);//清屏
W_LCD_Com(0x80);//第一行
W_LCD_STR(LCD_line1);
W_LCD_Com(0xC0);//第二行
W_LCD_STR(LCD_line2);
TMOD = 0x01; //T0定时方式1
TH0 = 0x3c;
TL0= 0xB0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void CountDown()
{
if (k)
while(!(sec==0&&min==0&&hour==0))
{
if(new_s==1)
{
sec--;
new_s=0;
sec %=60;
if(sec<0)
sec=58-sec;
if(sec==59)
{
min--; min %=60;
if(min<0&&hour!=0&&hour>0)
min=58-min;
if(min==59)
{
hour--; hour %= 24;
}
}
W_BUFF();
}
}
k=0;
}
void main()
{
uint i, j;
uchar Key;
Init();
while(1)
{
if (new_s)
{
new_s=0;sec++; sec %= 60;
if(!sec)
{
min++; min %= 60;
if(!min)
{ hour++; hour %= 24;}
}
W_BUFF();
}
Key = read_key();
switch(Key) {
case 0: g = 1; break;
case 1: if(g) {min++; min %= 60; W_BUFF(); break;}
case 2: if(g) {hour++; hour %= 24; W_BUFF(); break;}
case 3: g = 0; break;
case 4:k=1;CountDown();break;
}
}
}
void timer0(void) interrupt 1
{
TH0 = 0x3c;
TL0= 0xB0;
t0++; t0 %= 20; //20次
if(t0 == 0){new_s = 1; LED = ~LED;}
if(g) LED = 0;
}
复制代码
所有资料51hei提供下载:
电子时钟.zip
(72.96 KB, 下载次数: 59)
2020-3-26 12:03 上传
点击文件名下载附件
下载积分: 黑币 -5
一、 项目要求
1. 能用LED显示时间,以“时:分:秒”的形式;2. 能通过拨动按键达到调时的目的;3. 能实现倒计时功能。二、 项目开发环境1. 硬件环境:Windows 102. 软件环境:Protues 8.6 Keil uVision4三、 项目分析1. 显示时间使用的LED可以使用LM016L,时间显示的原理可以使用定时器,定时器定时满1S,秒加1,判断秒大于59时,分加1,并且秒清0;判断分大于59时,时加1,并且分清0;判断时大于23时,时清0。主程序流程图:3. 倒计时设计当时间设定完成后,从当前时间开始倒计时,当秒小于0时,分减1,秒置59,当分小于0时,时减1,分置59,当时小于0时,从00:00:00开始正计时。四、 设计与实现1. 设计思路1) 首先要将时间显示部分的逻辑原理理清楚并画出仿真图,考虑按键进去,并写出时间显示部分的核心代码;2) 将按键的各个功能理清楚,以及按键控制的逻辑思路,编写出完整的代码,并进行仿真。3) 考虑增添倒计时功能,在原有的基础上增加一个按键,修改仿真图,并编写倒计时函数代码,最后仿真调试。2. 设计和实现的主要内容1) 设计实现一个以“时:分:秒”形式显示的电子时钟,使用4个按键实现:开始计时,设置时,设置秒,完成时间设置功能,最后增添按键实现倒计时功能。
五、 总结
本次课程设计仿真电子时钟,相对来说,电路比较简单,没有那么复杂,仿真图中需要注意的LM016L这个LED显示器件的工作原理,LM016L是1602的一种,它是以ASCII码为编码方式,不注意的话,可能会造成乱码。LM016L在写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该加上80H,它在显示字符时光标自动右移,无须人工干预,它的VL为液晶显示器对比度调整端,我们在仿真中为它接入一个滑动变阻器。对于本次课程设计,其重点在与理清其中的逻辑思路,再来编写代码,使得整个课程设计条理清晰。
本次课程设计让我对本学期所学的单片机是识进行了一次整合,对AT89C51单片机的认识更加的清晰明了。让我对单片机有关的硬件设计产生了浓厚的兴趣,特别时有关定时计数器的部分。
本次设计使用了Keil uVision4和Proteus 8 Professional软件,让我对这两个软件的运用更加熟练,更加得心应手。让我认识到了自己本身的不足以及问题解决的方法,让我认识到了实践与理论结合的重要性。
作者:
黄尼玛a
时间:
2020-6-9 15:23
牛逼顶
作者:
MM52152
时间:
2020-8-30 10:13
能不能发一下只有四个按钮和排阻只有8个引脚的程序
作者:
MM52152
时间:
2020-9-1 10:53
为什么会突然卡退,程序到最后算是写完了吗?
作者:
MM52152
时间:
2020-9-5 20:15
在吗,可不可以回复一下,程序运行卡退怎么修改
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1