二实验求
设计万年历时钟显示LCD1602显示屏进行年月日时分秒设置外通键进行闹钟设置事件提醒功蜂鸣器进行闹铃提醒附加温湿度检测功温湿度传感器检测室温湿度温湿度数显示屏显示出
三实验设备仪器
1 STC89C52芯片作系统板控芯片
2DHT11温湿度传感器
3DS1302时钟芯片
4LCD1602显示屏
四实验模块原理介绍
41 STC89C52单片机
STC89C52STC公司生产种低功耗高性CMOS8位微控制器具8K字节系统编程Flash存储器STC89C52典MCS51核具传统51单片机具备功单芯片拥灵巧8 位CPU 系统编程FlashSTC89C52众嵌入式控制应系统提供高灵活超效解决方案
(1)特性
8K字节程序存储空间
512字节数存储空间
带4K字节EEPROM存储空间
直接串口载
(2)器件参数
1 增强型8051单片机6时钟机器周期12时钟机器周期意选择指令代码完全兼容传统8051
2 工作电压:55V~33V(5V单片机)38V~20V(3V 单片机)
3工作频率范围:0~40MHz相普通80510~80MHz实际工作频率达48MHz
4 户应程序空间8K字节
5 片集成512字节RAM
6 通IO 口(32)复位:P1P2P3 准双口弱拉P0口漏极开路输出作总线扩展时加拉电阻作IO口时需加拉电阻
7 ISP(系统编程)IAP(应编程)需专编程器需专仿真器通串口(RXDP30TXDP31)直接载户程序数秒完成片
8 具EEPROM 功
9 316位定时器计数器定时器T0T1T2
10外部中断4 路降中断低电触发电路Power Down 模式外部中断低电触发中断方式唤醒
11 通异步串行口(UART)定时器软件实现UART
12 工作温度范围:40~+85℃(工业级)0~75℃(商业级)
13 PDIP封装
1STC89C52单片机引脚图
图41 STC89C52单片机引脚图
① 电源引脚(2根)
VCC(Pin40):电源输入接+5V电源
GND(Pin20):接线
②外接晶振引脚(2根)
XTAL1(Pin19):片振荡电路输入端
XTAL2(Pin20):片振荡电路输出端
③控制引脚(4根)
RSTVPP(Pin9):复位引脚引脚出现2机器周期高电单片机复位
ALEPROG(Pin30):址锁存允许信号
PSEN(Pin29):外部存储器读选通信号
EAVPP(Pin31):程序存储器外部选通接低电外部程序存储器读指令果接高电部程序存储器读指令
④编程输入输出引脚(32根)
STC89C52单片机4组8位编程IO口分位P0P1P2P3口口8位(8根引脚)32根
PO口(Pin39~Pin32):8位双IO口线名称P00~P07 P1口(Pin1~Pin8):8位准双IO口线名称P10~P17 P2口(Pin21~Pin28):8位准双IO口线名称P20~P27 P3口(Pin10~Pin17):8位准双IO口线名称P30~P37
2STC89C52单片机系统
STC89C52单片机系统复位电路时钟电路组成复位功通外部电路实现键K1控制单片机复位时钟电路通晶振实现单片机提供运行时钟根需求选晶振频率会差异次课程设计中采110592MHZ晶振频率单片机复位电路图42示晶振电路图43示
图42 复位电路
图43晶振电路
42 DS1302芯片
DS1302DALLAS公司出款实时时钟芯片广泛应电话传真便携式仪器等产品领域性指标:
1DS1302实时时钟芯片提供秒分时日期月年等信息具软件动调整力通配置AMPM决定采24时格式12时格式
2拥31字节数存储RAM
3串行IO通信方式
4DS1302工作电压较宽20V~55V范围均正常工作采双电源供电电源备电源高02V时电源供电否采备电源般纽扣电池
5DS1302实时时钟芯片功耗低工作电压20V时工作电流300nA
6DS13028引脚两种封装形式种DIP8封装芯片宽度(含引脚)300mil种SOP8封装两种宽度种150mil种208mil
(1) DS1302引脚功
图 44 DS1302芯片引脚图
(1)Vcc2:电源引脚Vcc2Vcc1高02v时DS1302Vcc2供电Vcc2低Vcc1时Vcc1供电
(23)X1X2:两引脚需接32768k晶振DS1302提供基准该晶振引脚负载电容必须6pF源晶振接X1X2悬空
(4)GND:接
(5)CE:DS1302输入引脚该引脚部40k拉电阻该引脚高电DS1302进行读写
(6)IO:该引脚双通信引脚部含40k拉电阻进行数读写
(7)SCLK:该引脚输入引脚部含40k拉电阻作通信时钟信号
(8)Vcc1:备电源引脚
(2) DS1302单片机接线图
DS1302引脚单片机接线图图45示图45出引脚X1X2间接32768K晶体正振荡器Vcc1通纽扣电池接
图45 DS1302单片机连接图
43 LCD1602液晶显示屏
LCD1602液晶屏够够时显示32字符价格便宜编程简单稳定LCD1602液晶屏种图形点阵显示器显示原理简单易懂液晶屏部液晶材料变化显示字符液晶具流动特性物质需外加微力量液晶分子运动
(1)LCD1602引脚
1602LCD采标准14脚(背光)16脚(带背光)接口引脚接口图图46示:
图46 LCD1602引脚图
(a) 引脚说明
1脚:VSS电源
2脚:VDD接5V正电源
3脚:V0液晶显示器度调整端接正电源时度弱接时
度高时会产生鬼影时通10K电位器调整
4脚:RS寄存器选择高电时选择数寄存器低电时选择指令寄存器
5脚:RW读写信号线高电时进行读操作低电时进行写操作RS
RW低电时写入指令者显示址RS低电RW高电
RS高电RW低电时写入数
6脚:E端端E端高电跳变成低电时液晶模块执行命令
7~14脚:D0~D78位双数线
15脚:背光源正极
16脚:背光源负极
(b)LCD1602技术参数:
显示容量:32字符
芯片工作电压:4555V
工作电流:20mA(50V)
模块佳工作电压:50V
(2)LCD1602单片机接线图
图47 LCD1602单片机接线图
LCD1602单片机接线图47示背光源正极(5)VDD(2)均接电源液晶显示器接保证度强10K电位器进行调整
44 温湿度传感器DHT11
DHT11数字温湿度传感器款含已校准数字信号输出温湿度复合传感器采专数字模块采集技术温湿度传感技术确保产品性长期稳定性传感器包括电阻式感湿元件NTC测温元件高性8位单片机相连接该产品具品质卓越超快响应抗干扰力强性价极高等优点
DHT11传感器极精确湿度校验室中进行校准校准系数程序形式储存OTP存中传感器部检测信号处理程中调校准系数单线制串行接口系统集成变简易快捷超体积极低功耗信号传输距离达20米成类应甚苛刻应场合佳选产品4针单排引脚封装连接方便特殊封装形式根户需求提供
(1)DHT11引脚功
DHT11引脚图图48示般情况四引脚分:VCCDOUTNCGND引脚功表41示
图48 DHT11引脚图
表41 DHT11引脚功
pin
名称
注释
1
VDD
供电355VDC
2
DATA
串行数单总线
3
NC
空脚请悬空
4
GND
接电源负极
1电源引脚
DHT11供电电压355V传感器电等 1s 越稳定状态期间需发送指令电源引脚(VDDGND)间增加100nF 电容作耦滤波
2串行接口(单线双)
DATA微处理器DHT11间通信步串行双接口采单总线数格式次通信高位先出序传输40位数时约4 ms
数格式:
8位湿度整数数+8位湿度数数+8位温度整数数+8位温度数数+8位校验数数分数部分整数部分前数部分扩展现读出零数传送正确时校验数等8位湿度整数数+8位湿度数数+8位温度整数数+8位温度数数结果末8位
(2)DHT11单片机接线图
DHT11单片机接线图图49示图49中出DHT11第三引脚接单片机P22引脚第引脚接电阻发光二极
图49 DHT11单片机接线图
45 蜂鸣器
蜂鸣器种体化结构电子讯响器采直流电压供电广泛应计算机印机复印机报警器电子玩具汽车电子设备电话机定时器等电子产品中作发声器件蜂鸣器分源蜂鸣器源蜂鸣器两种处源蜂鸣器源蜂鸣器工作理想信号直流电通常标示VDCVDD等蜂鸣器部简单振荡电路恒定直流电转化成定频率脉信号带动钼片振动发音
源蜂鸣器压电效应原理发声部带谐振荡器产生1525kHZ 电压信号源蜂鸣器发声源蜂鸣器单片机中电路图较简单图410蜂鸣器单片机接线图
图410 蜂鸣器单片机接线图
源蜂鸣器直接接额定电源连续发声IO口输出接1K电阻目基极限流低电方式启动蜂鸣器发声
五流程图
(1) 程序流程图
图51系统程序流程图系统开始时先进行初始化然调整时间闹钟通串口屏时间显示出
图51 程序流程图
(2)子程序流程图
系统程序开始执行分调子程序中子程序包括DS1302子程序DHT11子程序LCD1602子程序等
(1)DS1302芯片子程序流程图
DS1302实时时钟芯片提供秒分时日月年星期等信息具软件动调整力通配置AMPM决定采24时格式12时格式DS1302中读出年月日时分秒等信息图52DS1302芯片子程序流程图:
图52 DS1302子程序流程图
(2)DHT11子程序流程图
DHT11温湿度传感器实时显示环境中温湿度数8位湿度整数数8位湿度数数8位温度整数数8位温度数数8位校验数DHT11子程序流程图53示:
图53 DHT11子程序流程图
(3)LCD1602子程序流程图
LCD1602显示时先进行初始化紧接着读指令读完写指令数进行读写然显示出流程图图54示
图54 LCD1602显示屏子程序流程图
六实验目
1学会掌握keil软件
2学会掌握Altium Designer软件
3实现万年历基功
4通实验巩固单片机相关知识检验身动手力
七实验容
次实验STC89C52单片机作控芯片DS1302芯片作时钟芯片LCD1602显示屏显示设置闹钟事件提醒功外进行室温湿度检测显示终完成万年历设计
八实验步骤
1查询资料确定控芯片温湿度传感器时钟芯片LCD1602显示屏说明
2根功求进行硬件电路设计Altium Designer软件设计电路整电路分控芯片控制模块LCD1602显示模块键设置模块蜂鸣器电路模块DHT11温湿度传感器模块硬件电路图图1示:
图81:硬件电路图
3根电路图编写C语言代码:
代码:
#include
#define uchar unsigned char
#define uint unsigned int
#define lcddata P0
#define readalarmsecond 0xc7 定义 DS1302 中读闹钟秒值命令字节
#define writealarmsecond 0xc6 定义 DS1302 中写闹钟秒值命令字节
#define readalarmminute 0xc5 定义 DS1302 中读闹钟分值命令字节
#define writealarmminute 0xc4 定义 DS1302 中写闹钟分值命令字节
#define readalarmhour 0xc3 定义 DS1302 中读闹钟时值命令字节
#define writealarmhour 0xc2 定义 DS1302 中写闹钟时值命令字节
#define readeventday 0xd7 定义 DS1302 中读事件提醒日期值命令字节
#define writeeventday 0xd6 定义 DS1302 中写事件提醒日期值命令字节
#define readeventmonth 0xd5 定义 DS1302 中读事件提醒月份值命令字节
#define writeeventmonth 0xd4 定义 DS1302 中写事件提醒月份值命令字节
#define readeventyear 0xd3 定义 DS1302 中读事件提醒年份值命令字节
#define writeeventyear 0xd2 定义 DS1302 中写事件提醒年份值命令字节
sbit lcdrsP2^7 LCD 数 命令选择端 (HL)
sbit lcdrwP2^6 LCD 读写选择端 (HL)
sbit lcdenP2^5 LCD 控制
sbit beepP1^3 蜂鸣器控制端
sbit DQ P1^4 温湿度传感器·
sbit kmenuP3^2 功键
sbit kupP3^3 增键
sbit kdownP3^4 减键
sbit kalarmP3^5 闹钟查键 Ring 显示闹钟需调时间
sbit keventP3^6 事件查键 Ding 显示事件提醒需调时间
sbit kmodeP3^7 切换温湿度显示
sbit dsclkP2^2 ds1302 时钟信号端
sbit dsdataP2^1 ds1302 数 IO 端
sbit dsrstP2^0 ds1302 复位端
sbit ACC7ACC^7 定义累加器高低位
sbit ACC0ACC^0
bit flagalarmflagsetaflagset 分定义闹钟响标志位闹钟设置标志位时间设置标志位
bit flageventflagsseta 分定义事件提醒标志位事件提醒设置标志位
uchar FLAGk
uchar temp
uchar T_data_HT_data_LRH_data_HRH_data_Lcheckdata
uchar T_data_H_tempT_data_L_tempRH_data_H_tempRH_data_L_tempcheckdata_temp
uchar comdata
uchar kmenunumsmhddmmyy 功键次数计数器
char secondminutehouryearmonthdayweek
uchar inittime[7]{0x590x590x110x050x070x040x18} 初始化设置:
2018 年 7 月 5 日 星期四 11 点 59 分 59 秒
左右数次秒分时日月星期年
年月日星期: 20180705 THU
时间: 115959
uchar code t1[] 液晶固定显示部分
uchar code t2[]
函数声明
void delay(uint z) 毫秒级延时函数
void di() 蜂鸣器发声函数
void writecom(uchar com) 液晶写命令函数
void writedata(uchar dat) 液晶写数函数
void writetime(uchar adduchar dat) 液晶刷新时分秒
void writenyr(uchar adduchar dat) 液晶刷新日期
void writeweek(uchar week) 液晶星期显示函数
void keyscan() 键盘扫描函数
void dswritebyte(uchar d) DS1302 写入字节
uchar dsreadbyte() DS1302 读出字节
void dswrite(uchar add uchar dat) DS1302 指定址写入字节
uchar dsread(uchar add) DS1302 指定址读出字节
void init1302time(uchar *pClock) DS1302 时间初始化函数
void init() 初始化函数
void Delay_100us(uint j)延时100us
void Delay_10us(void)延时10us
void COM(void)
void Read_DHT11(void)
void delay(uint z) 毫秒级延时函数
{
uint xy
for(xzx>0x)
for(y110y>0y)
}
void di() 蜂鸣器发声函数
{
beep0
delay(100)
beep1
}
void writecom(uchar com) 液晶写命令函数
{
lcdrs0 置写入命令
lcddatacom 送入数
delay(1)
lcden1 拉高端
delay(1)
lcden0 完成高脉
}
void writedata(uchar dat) 液晶写数函数
{
lcdrs1 置写入数
lcddatadat 送入数
delay(1)
lcden1
delay(1)
lcden0
}
void writetime(uchar adduchar dat) 液晶刷新时分秒
{ 3时开始位置6 分 9 秒
uchar shige
shidat10
gedat10
writecom(0x80+0x40+add)
writedata(0x30+shi)
writedata(0x30+ge)
}
void writenyr(uchar adduchar dat) 液晶刷新日期
{ 0 年 3 月 6 日
uchar shige
shidat10
gedat10
writecom(0x80+add)
writedata(0x30+shi)
writedata(0x30+ge)
}
void writeweek(uchar week) 液晶星期显示函数
{
writecom(0x80+9) 第行隔十三字符开始写星期
switch(week)
{
case 1 writedata('M')
writedata('O')
writedata('N')
break
case 2 writedata('T')
writedata('U')
writedata('E')
break
case 3 writedata('W')
writedata('E')
writedata('D')
break
case 4 writedata('T')
writedata('H')
writedata('U')
break
case 5 writedata('F')
writedata('R')
writedata('I')
break
case 6 writedata('S')
writedata('A')
writedata('T')
break
case 7 writedata('S')
writedata('U')
writedata('N')
break
}
}
void keyscan() 键盘扫描函数
{
if((flagalarm1)||(flagevent1)) 果闹钟响者事件提醒意键停止闹钟响者取消事件提醒
{
if((kmenu0)||(kup0)||(kdown0)||(kalarm0)||(kevent0))
{
delay(5)
if((kmenu0)||(kup0)||(kdown0)||(kalarm0)||(kevent0))
{
while((kmenu&&kup&&kdown&&kalarm&&kevent))
di()
flagalarm0 清闹钟标志
flagevent0 清事件提醒标志
}
}
}
if(kmenu0) 检测功键
{
delay(5)
if(kmenu0)
{
kmenunum++ 记录功键次数
if(flagseta1) 检测否进行闹钟设置
if(kmenunum4) kmenunum1 进行闹钟设置时调节时分秒 kmenunum 等 123
if(flagsseta1) 检测否进行事件提醒设置
if(kmenunum8) kmenunum5 进行事件提醒设置时调节年月日 kmenunum 等 567
flagset1 设置标志位表示进行种时间设置
while(kmenu)
di()
switch(kmenunum) 定位光标闪烁点
{
case 1 writecom(0x80+0x40+10) 秒闪烁
writecom(0x0f) 开光标闪烁
break
case 2 writecom(0x80+0x40+7) 分闪烁
break
case 3 writecom(0x80+0x40+4) 时闪烁
break
case 4 writecom(0x80+10) 星期闪烁
break
case 5 writecom(0x80+7) 日闪烁
break
case 6 writecom(0x80+4) 月闪烁
break
case 7 writecom(0x80+1) 年闪烁
break
case 8 kmenunum0
writecom(0x0c) 取消光标闪烁
flagset0 取消时间调节标志
dswrite(0x8e0x00) * 允许写操作 *
dswrite(0x80second10*16+second10) dswrite(0x82minute10*16+minute10) dswrite(0x84hour10*16+hour10)
dswrite(0x8aweek10*16+week10)
dswrite(0x86day10*16+day10)
dswrite(0x88month10*16+month10)
dswrite(0x8cyear10*16+year10)
dswrite(0x8e0x80) * 禁止写操作 *
break
}
}
}
if(kmenunum0) 功键时 检测增 减键
{
if(kup0)
{
delay(5)
if(kup0)
{
while(kup)
di()
switch(kmenunum) 根功键次数调节相应数值
{
case 1 second++
if(second60)
second0
writetime(9second)
writecom(0x80+0x40+10) 面送液晶显示
break 次 光标移位 光标复位
case 2 minute++
if(minute60)
minute0
writetime(6minute)
writecom(0x80+0x40+7)
break
case 3 hour++
if(hour24)
hour0
writetime(3hour)
writecom(0x80+0x40+4)
break
case 4 week++
if(week8)
week1
writeweek(week)
writecom(0x80+11)
break
case 5 day++
if(day32)
day1
writenyr(6day)
writecom(0x80+7)
break
case 6 month++
if(month13)
month1
writenyr(3month)
writecom(0x80+4)
break
case 7 year++
if(year100)
year0
writenyr(0year)
writecom(0x80+1)
break
}
}
}
if(kdown0)
{
delay(5)
if(kdown0)
{
while(kdown)
di()
switch(kmenunum) 根功键次数调节相应数值
{
case 1 second
if(second1)
second59
writetime(9second)
writecom(0x80+0x40+10)
break
case 2 minute
if(minute1)
minute59
writetime(6minute)
writecom(0x80+0x40+7)
break
case 3 hour
if(hour1)
hour23
writetime(3hour)
writecom(0x80+0x40+4)
break
case 4 week
if(week0)
week7
writeweek(week)
writecom(0x80+11)
break
case 5 day
if(day0)
day31
writenyr(6day)
writecom(0x80+7)
break
case 6 month
if(month0)
month12
writenyr(3month)
writecom(0x80+4)
break
case 7 year
if(year1)
year99
writenyr(0year)
writecom(0x80+1)
break
}
}
}
}
if(kalarm0) 检测闹钟调节键否条if 语句 if(kmenunum0)
{ 层次
delay(5)
if(kalarm0)
{
flagseta~flagseta
while(kalarm)
di()
if(flagseta0) 时退出闹钟设置保存相关数值
{
flagset0 清时间设置标志 if(kalarm0) if 语句writecom(0x80+0x40)中 flagset1 条语句设置
flagset 标志位果进行闹钟时间设置会执行前面 if(kmenunum0) 语句中 flagset1 条语句
writedata(' ') 清液晶 Ri闹钟调节标志
writedata(' ')
writecom(0x0c) 取消光标闪烁
dswrite(0x8e0x00) * 允许写操作 *
dswrite(writealarmsecondsecond10*16+second10) DS1302 中保存闹钟时分秒值
dswrite(writealarmminuteminute10*16+minute10)
dswrite(writealarmhourhour10*16+hour10)
dswrite(0x8e0x80) * 禁止写操作 *
}
else 进入闹钟设置
{
sdsread(readalarmsecond)16*10+dsread(readalarmsecond)16 * 读取DS1302 中保存闹钟时分秒原始值转化十进制数存进 smh 保存面判断闹钟时间否达*
mdsread(readalarmminute)16*10+dsread(readalarmminute)16
hdsread(readalarmhour)16*10+dsread(readalarmhour)16
seconds 闹钟时间十进制数传送变量 secondminutehour调节值
minutem
hourh
writecom(0x80+0x40)
writedata('R') 液晶显示闹钟调节标志
writedata('i')
writetime(3hour) 送液晶显示闹钟时间
writetime(6minute)
writetime(9second)
}
}
}
if(kevent0) 检测事件提醒调节键否条 if 语句 if(kmenunum0)
{ 层次
delay(5)
if(kevent0)
{
flagsseta~flagsseta
while(kevent)
di()
if(flagsseta0) 时退出事件提醒设置保存相关数值
{
flagset0 清时间设置标志 if(kevent0) if 语句
writecom(0x80+9) 中 flagset1 条语句设置
flagset 标志位 果进行事件提醒时间设置
会执行前面 if(kmenunum0) 语句中 flagset1 条语句
writedata(' ') 清液晶 Ti 事件提醒调节标志
writedata(' ')
writedata(' ')
writecom(0x0c) 取消光标闪烁
dswrite(0x8e0x00) * 允许写操作 *
dswrite(writeeventyearyear10*16+year10) DS1302 中保存事件提醒年月日值
dswrite(writeeventmonthmonth10*16+month10)
dswrite(writeeventdayday10*16+day10)
dswrite(0x8e0x80) * 禁止写操作 *
}
else 进入事件提醒设置
{
yydsread(readeventyear)16*10+dsread(readeventyear)16 * 读取DS1302 中保存事件提醒年月日原始值转化十进制数存进 yymmdd 保存面判断事件提醒时间否达*
mmdsread(readeventmonth)16*10+dsread(readeventmonth)16
dddsread(readeventday)16*10+dsread(readeventday)16
yearyy 事件提醒时间十进制数传送变量 hourdaymonthweek调节值
monthmm
daydd
writecom(0x80+9)
writedata('T') 液晶显示事件提醒设置标志
writedata('i')
writedata(' ')
writenyr(0year) 送液晶显示事件提醒时间
writenyr(3month)
writenyr(6day)
}
}
}
}
void dswritebyte(uchar d) DS1302 写入字节
{
uchar i
ACCd
for(i8i>0i)
{
dsdataACC0
dsclk1 *什里时钟先 1 0 dsclk 初始化 0次循环
置 0样形成 0 开始升 恰满足 ds1302 写数升
时钟必须 0 开始求 *
dsclk0
ACCACC>>1
}
}
uchar dsreadbyte() DS1302 读出字节
{
uchar i
for(i8i>0i)
{
ACCACC>>1
ACC7dsdata
dsclk1 读数样 然降 0 开始 样设置 dsclk 刚满足求
dsclk0
}
return ACC
}
void dswrite(uchar adduchar dat) DS1302 指定址写入字节
{
dsrst0
dsclk0
dsrst1
dswritebyte(add) * 先写入址 命令字节 *
dswritebyte(dat) * 写 1Byte 数 *
dsclk1
dsrst0
}
uchar dsread(uchar add) DS1302 指定址读出字节
{
uchar dat
dsrst0
dsclk0
dsrst1
dswritebyte(add) * 先写入址 命令字节 *
datdsreadbyte() * 读 1Byte 数 *
dsclk1
dsrst0
return dat
}
void init1302time(uchar *pClock) DS1302 时间初始化函数
{
uchar i
uchar add0x80
dswrite(0x8e0x00) * 允许写操作 *
for(i7i>0i)
{
dswrite(add*pClock) * 次写入秒 分 时 日 月 星期 年 *
pClock++
add+2 DS1302 时钟寄存器占两址低位 0
} 写址 低位 1读址 add 加 2
dswrite(0x8e0x80) * 禁止写操作 *
}
void init() 初始化函数
{
uchar num
变量初始化
flagset0 时间设置标志位置 0表示未进行时间设置
flagseta0 闹钟设置标志位置 0
flagalarm0 闹钟标志位置 0
kmenunum0 功键次数计数器置 0
lcdrw0
DS1302 初始化
dswrite(0x8e0x00) * 允许写操作 *
dswrite(0x800x00) 开 DS1302 晶振开始工作
dswrite(0x840x00) 设置 24 时制
init1302time(inittime) 初始化时间:
2018 年 7 月 5 日 星期四 11 点 59 分 59 秒
左右数次秒分时日月星期年
dswrite(0x8e0x80) * 禁止写操作 *
1602 液晶初始化
writecom(0x38)开显示
writecom(0x0c)开显示显示光标
writecom(0x06)写指针加1
writecom(0x01)清屏
writecom(0x80)设置数指针起点
for(num0num<16num++) 写入液晶固定显示部分
{
writedata(t1[num])
delay(1)
}
writecom(0x80+0x40) 换液晶第二行
for(num0num<16num++)
{
writedata(t2[num])
delay(1)
}
}
void Delay_100us(uint j)延时100us
{
uchar i
for(j>0j)
for(i0i<27i++)STC89C52RC
}
void Delay_10us(void)延时10us
{
uchar i
iiiiiiSTC89C52RC
}
void COM(void)
{
uchar i
for(i0i<8i++)
{
FLAG2
while((DQ)&&FLAG++)
Delay_10us()
Delay_10us()
Delay_10us()
temp0
if(DQ)temp1
FLAG2
while((DQ)&&FLAG++)
超时跳出for循环
if(FLAG1) break
判断数位01
果高电高预定0高电值数位 1
comdata<<1
comdata|temp 0
}rof
}
湿度读取子程序
变量均全局变量
温度高8位 T_data_H
温度低8位 T_data_L
湿度高8位 RH_data_H
湿度低8位 RH_data_L
校验 8位 checkdata
调相关子程序
Delay() Delay_10us()COM()
void Read_DHT11(void)
{
机拉低18ms
DQ0
Delay_100us(180)
DQ1
总线拉电阻拉高 机延时20us
Delay_10us()
Delay_10us()
Delay_10us()
Delay_10us()
机设输入 判断机响应信号
DQ1
判断机否低电响应信号 响应跳出响应运行
if(DQ) T
{
FLAG2
判断机否发出 80us 低电响应信号否结束
while((DQ)&&FLAG++)
FLAG2
判断机否发出 80us 高电发出进入数接收状态
while((DQ)&&FLAG++)
数接收状态
COM()
RH_data_H_tempcomdata
COM()
RH_data_L_tempcomdata
COM()
T_data_H_tempcomdata
COM()
T_data_L_tempcomdata
COM()
checkdata_tempcomdata
DQ1
数校验
temp(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp)
if(tempcheckdata_temp)
{
RH_data_HRH_data_H_temp
RH_data_LRH_data_L_temp
T_data_HT_data_H_temp
T_data_LT_data_L_temp
checkdatacheckdata_temp
}fi
}fi
}
void main()
{
uchar temp
init()
while(1)
{
keyscan()
if((flagalarm1)||(flagevent1)) 闹钟时间时执行段程序启动蜂鸣器发声
{
di()
delay(100)
di()
delay(500)
}
if(flagset0&&flagseta0&&flagsseta0) 没进行时间设置 闹钟设置 事件提醒设置时 执行段程序
{
keyscan()
Read_DHT11()读取 DHT11 数
读取 DS1302 数
tempdsread(0x81) 读秒数送 temp 暂时保存
secondtemp16*10+temp16 BCD 码转换成十进制数
tempdsread(0x83)
minutetemp16*10+temp16
tempdsread(0x85)
hourtemp16*10+temp16
tempdsread(0x87)
daytemp16*10+temp16
tempdsread(0x89)
monthtemp16*10+temp16
tempdsread(0x8b)
weektemp16*10+temp16
tempdsread(0x8d)
yeartemp16*10+temp16
年月日时分秒数送液晶显示
writetime(3hour)
writetime(6minute)
writetime(9second)
writenyr(0year)
writenyr(3month)
writenyr(6day)
writeweek(week)
显示湿度
writecom(0x80+13)
writedata(RH_data_H10+'0')
writedata(RH_data_H10+'0')
writedata('')
显示温度
writecom(0x80+0x40+12)
writedata(T_data_H10+'0')
writedata(T_data_H10+'0')
writedata('')
writedata(T_data_L10+'0')
闹钟事件提醒判断
if((seconds)&&(minutem)&&(hourh))
flagalarm1
if((yearyy)&&(monthmm)&&(daydd))
flagevent1
}
}
}
4实物验证结果验证
根硬件电路图进行实物搭建焊接硬件进行调试写程序烧录单片机中硬件实物图图82示:
图82 硬件实物图
图82中出LCD1602第行显示年月日环境中湿度第二行显示时分秒环境温度外功键加键减键闹钟键事件键组合实现闹钟设置事件提醒设置时间设置温湿度显示四种功
九心体会
通次实验培养综合运学知识发现提出分析解决实际问题锻炼实践力重环节回顾次单片机实验感觉受益良中编程仿真调试开发板等步骤次课程设计懂理实际相结合重理知识远远够学知识实践相结合起理中出结真正学知识服务生活服务社会提高实际动手力独立思考力时加强学合作老师沟通收获次实验发现身足学研究中会巩固加强专业知识学研究工作坚实基础
仅供参考
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档