实验内容:
使用51单片机控制LCD1602液晶显示屏显示 时间/日期/星期/温度 信息,并可通过按键设置值。
仿真效果展示:
proteus仿真图:
硬件测试图:
说明:
硬件测试按键使用左侧的四个独立按键
key1-设置键(选设置位)
key2:加一
key3:减一
key4:切换到日期/时间
主要硬件:
- AT89C51主控芯片
- LM016L/LCD1602 液晶显示模块
- RESPACK-8 排阻
- DS18B20 温度传感器
- BUTTON 按键
注:LM016L和LCD1602 原理是一样的,用法也相同。只是protues中lm0161没有显示调节亮度的那两个端口
对比
此次代码采用模块化的方式,硬件初始化和相关代码单独封装在一个文件中,使用时将其包含就好。
项目结构如图:
列出几个比较重要的函数:
主函数:
#include <reg52.h>
#include "LM016L.h"
#include "Timer.h"
#include "Data.h"
#include "Button.h"
#include "temp.h"
void main()
{
LcdInitiate();
TimerInit();
while(1)
{
KeyScan();
button_setting();
button_up_down();
ButtonSwitchDT();
TimerShow();
DataShow();
Lcd_Tem_Display(Ds18b20ReadTemp());
}
}
定时器中断函数:
void Timer0() interrupt 1
{
TH0=0x4C;
TL0=0x00;
i++;
if(i%10<5)
{
blink_flag = 0;
}
if(i%10>=5)
{
blink_flag = 1;
}
if(i==20)
{
i=0;
if(button_num1==0)
{
num1++;
}
if(num1==60)
{
num1=0;
num2++;
if(num2==60)
{
num2=0;
num3++;
if(num3==24)
{
num3=0;
day++;
weekday++;
if(weekday==8)
{
weekday=1;
}
DataDeal1();
}
}
}
}
}
void DataDeal1()
{
if(day>=30)
{
month++;
day=1;
if(month>=13)
{
month = 1;
year2++;
if(year2>=100)
{
year2 = 0;
year1++;
if(year1>=100)
{
year1=0;
}
}
}
}
}
按键处理函数:
char KeyScan()
{
static unsigned char klast = 0;
unsigned char trg = 0,key = 0;
key = P2 & 0xF0;
key ^= 0xF0;
trg = key & (key ^ klast);
klast = key;
button_flag = trg;
return trg;
}
温度传感器初始化函数:
unsigned char Ds18b20Init()
{
unsigned int i;
DSPORT=0;
i=70;
while(i--);
DSPORT=1;
i=0;
while(DSPORT)
{
i++;
if(i>5000)
return 0;
}
return 1;
}
这里需要注意的一点是,温度传感器并不需要一直转换温度,读取温度。而是在需要温度的时候再去初始化一下(转化和读取时),如果只在最开始初始化,转化时没有初始化则无法读取温度值。具体请看项目源码。
完整项目下载地址:
[仿真版源码] (https://github.com/Little-Water-Bottle/LCD1602ShowDataAndTime)
(补充链接:仿真版源码 密码:7jdc)
51普中开发板源码 密码:aeg3
proteus文件下载 密码:guqw
参考资料下载(!):
LCD和DS18B20参考资料 密码:64l7
排版真的是垃圾,算了记录一下就行了。。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)