物理机电学院课程设计报告
课程名称: 电子系统课程设计
专业班级: 12电(2)
学 号:
学生姓名:
指导教师:
完成时间: 2015317—2015616
报告成绩:
评阅意见:
评阅教师 日期
设计课题题目: 带温度简易时钟
丶设计务求
(1)具备显示年月日星期时分秒键盘输入功
(2)具备温度测量功
(3)年月日等日期调
(4)具备闹钟功
二系统设计方案
1控制部分方案
网查阅凌阳16位单片机设计凌阳16位单片机丰富中断源时基方便实验设计准确度相高C语言汇编兼容编程环境方便实现递调IO口功较强方便凌阳16位单片机做控制器特色编程音频处理完成语音录制播放识方便设计进行扩展设计更加完善成相低
2显示部分方案
网查阅液晶显示采8段数码济实惠效果加入语音报时功操作较液晶显示说然略显繁琐总体做较性化LED数码显示
3系统基方案
(1)单片机芯片方案:
网查阅AT89S52片ROM全采Flash ROM3V超低压工作时MCS51系列单片机完全该芯片部存储器8KB ROM 存储空间样具89C51功具线编程擦技术电路进行调试时程序错误修改程序新增功需烧入程序时需芯片次拔插会芯片造成损坏
(2)显示模块方案
网查阅采LED数码动态扫描LED数码价格适中显示数字合适采动态扫描法单片机连接时占单片机口线少
(3)时钟芯片方案
网查阅采DS1302时钟芯片实现时钟DS1302芯片种高性时钟芯片动秒分时日周月年闰年补偿年进行计数精度高位RAM做数暂存区工作电压25V~55V范围25V时耗电300nA
(4)温度传感器选择方案证
方案:热敏电阻作传感器热敏电阻相应阻值相串联分压利热敏电阻阻值温度变化变化特性采两电阻变化分压值进行AD转换方案需AD转换电路增加硬件成热敏电阻感温特性曲线严格线性会产生较测量误差
方案二:采数字式温度传感器DS18B20传感器数字式传感器仅需条数线进行数传输易单片机连接AD模块降低硬件成简化系统电路外数字式温度传感器具测量精度高测量范围广等优点
单片机原理
单片机简化微型计算机CPU中身带存储器ROMRAMCPU片总线IC(集成电路)技术电路通特殊工艺做块硅基片封装成芯片CPU片外存储器等等
单片机CPU晶振存储器址锁存器逻辑门七段译码器(显示器)钮扩展芯片接口等通PCB工艺做环氧树脂板样完整单片微型计算机
1 LED显示数码
常见LED显示具清晰明亮特点显示接口绝数单片机应系统必备部件
发光二极组成显示器单片机应产品中常廉价输出设备干发光二极定规律排列成某发光二极导通时相应点笔画点亮控制组合二极导通显出种字符
显示器结构
常7段显示器结构图示发光二极阳极连起称阳极显示器阴极连起成阴显示器1位显示器8发光二极组成中7发光二极a~g控制7笔画亮暗控制数点亮暗种笔画七段显示器显示字符较少字符形状失真控简单方便
电路设计框图
工作原理:STC89C52控制系统单片机接受时钟电路温度传感器信号LCD显示电路中显示出通键电路显示时间闹钟报警温度进行设置
三单元电路分析设计
1.原理分析
(1)复位电路晶振电路(电路图图二)
复位电路电阻R1 KΩ电容C10uf键组成电动复位程序跑飞时单片机复位晶振电路12M晶振30pf电容组成
参数计算:震荡周期1震荡频率机器周期震荡周期*12系统复位时间t应该2us (t2*(112)*122us)STC89C52规格书中关DC特性描述中知道Reset Pin电压超Min07Vcc时Reset Pin会认高电事先假设系统电压5VVcc里成5V 果 Reset Pin电压07Vcc35V成Reset Pin高电果超35V电持续时间超2uS系统会复位然计算RST_H处 电 位考虑流入Reset Pin 电流该 电 路 阶RC电路电容两端暂态电流电压关系式:
设Reset pin 电压: 34V时t0357RC仅t0357RC≥2us时系统会复位满足条件RC≧R1KΩC10uf符合求
STC89C52单片机核心选12MHZ晶振晶振频率越高单片机运行速度越快考虑单片机运行速度快会导致存储器求会变高12MHZ晶振佳选择晶振电路电容没固定值外接电容会影响振荡器频率高低振荡器稳定性起振快速性选择30pf电容作起振电容
复位晶振电路图示
键电路图
显示电路LCD1602模块构成LCD1602液晶屏5V电压驱动带背光显示两行行16字符显示汉字液晶12端电源1516背光源防止直接加5V烧坏背光灯15脚串联1K电阻限流液晶3端液晶度调节端通10K变位器调节液晶显示度液晶4端液晶控制器写数写命令选择端接单片机P23口液晶5端读写选择端液晶中读取数写入命令显示数端始终选择写状态低电接液晶6端信号操作时必须信号接单片机P25口
温度传感器
温度检测电路数字温度传感器DS18B20构成传统热敏电阻等测温元件相直接读出测温度根实际求通简单编程实现912位数字值读数方式设计中DS18B20温度传感器进行环境温度采集转化单片机P20脚接DS18B20IO口脚作数读入写出口
温度传感器
时钟电路
时钟电路DS13026pf电容32768M晶振组成时钟芯片DS1302单片机STC89C52接口3条线完成单片机STC89C52P10时钟芯片数传输端相连P11作DS1302输入时钟SCLK控制端P12控制DS1302复位输入端DS1302接标准32768KHZ石英晶体
述完成Proturs中进行仿真仿真结果:
实验设计结果仿真结果致
四软件部分设计(部分程序框图)
软件部分函数DS1302ds18B20LCD1602text五程序部分组成函数text驱动文件函数程序(具体程序见附页)
void main()
{
IE0X82 开定时中断
TMOD0X01 选择定时器0工作方式1
TR00 启动定时器0
IntDS1302() 初始化DS1302
delay1ms(1)
Lcd_Int() 1602液晶初始化
delay1ms(2)
displaystar() 显示欢迎界面
displaymainpart() 显示部分(变化)
while(1)
{
display_Time( )
Set( )
if(ADD0)
{
Write_com(0x01)
delay1ms(5)
Temperature()
Write_com(0x01)
displaymainpart()
}
if((hourshoura)&&(minutesminutea)&&(seconds0))
{
if(alarmmode1)
{
Write_com(0x01)
delay1ms(5)
Write_Address(0x03)
Write_Date('T')
Write_Date('I')
Write_Date('M')
Write_Date('E')
Write_Address(0x08)
Write_Date('U')
Write_Date('P')
Write_Date('')
delay1ms(5)
while(1)
{
baojing(1)
if(CANL0)
{
Write_com(0x01)
delay1ms(5)
displaymainpart()
break
}
}
}
}
}
}
程序框图图:
实现功:程序功调DS1302DS18B20LCD1602键扫描四模块函数实现整系统运行功实现
LCD1602模块液晶显示模块驱动程序调该模块程序液晶显示屏显示单片机DS1302DS18B20中读取时间温度值
DS18B20模块温度传感器驱动程序调该模块程序读出刻温度值
DS1302模块时钟芯片驱动程序实现单片机DS1302时钟芯片间通信调里面程序实现时间初始化调整时间写入时钟芯片实现单片机时钟芯片中读取出刻时间者调整时间
键扫描模块实现键扫描时间温度显示通键扫描实现时间调整
五丶系统测试结果
功测试实际电路测试前先软件仿真仿真概整电路功设计基功实现LCD1602显示时间温度键设置复位电路电路复位仿真软件实现STC89C52开发板载程序然安装设计实际电路中LCD1602DS18B20DS1302器件安装然通电测试实际电路中功开启总开关LCD1602显示时间温度然调节K1K2K3K4键时间温度进行设置K1键选择设置位置K2键进行+操作K3键进行—操作K4键进行状态确定K5键进行状态复位复位键系统动复位通实际电路中测试软件仿真实现结果基完成整设计
六丶心体会
次电路设计中开始时候原理框架画出确定选器件否符合求然根器件写出程序进行仿真仿真成功开始画PCB时画PCB时没分配布局导致制板完成发现LCD1602单片机STC89C52距离造成调制程中键温度传感器操作时方便电路板功实现完全觉测试必须仅找出设计问题缺陷重新复设计东西知识点时提高设计力电路分析力时软件编程方面更高提高编程力加强学知识提高巩固
七参考文献
[1]郭天祥51单片机c语言教程 电子工业出版社2009
[2]边春元C51单片机典型模块设计应[M]北京:机械工业出版社2008
[3]高 歌Altium Designer电子设计应教程清华学出版社2011
[4]戴仙金51单片机c语言程序开发实例清华学出版社2008
[5]边春元C51单片机典型模块设计应[M]北京:机械工业出版社2008
附页
实验具体程序:
#include
#include
unsigned char code displaywelcome[]{ Welcome To My Lcd Timer}欢迎界面
unsigned char code displaywish[]{ Happy Every Day ^_^} 欢迎界面
unsigned char code overtemperature[]{OVERTEMPERATURE}
unsigned char code digit[]{0123456789} 数字代码
unsigned char modeTHTLTNTDlengthtempswitchMaxtemp40amodealarmmodeminuteshours
minuteasecondshoura12
sbit SCLKP1^0 DS1302时钟输入
sbit DATEP1^1 DS1302数输入
sbit RESTP1^2 DS1302复位端口
sbit SETP1^4 DS1302设置模式选择位
sbit ADDP1^5 增加
sbit REDP1^6 减
sbit CANLP1^7
void delay1ms(int i)1毫秒延时
{
int jk
while(i)
for(j76j>1j)
for(k29k>1k)
}
void delaynus(unsigned char n) 延时干微秒
{
unsigned char i
for(i0i
***********蜂鸣器模块************
sbit beepP3^6 位定义定义P6位fmp
void dely500(void)
{
unsigned char i
for(i250i>0i)
{
_nop_()
}
}
void baojing(unsigned char n)
{
unsigned char xi
while(n)
{
for(i0i<5i++)
{
for(x0x<200x++)
{
beep~beep
dely500()
}
}
for(i0i<3i++)
{
for(x0x<200x++)
{
beep~beep
dely500()
dely500()
}
}
}
}
*******DS1302模块*************
void Write1302(unsigned char date)1302写数
{
unsigned char i
SCLK0
delaynus(2)
for(i0i<8i++)
{
DATEdate&0x01
SCLK1
delaynus(2)
SCLK0
delaynus(2)
date>>1
}
}
void WriteSet1302(unsigned char cmdunsigned char date) 根相应命令输入相应数
{
REST0
SCLK0
REST1
Write1302(cmd)
delaynus(5)
Write1302(date)
SCLK1
REST0
}
unsigned char Read1302(void) 读取1302数
{
unsigned char idate
delaynus(2)
for(i0i<8i++)
{
date>>1
if(DATE1)
date|0x80
SCLK1
delaynus(2)
SCLK0
delaynus(2)
}
return date
}
unsigned char ReadSet1302(unsigned char cmd)根命令读取1302相应值
{
unsigned char date
REST0
SCLK0
REST1
Write1302(cmd)
delaynus(2)
dateRead1302()
SCLK1
REST0
return date
}
void IntDS1302(void) DS1302初始化
{
unsigned char flag
flag ReadSet1302(0x81)
if(flag&0x80) { 判断时钟芯片否关闭
WriteSet1302(0x8E0x00) 根写状态寄存器命令字写入保护指令
WriteSet1302(0x80((010)<<4|(010))) 根写秒寄存器命令字写入秒初始值
WriteSet1302(0x82((010)<<4|(010))) 根写分寄存器命令字写入分初始值
WriteSet1302(0x84((010)<<4|(010))) 根写时寄存器命令字写入时初始值
WriteSet1302(0x86((010)<<4|(010))) 根写日寄存器命令字写入日初始值
WriteSet1302(0x88((010)<<4|(010))) 根写月寄存器命令字写入月初始值
WriteSet1302(0x8c((1010)<<4|(1010))) 根写年寄存器命令字写入年初始值
WriteSet1302(0x900xa5) 开充电功 选择2K电阻充电方式
WriteSet1302(0x8E0x80) 根写状态寄存器命令字写入保护指令
}
}
***************液晶显示模块*****************
sbit RSP2^5
sbit RWP2^6
sbit EP2^7
sbit BFP0^7
*液晶忙检测*
bit BusyTest(void)
{
bit result
RS0
RW1
E1
_nop_()
_nop_()
_nop_()
resultBF
_nop_()
_nop_()
_nop_()
E0
return result
}
*写指令*
void Write_com(unsigned char command)
{
while(BusyTest()0)
RS0
RW0
E0
_nop_()
_nop_()
_nop_()
P0command
_nop_()
_nop_()
_nop_()
E1
_nop_()
_nop_()
_nop_()
E0
}
*写址*
void Write_Address(unsigned char address)
{
Write_com(address|0x80)
delay1ms(1)
}
*写数*
void Write_Date(unsigned char date)
{
RS1
RW0
E0
_nop_()
_nop_()
_nop_()
P0date
_nop_()
_nop_()
_nop_()
E1
_nop_()
_nop_()
_nop_()
E0
delay1ms(1)
}
*初始化*
void Lcd_Int(void)
{
Write_com(0x38)
delay1ms(1)
Write_com(0x38)
delay1ms(1)
Write_com(0x06)
delay1ms(1)
Write_com(0x0c)
delay1ms(1)
Write_com(0x01)
}
void displaymainpart(void)显示液晶部分(变化部分)
{
Write_Address(0x01)
delay1ms(1)
Write_Date('D')
Write_Date('A')
Write_Date('T')
Write_Date('E')
Write_Date('')
delay1ms(1)
Write_Address(0x0A)
delay1ms(1)
Write_Date('')
Write_Address(0x0D)
Write_Date('')
Write_Address(0x42)
Write_Date('T')
Write_Date('I')
Write_Date('M')
Write_Date('E')
Write_Date('')
Write_Address(0x4A)
Write_Date('')
Write_Address(0x4D)
Write_Date('')
Write_Address(0x06)
Write_Date('2')
Write_Date('0')
}
void display_Second(unsigned char second) 液晶显示秒
{
unsigned char ij
isecond10
jsecond10
Write_Address(0x4E)
Write_Date(digit[i])
Write_Date(digit[j])
delay1ms(1)
}
void display_Minute(unsigned char minute) 液晶显示分
{
unsigned char ij
iminute10
jminute10
Write_Address(0x4B)
Write_Date(digit[i])
Write_Date(digit[j])
delay1ms(1)
}
void display_Hour(unsigned char hour) 液晶显示时
{
unsigned char ij
ihour10
jhour10
Write_Address(0x48)
Write_Date(digit[i])
Write_Date(digit[j])
delay1ms(1)
}
void display_Day(unsigned char day) 液晶显示日
{
unsigned char ij
iday10
jday10
Write_Address(0x0E)
Write_Date(digit[i])
Write_Date(digit[j])
delay1ms(1)
}
void display_Month(unsigned char month) 液晶显示月
{
unsigned char ij
imonth10
jmonth10
Write_Address(0x0B)
Write_Date(digit[i])
Write_Date(digit[j])
delay1ms(1)
}
void display_Year(unsigned char year) 液晶显示年
{
unsigned char ij
iyear10
jyear10
Write_Address(0x08)
Write_Date(digit[i])
Write_Date(digit[j])
delay1ms(1)
}
void display_houra(unsigned char x) 闹钟时部分显示
{
unsigned char ij
ix10
jx10
Write_Address(0x44)
Write_Date(digit[i])
Write_Date(digit[j])
}
void display_minutea(unsigned char x)闹钟分钟部分显示
{
unsigned char ij
ix10
jx10
Write_Address(0x47)
Write_Date(digit[i])
Write_Date(digit[j])
}
void display_Time(void) 显示实时时间
{
unsigned char valuedaymonthyear
Write_com(0x0c)
valueReadSet1302(0x81)
seconds(((value&0x70)>>4)*10+(value&0x0f))
display_Second(seconds)
valueReadSet1302(0x83)
minutes(((value&0x70)>>4)*10+(value&0x0f))
display_Minute(minutes)
valueReadSet1302(0x85)
hours(((value&0x70)>>4)*10+(value&0x0f))
display_Hour(hours)
valueReadSet1302(0x87)
day(((value&0x70)>>4)*10+(value&0x0f))
display_Day(day)
valueReadSet1302(0x89)
month(((value&0x70)>>4)*10+(value&0x0f))
display_Month(month)
valueReadSet1302(0x8D)
year(((value&0xf0)>>4)*10+(value&0x0f))
display_Year(year)
}
void displaystar(void) 显示欢迎界面
{
unsigned char ij
Write_Address(0x0f)
while(displaywelcome[i]'\0')
{
Write_Date(displaywelcome[i])
i++
delay1ms(1)
}
i0
Write_Address(0x4f)
while(displaywish[i]'\0')
{
Write_Date(displaywish[i])
i++
delay1ms(1)
}
j40
while(j)
{
Write_com(0x18)循环左移
delay1ms(700)
}
Write_com(0x01)
delay1ms(10)
}
void gbdisplay(unsigned char address) 时间调整时光标闪烁
{
Write_Address(address)
delay1ms(5)
Write_com(0x0f)
delay1ms(5)
}
void displaymaxt(unsigned char x) 显示温度
{
unsigned char ijk
Write_com(0x0c)
delay1ms(2)
Write_Address(0x44)
ix100
jx10
kx10
Write_Date(digit[i])
Write_Date(digit[j])
Write_Date(digit[k])
}
*****************时间调整部分*********************
void hourset(void) 调时
{
unsigned char timevaluehour
delay1ms(500) 防止次触发
WriteSet1302(0x8e0x00)写保护掉确保正常调整数值写入DS1302
timevalueReadSet1302(0x85) 读取时数值
hour(((timevalue&0x70)>>4)*10+(timevalue&0x0f))
while(1)
{
if(ADD0)
{
delay1ms(50)
if(ADD0)
{
hour++
delay1ms(300)
while(ADD0)
}
}
if(RED0)
{
delay1ms(50)
if(RED0)
{
hour
delay1ms(300)
if(hour0) hour23
while(RED0)
}
}
timevalue(((hour)10)<<4|(hour10))
WriteSet1302(0x84timevalue)
delay1ms(1)
display_Hour(hour)
Write_Address(0x49)
delay1ms(5)
if(hour>24) hour0
delay1ms(5)
if(CANL0)
{
mode0
Write_com(0x0c)
break
}
if(SET0) break
}
WriteSet1302(0x8e0x80)
}
void minuteset(void) 调分
{
unsigned char timevalueminute
delay1ms(500)
WriteSet1302(0x8e0x00)
timevalueReadSet1302(0x83)
minute(((timevalue&0x70)>>4)*10+(timevalue&0x0f))
while(1)
{
if(ADD0)
{
delay1ms(10)
if(ADD0)
{
minute++
if(minute>60) timevalue0
while(ADD0)
}
}
if(RED0)
{
delay1ms(10)
if(RED0)
{
minute
delay1ms(300)
if(minute0) minute59
while(RED0)
}
}
timevalue((minute10)<<4|(minute10))
WriteSet1302(0x82timevalue)
delay1ms(1)
display_Minute(minute)
Write_Address(0x4c)
delay1ms(5)
if(minute>60) minute0
delay1ms(5)
if(CANL0)
{
mode0
Write_com(0x0c)
break
}
if(SET0) break
}
WriteSet1302(0x8e0x80)
}
void secondset(void) 秒零
{
unsigned char second
delay1ms(500)
WriteSet1302(0x8e0x00)
while(1)
{
if(ADD0)
{
delay1ms(10)
if(ADD0)
{
second0
WriteSet1302(0x800x00)
while(ADD0)
}
}
delay1ms(1)
display_Second(second)
Write_Address(0x4f)
delay1ms(5)
if(CANL0)
{
mode0
Write_com(0x0c)
break
}
if(SET0) break
}
WriteSet1302(0x8e0x80)
}
void yearset(void) 调年
{
unsigned char datevalueyear
delay1ms(500)
WriteSet1302(0x8e0x00)
datevalueReadSet1302(0x8d)
year(((datevalue&0x70)>>4)*10+(datevalue&0x0f))
while(1)
{
if(ADD0)
{
delay1ms(10)
if(ADD0)
{
year++
while(ADD0)
}
}
if(RED0)
{
delay1ms(10)
if(RED0)
{
year
delay1ms(300)
while(RED0)
}
}
datevalue((year10)<<4|(year10))
WriteSet1302(0x8cdatevalue)
delay1ms(5)
display_Year(year)
delay1ms(5)
Write_Address(0x09)
delay1ms(5)
if(CANL0)
{
mode0
Write_com(0x0c)
break
}
if(SET0) break
}
WriteSet1302(0x8e0x80)
}
void monthset(void) 调月
{
unsigned char datevaluemonth
delay1ms(500)
WriteSet1302(0x8e0x00)
datevalueReadSet1302(0x89)
month(((datevalue&0x70)>>4)*10+(datevalue&0x0f))
while(1)
{
if(ADD0)
{
delay1ms(10)
if(ADD0)
{
month++
if(month>12) month1
while(ADD0)
}
}
if(RED0)
{
delay1ms(10)
if(RED0)
{
month
delay1ms(300)
if(month0) month12
while(RED0)
}
}
datevalue((month10)<<4|(month10))
WriteSet1302(0x88datevalue)
delay1ms(1)
display_Month(month)
Write_Address(0x0c)
delay1ms(5)
if(CANL0)
{
mode0
Write_com(0x0c)
break
}
if(SET0) break
}
WriteSet1302(0x8e0x80)
}
void dayset(void) 调日
{
unsigned char datevalueday
delay1ms(500)
WriteSet1302(0x8e0x00)
datevalueReadSet1302(0x87)
day(((datevalue&0x70)>>4)*10+(datevalue&0x0f))
while(1)
{
if(ADD0)
{
delay1ms(10)
if(ADD0)
{
day++
if(day>31) day1
while(ADD0)
}
}
if(RED0)
{
delay1ms(10)
if(RED0)
{
day
delay1ms(300)
if(day0) day31
while(RED0)
}
}
datevalue((day10)<<4|(day10))
WriteSet1302(0x86datevalue)
delay1ms(1)
display_Day(day)
Write_Address(0x0f)
delay1ms(5)
if(CANL0)
{
mode0
Write_com(0x0c)
break
}
if(SET0) break
}
WriteSet1302(0x8e0x80)
}
void alarmhourset(void) 闹钟时调整
{
unsigned char value
valuehoura
while(1)
{
if(ADD0)
{
delay1ms(20)
if(ADD0)
{
Write_com(0x0c)
delay1ms(5)
value++
if(value>23) value0
while(ADD0)
}
}
if(RED0)
{
delay1ms(20)
if(RED0)
{
value
if(value0) value23
while(RED0)
}
}
houravalue
display_houra(houra)
gbdisplay(0x45)
if(CANL0)
{
delay1ms(500)
break
}
}
}
void alarmminuteset(void) 闹钟分钟调整
{
while(1)
{
if(ADD0)
{
delay1ms(20)
if(ADD0)
{
minutea++
if(minutea>59) minutea0
while(ADD0)
}
}
if(RED0)
{
delay1ms(20)
if(RED0)
{
minutea
if(minutea0) minutea59
while(RED0)
}
}
display_minutea(minutea)
gbdisplay(0x48)
if(CANL0)
{
delay1ms(500)
break
}
}
}
void TimeSet(void) 时间调整函数
{
display_Time()
if(SET0)
{
delay1ms(10)
if(SET0)
{
mode++
delay1ms(20)
switch(mode)
{
case(1){gbdisplay(0x48)hourset() delay1ms(500)} break
case(2){gbdisplay(0x4c)minuteset()delay1ms(500)} break
case(3){gbdisplay(0x4f)secondset()delay1ms(500)} break
case(4){gbdisplay(0x09)yearset()delay1ms(500)} break
case(5){gbdisplay(0x0c)monthset()delay1ms(500)} break
case(6){gbdisplay(0x0f)dayset()delay1ms(500)} break
}
if(mode7) mode0
}
}
}
***************显示温度模块********************
unsigned char code displayexplain[]{Digit thermometer}
unsigned char code displayerror[]{DS18B20 ERROR}
unsigned char code displayerror1[]{PLEASE CHECK }
unsigned char code displaypart1[]{WenDu}
unsigned char code displaypart2[]{Cent}
unsigned char flag
**********************操作DS18B20模块***************************
sbit DQP3^3
unsigned char time
**********************DS18B20初始化****************************
bit IntDS18B20(void)
{
bit temp
DQ1
for(time0time<2time++)
DQ0
for(time0time<200time++)
DQ1
for(time0time<10time++)
tempDQ
for(time0time<200time++)
return temp
}
**************************读DS18B20**********************
unsigned char ReadDS18B20(void)
{
unsigned char i
unsigned char dat
for(i0i<8i++)
{
DQ1
_nop_()
DQ0
_nop_()
DQ1
for(time0time<2time++)
dat>>1
if(DQ1)
datdat|0x80
else
datdat|0x00
for(time0time<10time++)
}
return dat
}
*********************DS18B20写数**************************
void WriteDS18B20(unsigned char date)
{
unsigned char i
for(i0i<8i++)
{
DQ1
_nop_()
DQ0
DQdate&0x01
for(time0time<10time++)
DQ1
for(time0time<1time++)
date>>1
}
for(time0time<4time++)
}
*******************读取温度做准备************************
void ReadyreadDS18B20(void)
{
IntDS18B20()
WriteDS18B20(0XCC)
WriteDS18B20(0X44)
delay1ms(200)
IntDS18B20()
WriteDS18B20(0XCC)
WriteDS18B20(0XBE)
}
*************1602液晶显示相关信息模块**********************
****************未检测DS18B20时显示信息模块****************
void Display_Error(void)
{
unsigned char i0
Write_Address(0x00)
while(displayerror[i]'\0')
{
Write_Date(displayerror[i])
i++
delay1ms(100)
}
delay1ms(5)
i0
Write_Address(0x40)
while(displayerror1[i]'\0')
{
Write_Date(displayerror1[i])
i++
delay1ms(100)
}
delay1ms(3000)
}
*************温度显示模块****************
void Display_Explain(void)
{
unsigned char i0
Write_Address(0x00)
delay1ms(5)
while(displayexplain[i]'\0')
{
Write_Date(displayexplain[i])
i++
delay1ms(5)
}
i0
Write_Address(0x40)
while(displaypart1[i]'\0')
{
Write_Date(displaypart1[i])
i++
delay1ms(5)
}
i0
Write_Address(0x4C)
while(displaypart2[i]'\0')
{
Write_Date(displaypart2[i])
i++
delay1ms(5)
}
Write_Address(0x49)
Write_Date('')
delay1ms(5)
}
*********************显示温度整数部分*************************
void Display_Integer(unsigned char x)
{
unsigned char ijk
ix100
jx10010
kx10
Write_Address(0x46)
if(flag1) Write_Date('')
Write_Date(digit[i])
Write_Date(digit[j])
Write_Date(digit[k])
delay1ms(50)
}
************显示温度数部分*********************
void Display_Decimal(unsigned char x)
{
Write_Address(0x4A)
delay1ms(5)
Write_Date(digit[x])
delay1ms(50)
}
void displayovert(void)
{
unsigned char i
Write_com(0x01)
delay1ms(10)
Write_Address(0x03)
delay1ms(10)
Write_Date('W')
Write_Date('A')
Write_Date('R')
Write_Date('N')
Write_Date('I')
Write_Date('N')
Write_Date('G')
Write_Date('')
Write_Address(0x40)
while(overtemperature[i]'\0')
{
Write_Date(overtemperature[i])
i++
delay1ms(10)
}
}
*******************温度函数********************
void Temperature(void)
{
unsigned char i
delay1ms(5)
if(IntDS18B20()0) Display_Error()
else
{
delay1ms(1)
Write_com(0x01)
delay1ms(5)
Display_Explain()
for(length50length>0length)
{
for(i0i<6i++)
{
flag0
ReadyreadDS18B20()
TLReadDS18B20()
THReadDS18B20()
if((TH&0XF8)0X00)
{
flag1
TL~TL
TH~TH
TL+1
if(TL>255) TH+1
TNTH*16+TL16
TD(TL16)*1016
}
TNTH*16+TL16
TD(TL16)*1016
Display_Integer(TN)
Display_Decimal(TD)
delay1ms(10)
}
if(tempswitch1)
{
if(TN>Maxtemp)
{
Write_Address(0x03)
delay1ms(5)
displayovert()
while(1)
{
baojing(1)
if(CANL0)
{
Write_com(0x01)
delay1ms(5)
break
}
}
}
}
if(CANL0) break
}
}
}
void tempset(void)
{
if(ADD0)
{
delay1ms(10)
if(ADD0)
{
Maxtemp++
while(ADD0)
}
}
if(RED0)
{
delay1ms(10)
if(RED0)
{
Maxtemp
while(RED0)
}
}
}
void Maxtempset(void) 高温报警设置
{
Write_com(0x01)
delay1ms(10)
Write_Address(0x03)
delay1ms(10)
Write_Date('T')
Write_Date('E')
Write_Date('M')
Write_Date('P')
Write_Address(0x09)
Write_Date('S')
Write_Date('E')
Write_Date('T')
Write_Address(0x40)
Write_Date('M')
Write_Date('A')
Write_Date('X')
Write_Date('')
while(1)
{
if(SET0)
{
delay1ms(20)
if(SET0)
{
Write_Address(0x4e)
Write_com(0x0f)
while(1)
{
if(ADD0)
{
delay1ms(20)
if(ADD0)
{
Write_Address(0x4b)
delay1ms(5)
Write_Date('O')
Write_Date('N')
Write_Date(' ')
tempswitch1
}
}
if(RED0)
{
delay1ms(20)
if(RED0)
{
Write_Address(0x4b)
Write_Date('O')
Write_Date('F')
Write_Date('F')
tempswitch0
}
}
if(CANL0)
{
delay1ms(500)
break
}
}
}
}
if(tempswitch1)
{
Write_Address(0x4b)
Write_Date('O')
Write_Date('N')
Write_Date(' ')
tempset()
displaymaxt(Maxtemp)
if(CANL0)
{
Write_com(0x01)
displaymainpart()
break
}
}
if(tempswitch0)
{
Write_com(0x0c)
Write_Address(0x4b)
Write_Date('O')
Write_Date('F')
Write_Date('F')
}
if(CANL0)
{
Write_com(0x01)
displaymainpart()
break
}
}
}
void alarmswitchset(void)
{
while(1)
{
if(ADD0)
{
delay1ms(100)
if(ADD0)
{
alarmmode1
Write_Address(0x4c)
Write_Date('O')
Write_Date('N')
Write_Date(' ')
}
}
if(RED0)
{
alarmmode0
Write_Address(0x4c)
Write_Date('O')
Write_Date('F')
Write_Date('F')
}
if(CANL0)
{
delay1ms(500)
break
}
}
}
**************** 设置模块 ******************
void Set(void)
{
if(SET0)
{
delay1ms(10)
if(SET0)
{
Write_Address(0x40)
Write_Date('T')
Write_com(0x0f)
delay1ms(1000)
Write_com(0x0c)
while(1)
{
TimeSet()
if(ADD0)
{
delay1ms(20)
if(ADD0)
{
Write_com(0x01)
Write_Address(0x00)
delay1ms(5)
Write_Date('S')
delay1ms(10)
Maxtempset()
}
}
if(RED0)
{
delay1ms(20)
if(RED0)
{
Write_com(0x01)
delay1ms(5)
Write_Address(0x02)
Write_Date('A')
Write_Date('L')
Write_Date('A')
Write_Date('R')
Write_Date('M')
Write_Address(0x09)
Write_Date('S')
Write_Date('E')
Write_Date('T')
Write_Address(0x46)
Write_Date('')
display_houra(houra)
display_minutea(minutea)
if(alarmmode1)
{
Write_Address(0x4c)
Write_Date('O')
Write_Date('N')
Write_Date(' ')
}
if(alarmmode0)
{
Write_Address(0x4c)
Write_Date('O')
Write_Date('F')
Write_Date('F')
}
while(1)
{
if(SET0)
{
delay1ms(100)
if(SET0)
{
amode++
switch(amode)
{
case(1){gbdisplay(0x45)alarmhourset()Write_com(0x0c)delay1ms(500)} break
case(2){gbdisplay(0x48)alarmminuteset()Write_com(0x0c)delay1ms(500)} break case(3){gbdisplay(0x4c)alarmswitchset()Write_com(0x0c)delay1ms(500)} break
}
if(amode4) amode0
}
}
if(CANL0)
{
Write_com(0x01)
delay1ms(5)
displaymainpart()
break
}
}
}
}
if(CANL0)
{
Write_Address(0x40)
Write_Date(' ')
Write_com(0x0c)
break
}
}
}
}
}
***************函数**********************
void main()
{
IE0X82 开定时中断
TMOD0X01 选择定时器0工作方式1
TR00 启动定时器0
IntDS1302() 初始化DS1302
delay1ms(1)
Lcd_Int() 1602液晶初始化
delay1ms(2)
displaystar() 显示欢迎界面
displaymainpart() 显示部分(变化)
while(1)
{
display_Time( )
Set( )
if(ADD0)
{
Write_com(0x01)
delay1ms(5)
Temperature()
Write_com(0x01)
displaymainpart()
}
if((hourshoura)&&(minutesminutea)&&(seconds0))
{
if(alarmmode1)
{
Write_com(0x01)
delay1ms(5)
Write_Address(0x03)
Write_Date('T')
Write_Date('I')
Write_Date('M')
Write_Date('E')
Write_Address(0x08)
Write_Date('U')
Write_Date('P')
Write_Date('')
delay1ms(5)
while(1)
{
baojing(1)
if(CANL0)
{
Write_com(0x01)
delay1ms(5)
displaymainpart()
break
}
}
}
}
}
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档