单片机课程设计数字温度计_第1页
单片机课程设计数字温度计_第2页
单片机课程设计数字温度计_第3页
单片机课程设计数字温度计_第4页
单片机课程设计数字温度计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机课程设计课题: 数字温度计系 别: 专 业 姓 名: 学 号: 河南城建学院2012年12月28日成绩评定一、指导教师评语(根据学生设计报告质量、答辩情况及其平时表现综合评定)。二、评分评分项目设计报告评分答辩评分平时表现评分合 计 (100分)任务完成情 况(20分)课程设计报告质量(40分)表达情况(10分)回答问题情 况(10分)工作态度与纪律(10分)独立工作能力(10分)得分课程设计成绩评定班级 姓名 学号成绩: 分(折合等级 )指导教师签字 年 月 日一、设计目的及要求 1、基本范围为50110; 2、精度误差小于0.5; 3、led数码管直读显示; 扩展功能 : 1、可以任

2、意设定温度上的上下限报警功能; 2、实现语音报数。二、总体设计(一)、系统硬件设计方案根据系统功能要求,构造如下图所示的系统原理结构框图。ds18b20温度数据采集stc89cs52rc初始化lg3641bh显示温度图1 系统原理结构框图 单片机的选择stc89c52rc是新一代超强抗干扰/高速/低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟/机械周期和6时钟/机械周期可以任意选择,其内核与at51系列单片机一样,但是其造价较之更低,功能更强。at51单片机小系统的电路图如下所示。图1:单片机小系统电路1)、引脚说明stc89c52的内核和at51系列单片机一样,故引脚也相同:1

3、8:i/op1口(p1.0p1.7);9: 复位脚(rst/vpd);1017:i/op3口(p3.0=rxd,p3.1=txd,p3.2=-int0,p3.3=-int1,p3.4=t0,p3.5=t1,p3.6=-wr,p3.7=-rd);18、19:晶振(18=xtal2,19=xtal1);20: 地(vss);2128:i/op2口(p2.0p2.7); 29:-psen;30:ale/-prog;31:-ea/vpp3239:i/op0口(p0.7p0.0);40:+5v电源。注:引脚功能前加“-”,说明其是低电平有效。如p3.2=-int0。2)、内部功能1. i/o 口:输入/

4、 输出口经过特殊处理,很多干扰是从i/o 进去的,每个i/o 均有对vcc/ 对gnd二级管箝位保护。2. 电源:单片机内部的电源供电系统经过特殊处理,很多干扰是从电源进去的3. 时钟单片机内部的时钟电路经过特殊处理,很多干扰是从时钟部分进去的4 . 空闲模式:典型功耗 2ma5.正常工作模式:典型功耗 4ma - 7ma单片机内部的时钟电路经过特殊处理,很多干扰是从时钟部分进去的6. 复位电路单片机内部的复位电路经过特殊处理,很多干扰是从复位电路部分进去的,stc89c51rc/rd+系列单片机为高电平复位。推荐外置复位电路为max810/stc810,stc6344,stc6345,813

5、l,706p;也可用r/c 复位,10uf 电容/10k 电阻,22uf/8.2k 等。6.宽电压,不怕电源抖动5v: 6v - 3.4v 3v: 4v - 1.9v2、温度传感器介绍ds18b20温度传感器是美国dallas半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。ds18b20内部结构主要由四部分组成:64位光刻rom、温度传感器、非挥发的温度报警触发器th和tl、配置寄存器。ds18b20可以程序设定912位的分辨率,精度为0.5c。可选更小的封装方式,更宽的电压适用范围。分

6、辨率设定存储在eprom中,掉电后依然保存。而在此,我们设定12为分辨率,即温度分辨率0.0625。ds18b20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信;多个ds18b20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.05.5;零待机功耗;温度以或位数字;用户可定义报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; ds18b20采用脚pr35封装或脚soic封装,其内部结构框图如下图所示。c64 位rom和单线接口高速缓存存储器与控制逻辑温度传

7、感器高温触发器th低温触发器tl配置寄存器8位crc发生器vdd 图2ds18b20内部结构根据ds18b20的通讯协议,主机控制ds18b20完成温度转换必须经过三个步骤:(1).初始化(2) 执行某个rom指令(3) 执行ram内存指令(4) 数据传输复位要求主cpu将数据线下拉480微秒,然后释放,ds18b20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主cpu收到此信号表示复位成功。图3ds18b20与单片机的接口电路3、液晶显示lg364bh液晶显示模块是12864 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标gb2312 码简体中文字库(16x1

8、6 点阵)、128 个字符(8x16 点阵)及64x256 点阵显示ram(gdram)。可与cpu 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。 三、总体设计(一)、整体思路根据要求,我们将整个程序分为三大部分。主要包括主程序,温度传感程序,lg3641bh液晶显示程序。(二)、程序流图1、 ds18b20温度计程序ds18b20温度计程序包括读出温度子程序,温度转换命令子程序,计算温度子程序。主程序的主要功能是负责温度的实时显示、读出并处理ds18b20的测量温度值,温度测量每0.5s进行一次。读出温度子程序的主要功能是读出ram中的字节。温度转换命令子程序主要是发

9、温度转换开始命令,采用12位分辩率为0.065,在本程序设计中采用0.5s显示程序延时法等待转换的完成。 ds18b20温度计程序流程图如下:开始ds18b20的初始化启动温度转换读取温度寄存器ds18b20的初始化复位 图4ds18b20温度计程序流程图 (三)、总体设计框图温度计电路设计总体设计方框图如图1所示,控制器采用单片机at89s51,a/d转换器采用0809传输,温度传感器采用ds18b20,用3位led数码管以串口传送数据实现温度显示,并用蜂鸣报警器来监视温度的值不超过量程范围。 温度上下限设置led显示stc89c52单片机温度加一温度减一温度传感器图5总体设计方框图 四、整

10、体电路图 图6整体电路图五、结论在这一学期的单片机课程中,李老师给我们讲了许多单片机的内部结构,编译语言,一直在朦朦胧胧的学习,模模糊糊的接受,即使到了考试的时候,我甚至感觉自己对单片机还是那么陌生。一周的课程实习,不长不短,但是又不可或缺,它似乎是对一学期的课程的润色,把抽象变为形象,让我们突然跳出理论,开始实践,当然是理论结合实践,真正在做得时候,才发现之前学的那么少,进行课程实习的时候,我看了很多关于单片机,温度传感器,液晶显示器的资料和相应的程序代码,越看越不懂,但是越看就越想看,就感觉看到一个不懂的,去找答案,于是就刹不住车了,一个套着一个,但是虽然模糊,但是却越想看,又一次,我看的

11、最晚的一次是从下午一直到晚上3点多,一直没有看表也没有注意时间,那次我才发现知识那么可贵,不能说自己看懂,但是那种被知识灌输的感觉让我很舒服。对于此次的课程实习,我也总结了很多我认为适合我们,起码适合我自己的一些方法。一、 要对硬件功能了解,要熟悉相应程序代码和功能实现,二、 设计程序要有思路,根据思路才能有效进行三、 编写程序要有所根据,出现错误很正常,要一步步的排查错误,一定要细心耐心四、 要懂得听取正确意见,多和人交流,集思广益,合作的力量是无穷大的。五、 向别人讲解程序时,流程图是最好的展示。而我们小组正是在不断的合作中在两次的课题中都顺利完成。当然在此感谢各位指导老师这几周里对我们的

12、帮助和指导。参考文献1杨恢先,黄辉先.单片机原理及应用(第一版) m.北京:人民邮电出版社,2006:214-221.2马忠梅.单片机c语言程序设计 m.北京:北航出版社,2007:36-48.3 田立,田清,代方震. 51单片机c语言程序设计快速入门(第一版) m.北京:人民邮电出版社,2007:35-40.附件1:#include #define uchar unsigned char#define schar signed char#define uint unsigned int#define jdq p2_2 /继电器输出#define ledport p0 /led控制口#defi

13、ne ledonec p3_3 /led ds1控制(百位)#define ledtwoc p3_2 /led ds2控制(十位)#define ledthreec p3_1 /led ds3控制(个位)#define ledfourc p3_0 /固定显示摄氏度符号#define dq p2_0 /ds1820 dataport#define key_io p1 /按键所连的io口#define no_key_value 0x0f /当按键没有被按下时io口的值#define key_wobble_time 8 /去抖动时间(待定)#define key_over_time 50 /等待进入

14、连击时间(待定),该常数要比正常按键时间要长,防止非目的性进入连击模式#define key_quick_time 8 /等待按键抬起的连击时间(待定)uchar tlv,thv,keyv,sign,settf,num,bz,cqbz;uint cs,css;schar tmv,tmhromv,tmlromv,tmhsetv,tmlsetv,led_one,led_two,led_three,led_four;unsigned char code leddis=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x46; /

15、0-9的led笔划,0xff为空,0xf7为负号,0x46为摄氏度符号/*11us延时函数*/void delay(unsigned int time) while(time-);/void delay_ms(unsigned int i) unsigned int j; while(i-) for(j = 0; j 0; i-)/按位循环 dq = 0;/使总线为低电平 dq = dat&0x01;/将发送字节的最低位送到总线 delay(5);/延时一段时间(30us),等待ds18b20取走总线数据 dq = 1;/将总线拉高 dat=1;/将待发送的字节右移后继续发送 delay(4)

16、;/*ds18b20读1字节函数*/unsigned char read_18b20_byte(void)unsigned char i=0; /位循环变量unsigned char dat = 0; /暂存变量for (i=8;i0;i-) /读位循环 dq = 0; / 使总线电平为低电平 dat=1;/暂存变量右移 dq = 1; / 给脉冲信号,使总线电平为高电平后执行如下的读操作 if(dq) /如果ds18b20的输出为高电平(总线电平为1) dat|=0x80; /将暂存变量的最高位置1 delay(4);/延时一段时间 return(dat); /将暂存变量返回调用程序/=/配

17、置18b20,设置上下温度,及灵敏度/=void config18b20() init_ds18b20(); write_18b20_byte(0xcc); / 跳过读序号列号的操作 write_18b20_byte(0x4e); /写 eeprom write_18b20_byte(tmhsetv); /写入上限温度 write_18b20_byte(tmlsetv); /下限温度 init_ds18b20(); write_18b20_byte(0xcc); / 跳过读序号列号的操作 write_18b20_byte(0x48); /保存上面所设定值 init_ds18b20(); wri

18、te_18b20_byte(0xcc); / 跳过读序号列号的操作 write_18b20_byte(0xb8); /回调设定值,将rom的内容重调到ram中void read_18b20_first(void)unsigned int t=0;init_ds18b20();write_18b20_byte(0xcc); / 跳过读序号列号的操作write_18b20_byte(0x44); / 启动温度转换delay_ms(700);init_ds18b20();write_18b20_byte(0xcc); /跳过读序号列号的操作 write_18b20_byte(0xbe); /读取温度

19、寄存器等(共可读9个寄存器) 前两个就是温度,依次读取tlv=read_18b20_byte();/ 温度值低位字节(其中低4位为二进制的“小数”部分最小0.0625量)thv=read_18b20_byte();/ 高位值高位字节(其中高5位为符号位)tmhromv=read_18b20_byte();/ 读取温度设定上限值tmlromv=read_18b20_byte();/ 读取温度设定下限值void read_18b20_temprature(void)unsigned int t=0;init_ds18b20();write_18b20_byte(0xcc); / 跳过读序号列号的操

20、作write_18b20_byte(0x44); / 启动温度转换delay(200);init_ds18b20();write_18b20_byte(0xcc); /跳过读序号列号的操作 write_18b20_byte(0xbe); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度,依次读取tlv=read_18b20_byte();/ 温度值低位字节(其中低4位为二进制的“小数”部分最小0.0625量)thv=read_18b20_byte();/ 高位值高位字节(其中高5位为符号位)tmhromv=read_18b20_byte();/ 读取温度设定上限值tmlromv=read

21、_18b20_byte();/ 读取温度设定下限值void display_wendu(void)/数值转换 tlv = tlv 4; /将温度低四位移除,及去掉小数部分 thv = thv 7; /将设置温度值左移七位取最高位符号 else /如果不在设置状态 sign = tmv 7; /就将当前温度值左移7位取出符号位if (sign) /如果sign为1,表示最高位符号位为1,即表示负数 if (settf) /如果在设置状态,显示设定值,将负数变成正数方便处理,因为18b20的负温度是用补码表示的,即 负数=正数+1,那么倒推过来,正数=(负数-1) led_one = (tmlse

22、tv-1) / 100; /第一位数码管显示设定时的百位 led_two = (tmlsetv-1) - led_one * 100)/10; /第二位数码管显示设定时的十位 led_three = (tmlsetv-1) - led_one * 100 - led_two * 10; /第三位数码管显示设定时的个位 else /如果不在设定状态就显示当前采集的温度值 led_one = (tmv-1) / 100; /第一位数码管显示正常时的百位 led_two = (tmv-1) - led_one * 100)/10; /第二位数码管显示正常时的十位led_three = (tmv-1)

23、 - led_one * 100 - led_two * 10; /第三位数码管显示正常时的个位else /否则sign为0,表示最高位符号位为0,即表示正数,一下一段注释同上 if (settf) led_one = (tmlsetv) / 100; led_two = (tmlsetv - led_one * 100)/10; led_three = tmlsetv - led_one * 100 - led_two * 10; else led_one = (tmv) / 100; led_two = (tmv - led_one * 100)/10; led_three = tmv -

24、 led_one * 100 - led_two * 10; /将以上数据处理的值转换为led字段if (led_one) /如果第一位数码管显示为1,即百位显示1,超过了一百led_two = leddisled_two; /十位就显示十位的值else /如果没有超过一百,即只有两位时,也有两种情况led_two = leddisled_two;/显示十位if (sign) /如果为负数时led_one = leddis11;/第一位数码管,即百位显示“负号”else /如果不为负数时if (led_one = 0) /百位为0时,百位不显示led_one = leddis10;else /

25、否则显示百位led_one = leddisled_one;led_three = leddisled_three; /各位始终就显示个位的值led_four = leddis12;void init (void) jdq=1; ledport=0xff;/*/文 件 名:key.c/功 能:短击连击/调用方法:unsigned char keyvalue = readkey();/说 明:该程序不适用于阵列键盘./ 该程序不需要使用定时器./ 调用处要加入switch语句来判断相应按键按下并执行相应动作./ 如需要在按键松开后执行动作,则调用函数需要定义一个bit标志位,在default语句

26、里判断标志位状态./ key_wobble_time 指程序程序执行次数.实际应用中要根据程序的长短来调整成合适的数值./ /备 注:程序思路是当按键被按下时开始计算程序的执行次数,如小于key_wobble_time,则认为按键没有被按下./ 引用自/forum/thread-12239-1-1.html,略做更改. / keil编译时会提示warning c291: not every exit path returns a value.不影响使用. /*/uchar readkey() /判断哪个键被按下static uchar lastkey =

27、 no_key_value ;static uint keycount = 0;static uint keyovertime = key_over_time;uchar keytemp = no_key_value ;keytemp = key_io & no_key_value ; /读取键值if(keytemp = no_key_value ) /无按键按下时keycount = 0; keyovertime = key_over_time; bz=0;return no_key_value ;else /有按键按下时 if(keytemp=lastkey) if(+keycount =

28、 key_wobble_time) /不是第1次按下判断抖动是否结束 return keytemp; /去抖结束,返回键值 /短按时,将标志置0,说明在短按,闪烁 else if(keycountkeyovertime) keycount = 0; keyovertime = key_quick_time;bz=1;/长按将标志置1,不闪烁 return no_key_value ; else /是第1次按下则保存键值,下次执行此函数时与读到的键值作比较 lastkey = keytemp ; /保存第1次读到的键值 keycount = 0; /延时计数器清零 keyovertime = k

29、ey_over_time ; return no_key_value ; /void main() init();read_18b20_first(); /先读一次温度,避开85度tmhsetv=tmhromv; tmlsetv=tmlromv; config18b20(); settf=0; while(1) num+;if(num=40)num=0;keyv=readkey();if(keyv=0x0e)settf=settf;cs=0;if(settf)if(keyv=0x0d)cs=0;tmlsetv=tmlsetv+1;tmhsetv=tmlsetv+2;if(keyv=0x0b)cs=0;tmlsetv=tmlsetv-1;tmhsetv=tmlsetv+2;if(tmlsetv=60)tmlsetv=60; if(tmlsetv200)cs=0;settf=0;config18b20(); read_18b20_temprature();/读出温度高低位thv、tlv及温度限制tmromv display_wendu();if(settf)if(!bz) /短按下闪烁if(num20)ledport=0xff;else

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论