版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上中南林业科技大学单片机C51程序设计课程设计报告设计名称: 温度报警系统 姓 名: 高枫 学 号: 专 业: 2016级电子信息工程一班 院 (系): 计算机与信息工程学院 设计时间: 2018秋第1518周 设计地点: 中南林业科技大学 指导教师评语: 成绩: 签名: 年 月 日目录一、 题目二、 任务与要求三、 课程设计摘要及整体框图1、 总体设计思路概述2、 硬件设计概述3、 软件设计概述4、 程序流程图四、 课程设计原理分析及相关知识概述五、 结论六、 体会与收获附件:1、 源程序代码(加注释)2、 整体电路原理图3、 元器件清单一、题目设计一个可调时、可设置
2、温度并报警的温度报警系统二、任务与要求一)、任务: 设计并制作一个基于LCD1602液晶显示,采用DS1302时钟芯片显示时间,DS18B20采集温度的可调时,可设置报警温度的温度报警系统。二)、要求:利用单片机CPU芯片STC89C52、LCD1602、DS18B20、DS1302、蜂鸣器、按键等,设计一个可调时、可设置温度并报警的温度报警系统。由DS18B20感知环境温度、DS1302时钟芯片控制时间运行,利用单片机外部中断INT0、INT1及按键设置温度和时间、用LCD1602显示,当超过设置温度3的时候蜂鸣器报警。三、课程设计摘要及整体框图 一)课程设计摘要:本设计通过LCD1602显
3、示由DS1302设置的时间(时、分、秒)、DS18B20采集的环境温度(摄氏度)、以及通过外部中断INT0、INT1两个中断即独立按键K4、K1、K2设置当前时间,按键K3设定目标温度。当环境温度在目标温度的3的范围内时蜂鸣器不报警,否则蜂鸣器报警。LCD1602液晶显示DS1302设置时间二)整体框图按键K3即外部中断0STC89C52芯片按键K4即外部中断1蜂鸣器报警DS18B20采集温度三)总体设计思路DS1302是一个精确的时钟芯片,能够计算2100年前的时间,具有闰年调整的能力,设计只需要用到芯片的时、分、秒。DS18B20是一款性能优良的数字温度传感器,通过DS18B20采集实时环
4、境温度,外部中断0设置目标温度,当二者温度相差大于3时,蜂鸣器报警,否则正常测量。通过外部中断1进入时钟调时功能,通过按键K1,移位,按键K2进行加一操作,来调整时钟的时分秒。四)硬件设计概述本设计通过仿真平台Protues 7.0进行基础的硬件仿真操作,先添加添加元器件AT89C52芯片 以及一些其他的电阻,电容和按键,其中P30, P31, P32, P33口分别连接独立按键K1,K2,K3,K4。DS18B20,DS1302分别在对应的端口正确连接即可。需要注意的是,DS18B20在仿真时不会出现真实的温度值,在连接LCD1602时,则需要添加上拉电阻,本设计的硬件设计较为简单,在此不再
5、一一赘述,详见附件硬件设计原理图。五)软件设计概述软件采用头文件方式编程,分为主程序模块TCmain模块,LCD1602初始设置模块,DS18B20初始设置模块,DS1302初始设置模块四个部分。其中LCD1602初始设置模块,DS18B20初始设置模块,DS1302初始设置模块,均是根据三个原件的时序图来编写,固定使用。详见附件源程序代码。这里主要介绍TCmain模块,在这里调用DS18B20采集的温度并进行装换,设置的时间均通过LCD1602显示出来。采用了外部中断0 1,在这两个中断服务程序里面,一个进行再数组里面移位,进行温度显示。另外一个设置时间进入调时功能以及正常显示功能。6)程序
6、流程图TCmain四、课程设计原理分析及相关知识概述1、LCD1602也称1602字符型液晶,专门显示字母、数字、符号的点阵型液晶模块。由若干个5x7或5x10的点阵字符位组成,显示通过ASCII码值直接显示。写入显示地址要求最高位D7位为高电平,写入数据应该加上0x80.2、DS18B20数字温度传感器可用于多种场合,具有适应电压范围宽、精度高、抗干扰纠错能力强、速度快的特点。核心功能是可以直接读出数字的温度数值。其默认精度为12位即0.0625,通过初始化时序、读时序、写时序进行传感器的初始化。得到的12位数据,前五位为符号位。大于0时数据乘以0.0625即可得到实际温度。3、DS1302
7、时钟芯片具有计算2100年之前的秒、分、时、日、月、年、周以及闰年调整的能力。采用SPI 3线接口,采用双电源供应。共有12个寄存器,存储格式为秒、分、时、日、月、周、年,存放数据格式为BCD码形式。数据输入输出均从低位0到高位7。在液晶显示时要将BCD码转化成二进制码,转换方式为当4位二进制码大于1001时加6即可。五、结论下载到单片机开发板上验证的,设计的温度报警装置基本实现了功能。但是较为遗憾的是,由于DS18B20温度传感器测量得到的温度与实际的环境温度有较大的误差。比如手机显示天气温度为2,但是传感器测量得到温度为9。再者就是由于DS1302与DS18B20二者的时序冲突问题,在调整
8、时间时,温度传感器不能与C52芯片通信,此刻温度会显示零。六、体会与收获在大二由周凯老师讲述单片机课程时,采用的是汇编语言讲述,但是具体操作时采用的是C语言编写,二者有较大的区别,并不能详细理解单片机的内涵。并且由于上学期周老师讲述进度过慢,后面的SPI总线、I2C、LCD602等均没有经过系统学习。本学期不仅仅系统学习基于硬件的C51语言,也系统学习了I2C、LCD1602、DS18B20等元器件的使用。谢老师认真负责,讲述详实,本学期收获颇丰。本次课设是对这学期所学知识的总结,所做的温度报警装置用到了LCD1602、DS18B20、DS1302、中断以及基本的C51知识,期间碰到了一些较为
9、棘手的问题,比如DS18B20和DS1302二者冲突不能同时同单片机通信,温度值一直为零,经过排查二者有段代码导致了时序冲突,解决这个问题后,就实现了所要实现的基本功能,较好的运用了本学期所学内容。 附件:1、源程序代码(加注释)1)主函数:#include "reg52.h"#include "math.h"#include "lcd1602.h"#include "DS18b20.h"#include "DS1302.h"sbit k1=P30; /按键K1 调时功能的移位键sbit k2=
10、P31; /按键K2 调试功能的加一键sbit k3=P32; /按键K3 温度设置键sbit k4=P33; /按键K4 进入调时功能的按键sbit beep=P15; /蜂鸣器接口typedef unsigned int u16;typedef unsigned char u8;u8 set,setp,p=0,a,g,f=0;u8 lcd35;u8 codel10=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39;/LCD1602使用的ASCII码值u8 temp32=0x00,0x01,0x02,0x03,0x04,0x05,0x06,0
11、x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, 0x28,0x29,0x30,0x31; /设置温度的数组,范围为BCD码值为0到31void Tctemp(int temp) /温度显示函数float tp;u8 i;if(temp<0) /温度值小于0则减一,取反temp=temp-1;temp=temp;tp=temp;temp=tp*0.0625*100+0.5;/加上0.5为了四舍五入;elsetp =temp;tem
12、p=tp*0.0625*100+0.5; lcd16=ltemp%10000/1000; /得到十位lcd17=ltemp%1000/100; /得到个位lcd18=0x2e; /小数点 . lcd19=ltemp%100/10; /十分位lcd20=ltemp%10; /百分位lcd21=0xdf;lcd22=0x43;/二者构成的符号lcdwrc(0xc9);/第四位开始显示for(i=16;i<=22;i+)lcdwrd(lcdi); a=temp/100; /温度取整数两位void Tctime()/时间显示与设置函数if(set=0) Ds1302ReadTime();else
13、if(k1=0)delay(10000);/延时消抖if(k1=0)if(setp>=2)/调整调时的位置setp=0;elsesetp+;if (k2=0)delay(10000);if (k2=0)TIMEsetp+;if(TIMEsetp&0x0f)>9)/*ASCII码换成BCD码,换算规则低四位大于9则低四位减六修正,计算机按补码运算,实际加六运算*/TIMEsetp=TIMEsetp+6;if(TIMEsetp>=0x60)&&(setp<2)/分秒只能到59TIMEsetp=0;if(TIMEsetp>=0x24)&&
14、amp;(setp=2)/小时只能到23TIMEsetp=0;lcdwrc(0x84);lcdwrd('0'+TIME2/16);/时 将BCD码值装换成ASCII码值lcdwrd('0'+(TIME2&0x0f); lcdwrd(':');lcdwrd('0'+TIME1/16);/分lcdwrd('0'+(TIME1&0x0f);lcdwrd(':');lcdwrd('0'+TIME0/16);/秒lcdwrd('0'+(TIME0&0x0
15、f);void init0() /中断初始化EX0=1; /外部中断0IT0=1;EX1=1; /外部中断1IT1=1;EA=1;void int0() interrupt 0/外部中断0delay(10000);if (k3=0)if(setp=31)p=0;elsep+;/温度设置的数组指针f=1; /按下按键开始比较void init2() interrupt 2 /外部中断1delay(10000);if (k4=0) set=set;setp=0;Ds1302Init();f=f;/*f取反的原因是,进入调时时温度会变 成0,为了防止此时蜂鸣器响起,因此取反*/void dis()
16、/设置温度显示函数u8 i;lcd23= 0x53;lcd24= 0x65;lcd25= 0x74;lcd26= 0x3a;lcd27= ltempp/16;/BCD码装换成ASCIII值lcd28= ltempp&0X0f;lcd29=0xdf;lcd30=0x43;lcdwrc(0xc0);for(i=23;i<=30;i+)lcdwrd(lcdi);g=(tempp/16)*10+(tempp&0x0f); /设置的温度计算得到两位整数if (abs(a-g)>3)&&(f=1) /温差大于3时蜂鸣器响for(i=100;i+;i<=20
17、000)beep=beep;delay(i);void main() lcdinit();init0();while(1) Tctemp(Ds18b20ReadTemp(); Tctime(); dis();2)LCD1602初始化函数根据1602的时序图编写初始化函数,时序图如下其中RS=0 写入数据,RS=1 写入命令#include "lcd1602.h"void delay(unsigned char i)/延时函数while(i-);void lcdwrc(unsigned int c)/写入命令delay(1000);RS=0;RW=0;E=0;P0=c;E=1
18、;delay(1000);E=0;void lcdwrd(unsigned char dat)/写入数据delay(1000);RS=1;RW=0;E=0;P0=dat;E=1;delay(1000);E=0;RS=0;void lcdinit()/初始化delay(500);lcdwrc(0x38); /8位总线,显示两行,5x10的点阵delay(500);lcdwrc(0x80); / 设置指针起点lcdwrc(0x01); /清屏指令lcdwrc(0x06); /光标右移,屏幕不移动lcdwrc(0x0c); /显示功能开,无光标3)LCD1602头文件#ifndef _lcd1602
19、_#define _lcd1602_#include "reg52.h"sbit RW=P25;sbit RS=P26;sbit E=P27;void delay(unsigned char i);/延时函数void lcdwrc(unsigned int c);/写入命令void lcdwrd(unsigned char dat);/写入数据void lcdinit();/初始化#endif4) DS1302初始化函数根据DS1302时序写入初始化函数#include "DS1302.h"uchar code READ_RTC_ADDR7 = 0x81
20、, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d; uchar code WRITE_RTC_ADDR7 = 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c; /DS1302时钟初始化2019年1月1日星期1 00点00分00秒。uchar TIME7 = 0, 0x00, 0x00, 0x01, 0x01, 0x02, 0x18; /存储顺序是秒分时日月周年,存储格式是用BCD码void Ds1302Write(uchar addr, uchar dat)uchar n;RST = 0;_nop_();SCLK = 0;/先将SCLK
21、置低电平。_nop_();RST = 1; /然后将RST(CE)置高电平。_nop_();for (n=0; n<8; n+)/开始传送八位地址命令DSIO = addr & 0x01;/数据从低位开始传送addr >>= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();for (n=0; n<8; n+)/写入8位数据DSIO = dat & 0x01;dat >>= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();
22、 RST = 0;/传送数据结束_nop_();uchar Ds1302Read (uchar addr)uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;/先将SCLK置低电平。_nop_();RST = 1;/然后将RST(CE)置高电平。_nop_();for(n=0; n<8; n+)/开始传送八位地址命令DSIO = addr & 0x01;/数据从低位开始传送addr >>= 1;SCLK = 1;/数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;/DS1302下降沿时,放置数据_nop_();_no
23、p_();for(n=0; n<8; n+)/读取8位数据dat1 = DSIO;/从最低位开始接收dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;/DS1302下降沿时,放置数据_nop_();_nop_();/以下为DS1302复位的稳定时间,必须的。SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat;void Ds1302Init()uchar n;Ds1302Write(0x8E,0X00); /禁止写保护,就是关闭写保护功能f
24、or (n=0; n<7; n+)/写入7个字节的时钟信号:分秒时日月周年Ds1302Write(WRITE_RTC_ADDRn,TIMEn);Ds1302Write(0x8E,0x80); /打开写保护功能void Ds1302ReadTime()uchar n;for (n=0; n<7; n+)/读取7个字节的时钟信号:分秒时日月周年TIMEn = Ds1302Read(READ_RTC_ADDRn);5)DS1302头文件#ifndef _DS1302_H_#define _DS1302_H_#include<reg52.h>#include<intrin
25、s.h>#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endifsbit DSIO=P34;sbit RST=P35;sbit SCLK=P36;void Ds1302Write(uchar addr, uchar dat);uchar Ds1302Read (uchar addr);void Ds1302Init();void Ds1302ReadTime();extern uchar TIME7;/加入全局变量#endif6)DS18B20初始化函数DS18B2
26、0时序图#include "DS18b20.h"void Delay1ms (uint y)uint x;for( ; y>0; y-)for(x=110; x>0; x-);uchar Ds18b20Init()uchar i;DSPORT = 0; /将总线拉低480us960usi = 70;while(i-);/延时642usDSPORT = 1;/然后拉高总线,如果DS18B20做出反应会将在15us60us后总线拉低i = 0;while(DSPORT)/等待DS18B20拉低总线Delay1ms(1);i+;if(i>5)/等待>5MS
27、return 0;/初始化失败return 1;/初始化成功void Ds18b20WriteByte (uchar dat)uint i, j;for(j=0; j<8; j+)DSPORT = 0; /每写入一位数据之前先把总线拉低1usi+;DSPORT = dat & 0x01; /然后写入一个数据,从最低位开始i=6;while(i-); /延时68us,持续时间最少60usDSPORT = 1;/然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat >>= 1;uchar Ds18b20 ReadByte()uchar byte, bi;ui
28、nt i, j;for(j=8; j>0; j-)DSPORT = 0;/先将总线拉低1usi+;DSPORT = 1;/然后释放总线i+;i+;/延时6us等待数据稳定bi = DSPORT; /读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/byte = (byte >> 1) | (bi << 7); i = 4;/读取完之后等待48us再接着读取下一个数while(i-);return byte;Void Ds18b20 ChangTemp()Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);/跳过ROM操作命令 Ds18b20WriteB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广西百色市百林林场招聘编外聘用人员3人笔试参考题库及答案解析
- 高中教室LED照明灯具安装方案
- 2026年芜湖长能物流有限责任公司风控岗公开招聘考试备考试题及答案解析
- 2026广西南宁市天桃实验学校教育集团翠竹校区外聘教职工招聘1人考试参考题库及答案解析
- 2026中国平安财产保险股份有限公司黄南中心支公司招聘考试参考题库及答案解析
- 2026云南大理州祥云县矿山救护队招聘矿山救护队员6人考试参考题库及答案解析
- 2026中国烟草总公司青州中等专业学校高校毕业生招聘4人笔试备考题库及答案解析
- 地暖施工中的温控系统安装方案
- 室内给水系统水压监控与调节方案
- 砌体结构施工中的项目进度控制技术方案
- 2025年春新人教PEP版英语三年级下册全册教案
- 五年级上册数学计算题每日一练(共20天带答案)
- 2025春季开学第一课安全教育班会课件-
- 课件:《科学社会主义概论(第二版)》导论
- 雨污水管网施工危险源辨识及分析
- 供排水维修安全培训
- GB/T 44957-2024人工影响天气作业点防雷技术规范
- 污水处理工安全培训
- 深圳大学《算法设计与分析》2021-2022学年期末试卷
- DB35T 1985-2021 原发性肝癌临床数据集
- 既有建筑减震隔震加固技术规程
评论
0/150
提交评论