已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机原理与应用课程设计说明书 题 目: 数字式温度计 系 部: 专 业: 班 级: 学生姓名: 学 号: 指导教师: 2011年 月 日单片机课程设计说明书目 录1 设计任务与要求11.1 课程设计的任务11.2 课程设计的要求12 设计方案12.1 设计思路12.2 芯片及功能12.2.1 stc89c52rc12.2.3 ds130272.2.4 ds18b02102.2.5 max232162.2.6 74ls164173 硬件电路设计193.1 原理图193.2 pcb印刷版224 主要参数计算与分析234.1 ds18b20温度数值转换234.2 ds1302时钟bcd的转换245 软件设计245.1 流程图245.2 源代码266 调试过程446.1 调试步骤446.2 实验出现的问题457 结论45参考文献461 设计任务与要求11 课程设计的任务基本要求:本次课程设计的基本任务为完成一个温度传感器的功能。当温度低于某一个温度值或高于某个温度是报警。扩展功能:结合个人能力和电路板的现有硬件,看增加其他功能。这里扩展为按下某个键进入时钟功能。1.1.1 以51单片机为核心器件,组成一个数字式温度记1.1.2 采用ds18b20为检测器件,进行单点温度检测,检测精度为5。1.1.3 温度显示采用3位led数码管显示,两位整数、一位小数1.1.4 具有温度上下限功能,超过上下限时,进行声音报警。12 课程设计的要求1. 2. 1焊接电路,编制程序,实现电子音乐盒的基本功能,并完成课程设计说明书。1. 2. 2课程设计期间遵守纪律,注意安全,爱护设备,合理分工,加强合作。2 设计方案1. 1设计思路使用单片机读取温度传感器的值,经过转换,在8段led数码管上显示出来。根据读取的值来设定温度报警范围。当高于或低于某个温度值通过蜂鸣器报警。扩展功能:时钟显示。通过一个按键切换到时钟显示。时钟系统是通过i2c总线访问ds1302获取和设置时钟。2.2 使用芯片2.3 芯片作用2. 3. 1 74ls164 74ls164 内部逻辑图引脚功能:clear: 同步清除输入端(低电平有效) a,b :串行数据输入端qaqh: 输出端clock :时钟输入端inputsoutputsclearclockabqaqb.qhlxxxll.lhlxxqaoqbo.qhohhhhqan.qgnhlxlqan.qgnhxllqan.qgnh高电平 l低电平 x任意电平 低到高电平跳变 qa0,qb0,qh0 规定的稳态条件建立前的电平 qan,qgn 时钟最近的前的电平 当清除端(clear)为低电平时,输出端(qaqh)均为低电平。 串行数据输入端(a,b)可控制数据。当 a、b任意一个为 低电平,则禁止新数据输入,在时钟端(clock)脉冲上升沿作用下q0 为低电平。当a、b 有一个为高电平,则另一个就允许输入数据,并在clock 上升沿作用下决定q0 的状态。2. 3. 2 数字温度传感器ds18b20介绍1、ds18b20的主要特性 1.1、适应电压范围更宽,电压范围:3.05.5v,在寄生电源方式下可由数据线供电 1.2、独特的单线接口方式,ds18b20在与微处理器连接时仅需要一条口线即可实现微处理器与ds18b20的双向通讯 1.3、 ds18b20支持多点组网功能,多个ds18b20可以并联在唯一的三线上,实现组网多点测温 1.4、ds18b20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内 1.5、温范围55+125,在-10+85时精度为0.5 1.6、可编程 的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温 1.7、在9位分辨率时最多在 93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快 1.8、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。2、ds18b20的外形和内部结构ds18b20内部结构主要由四部分组成:64位光刻rom 、温度传感器、非挥发的温度报警触发器th和tl、配置寄存器。ds18b20的外形及管脚排列如下图1: ds18b20引脚定义: (1)dq为数字信号输入/输出端; (2)gnd为电源地; (3)vdd为外接供电电源输入端(在寄生电源接线方式时接地)。3、ds18b20工作原理 ds18b20的读写时序和测温原理与ds1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。 ds18b20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在55所对应的一个基数值。计数器1对 低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即 为所测温度。图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。 5、ds18b20的应用电路ds18b20测温系统具有测温系统简单、测温精度高、连接方便、占用口线少等优点。下面就是ds18b20几个不同应用方式下的 测温电路图: 5.1、ds18b20寄生电源供电方式电路图如下面图4所示,在寄生电源供电方式下,ds18b20从单线信号线上汲取能量:在信号线dq处于高电平期间把能量储存在内部 电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。 独特的寄生电源方式有三个好处: 1)进行远距离测温时,无需本地电源 2)可以在没有常规电源的条件下读取rom 3)电路更加简洁,仅用一根i/o口实现测温 要想使ds18b20进行精确的温度转换,i/o线必须保证在温度转换期间提供足够的能量,由 于每个ds18b20在温度转换期间工作电流达到1ma,当几个温度传感器挂在同一根i/o线上进行多点测温时,只靠4.7k上拉电阻就无法提供足够的 能量,会造成无法转换温度或温度误差极大。 2. 3. 3 8位串行a/d转换器adc08321.功能特点adc0832 为8位分辨率a/d转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。芯片具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件连接和处理器控制变得更加方便。通过di 数据输入端,可以轻易的实现通道功能的选择。其主要特点如下: 8位分辨率,逐次逼近型,基准电压为5v; 5v单电源供电; 输入模拟信号电压范围为05v; 输入和输出电平与ttl和cmos兼容; 在250khz时钟频率时,转换时间为32us; 具有两个可供选择的模拟输入通道; 功耗低,15mw。2.外部引脚及其说明adc0832有dip和soic两种封装,dip封装的adc0832引脚排列如图6.21所示。各引脚说明如下: cs片选端,低电平有效。 ch0,ch1两路模拟信号输入端。 di两路模拟输入选择输入端。 do模数转换结果串行输出端。 clk串行时钟输入端。 vcc/ref正电源端和基准电压输入端。图6.21 adc0832引脚图 gnd电源地。3.单片机对adc0832 的控制原理一般情况下adc0832与单片机的接口应为4条数据线,分别是cs、clk、do、di。但由于do端与di端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将do和di 并联在一根数据线上使用。当adc0832未工作时其cs输入端应为高电平,此时芯片禁用,clk 和do/di 的电平可任意。当要进行a/d转换时,须先将cs端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端clk提供时钟脉冲,do/di端则使用di端输入通道功能选择的数据信号。在第1个时钟脉冲到来之前di端必须是高电平,表示启动位。在第2、3个时钟脉冲到来之前di端应输入2位数据用于选择通道功能,其功能项见表6.4。输入形式 配置位选择通道ch0ch1choch1差分输入00+-01-+单端输入10+11+当配置位2位数据为1、0时,只对ch0 进行单通道转换。当配置2位数据为1、1时,只对ch1进行单通道转换。当配置2位数据为0、0时,将ch0作为正输入端in+,ch1作为负输入端in-进行输入。当配置2位数据为0、1时,将ch0作为负输入端in-,ch1 作为正输入端in+进行输入。到第3个时钟脉冲到来之后di端的输入电平就失去输入作用,此后do/di端则开始利用数据输出do进行转换数据的读取。从第4个时钟脉冲开始由do端输出转换数据最高位d7,随后每一个脉冲do端输出下一位数据。直到第11个脉冲时发出最低位数据d0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个时钟脉冲输出d0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次a/d转换的结束。最后将cs置高电平禁用芯片,直接将转换后的数据进行处理就可以了。3 硬件电路设计3.1 原理图3路led灯7段led数值数码管与6路按键ds18b20ds1302max232max813蜂鸣器/喇叭3.2 pcb印刷版4 主要参数计算与分析4.1 ds18b20温度数值转换读取ds18b20后得到9个字节中前两位为温度数值th1,tl1,其温度数值为0.0625的倍数先将二进制转换为浮点数tempfloattempfloat= th1*162+tl1获取整数部分:把tempfloat给一个整型变量tempinttempint= tempfloat;把温度值分成6位显示:整数部分: 0=tempint/100; 1=tempint%100/10; 2=tempint%10; 小数部分:templt=(tempfloat- 0*100+ 1*10+ 2)*10000; 3=templt%10; 4=templt%100/10; 5=templt%1000/100;4.2 ds1302时钟bcd的转换十进制转bcd十进制整数time_buf1,转换成十六进制bcd码值time_buftmp=time_buf1/10;/获得十位time_buf=time_buf1%10;/获得个位time_buf=time_buf+tmp*16;/转换十六进制bcd转十进制十六进制整数time_buf,转换成十进制bcd码值time_buf1mp=time_buf/16;/获得高八位time_buf1i=time_buf%16;/获得高低位time_buf1i=time_buf1+tmp*10;/转换成十进制5 软件设计5.1 流程图5.2 源代码/mydefindebefore.h*/文件功能:定义、函数声明、公用函数。*sbit sin=p24;/led显示移位输出口sbit clk=p25;/移位输出时钟sbit led1=p21;/led口sbit led2=p22;sbit led3=p23;sbit s1=p00;/位选口sbit s2=p01;sbit s3=p02;sbit s4=p26;sbit s5=p27;sbit s6=p07;sbit tt=p33; /测试口sbit tt1=p34;bit keydown=0;/按键是否按下bit alarmon=0;/温度报警在报警sbit alarmspk=p20;/报警口,0-报警、1-关闭报警unsigned char t0_mode=0;/t0要触发的模式,0-读取ds1302、1-读取ds18b20bit timesetblink=0;/时间设置时的闪烁判定unsigned char timesetindex=0;/按键1的功能标识 1:全闪 2:设置小时 3:设置分钟 4:设置秒 5:写入ds1302unsigned char t0_num=0,t1_num=0; /定时器次数记录unsigned char const el21=0xe7,0x05,0xe9,0xad,0x0f,0xae,0xee,0x85,0xef,0xaf,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80,0x40,0x38,0x76,0x00;/ 显示段码值 0 1 2 3 4 5 6 7 8 9 a b c d e f . - l h 空unsigned char lednum6=0,1,2,3,4,5;/6位管暂存初始化void scanled(); void b_sin(unsigned char);void getkeyinput();/void delay(unsigned int);void dis_buf1();/延迟=void delay(unsigned int n) while(n-);/kcsj.c*/程序主文件*#include/c52通用定义头文件#include mydefindebefore.h /一部分定义及,函数声明,共用函数#include iic_ds1302_rw.c/ds1302时钟函数库#include ss_ds18b20.c/ds18b20温度传感器函数库/主程序=void main()tmod=0x11;/设置t0、t1都在模式一/设置并开启t0th0=0x00;tl0=0x00;et0=1;ea=1;tr0=1;/设置t1th1=0x00;tl1=0x00;et1=1;tr1=0;alarmspk=1;ds1302_init();ds1302_read_time();scanled();/开始扫描led显示/led扫描显示=void scanled() unsigned char i,eltmp; while(1)for(i=0;i6;i+) /6位扫描输出=/检测按键=if(p1!=0xff) if(keydown=0)/只有上次按键松开才看可以再次处理按键程序getkeyinput();keydown=1;elsekeydown=0;eltmp=ellednumi; /获得该位数码if(t0_mode=0)/时间模式时没两位加一个小数点if(i%2!=0)/是否加小数点eltmp=(ellednumi)|0x10; else/温度模式只在第3位加一个小数点if(i=2)eltmp=(ellednumi)|0x10;s1=1;s2=1;s3=1;s4=1;s5=1;s6=1;/清位/b_sin(0xff); /清8位管b_sin(eltmp); /移位输出switch(i) /选位case 0:s1=0;break;case 1:s2=0;break;case 2:s3=0;break;case 3:s4=0;break;case 4:s5=0;break;case 5:s6=0;break;delay(20); /延迟显示 /移位输出一个字节=void b_sin(unsigned char sintmp)unsigned char i; for(i=0;i8;i+) sintmp=sintmp=23)time_buf14=0;else time_buf14+;elseif(time_buf1timesetindex+2=59) /分、秒封顶time_buf1timesetindex+2=0;else time_buf1timesetindex+2+;else if(p1=0xfb&t0_mode=0)/3键 -1=if(time_buf1timesetindex+2=5)/每5次才读一次ds1302t0_num=0; if(t0_mode=0)/读取ds1302ds1302_read_time();dis_buf1();else if(t0_mode=1) /读取温度传感器transformtemp();readtemp();t0_num+;/t1=void int_t1() interrupt 3th1=0x00;tl1=0x00;tt1=tt1;if(t1_num=5) /每5次闪烁一下t1_num=0;timesetblink=timesetblink; /取反-下次亮暗的状态取反if(timesetindex=1) /all if(timesetblink=0)lednum0=20;lednum1=20;lednum2=20;lednum3=20;lednum4=20;lednum5=20; elsedis_buf1();else if(timesetindex=2) /hourif(timesetblink=0)lednum0=20;lednum1=20; elselednum0=time_buf14/10;lednum1=time_buf14%10;else if(timesetindex=3)/minutesif(timesetblink=0)lednum2=20;lednum3=20; elselednum2=time_buf15/10;lednum3=time_buf15%10;else if(timesetindex=4)/secondsif(timesetblink=0)lednum4=20;lednum5=20; elselednum4=time_buf16/10;lednum5=time_buf16%10;else if(timesetindex=5) /保存修改t1_num+;void dis_buf1() /把”time_buf1“的值写入显示暂存lednum0=time_buf14/10;lednum1=time_buf14%10;lednum2=time_buf15/10;lednum3=time_buf15%10;lednum4=time_buf16/10;lednum5=time_buf16%10;/iic_ds1302_rw.c*/ds1302时钟芯片的读取写入函数库*#includesbit sck=p05;sbit sda=p04;sbit rst=p03;/*复位脚*/#define rst_clrrst=0/*电平置低*/#define rst_setrst=1/*电平置高*/*双向数据*/#define io_clrsda=0/*电平置低*/#define io_setsda=1/*电平置高*/#define io_rsda/*电平读取*/*时钟信号*/#define sck_clrsck=0/*时钟信号*/#define sck_setsck=1/*电平置高*/#define ds1302_sec_add0x80/秒数据地址#define ds1302_min_add0x82/分数据地址#define ds1302_hr_add0x84/时数据地址#define ds1302_date_add0x86/日数据地址#define ds1302_month_add0x88/月数据地址#define ds1302_day_add0x8a/星期数据地址#define ds1302_year_add0x8c/年数据地址#define ds1302_control_add0x8e/控制数据地址#define ds1302_charger_add0x90 #define ds1302_clkburst_add0xbeunsigned char time_buf18 = 20,9,3,13,18,51,0,6;/空年月日时分秒周unsigned char time_buf8 ;/空年月日时分秒周/*向ds1302写入一字节数据*/void ds1302_write_byte(unsigned char addr, unsigned char d) unsigned char i;rst_set;/*启动ds1302总线*/*写入目标地址:addr*/addr = addr & 0xfe;/*最低位置零*/for (i = 0; i 1;/*写入数据:d*/for (i = 0; i 1;rst_clr;/*停止ds1302总线*/*从ds1302读出一字节数据*/unsigned char ds1302_read_byte(unsigned char addr) unsigned char i;unsigned char temp;rst_set;/*启动ds1302总线*/*写入目标地址:addr*/addr = addr | 0x01;/*最低位置高*/for (i = 0; i 1;/*输出数据:temp*/for (i = 0; i 1;if (io_r) temp |= 0x80;else temp &= 0x7f;sck_set;sck_clr;rst_clr;/*停止ds1302总线*/return temp;/*向ds302写入时钟数据*/void ds1302_write_time(void) unsigned char i,tmp;for(i=0;i8;i+) /bcd处理tmp=time_buf1i/10;time_bufi=time_buf1i%10;time_bufi=time_bufi+tmp*16;ds1302_write_byte(ds1302_control_add,0x00);/关闭写保护 ds1302_write_byte(ds1302_sec_add,0x80);/暂停 /ds1302_write_byte(ds1302_charger_add,0xa9);/涓流充电 ds1302_write_byte(ds1302_year_add,time_buf1);/年 ds1302_write_byte(ds1302_month_add,time_buf2);/月 ds1302_write_byte(ds1302_date_add,time_buf3);/日 ds1302_write_byte(ds1302_day_add,time_buf7);/周 ds1302_write_byte(ds1302_hr_add,time_buf4);/时 ds1302_write_byte(ds1302_min_add,time_buf5);/分ds1302_write_byte(ds1302_sec_add,time_buf6);/秒ds1302_write_byte(ds1302_day_add,time_buf7);/周 ds1302_write_byte(ds1302_control_add,0x80);/打开写保护 /*从ds302读出时钟数据*/void ds1302_read_time(void) unsigned char i,tmp;time_buf1=ds1302_read_byte(ds1302_year_add);/年 time_buf2=ds1302_read_byte(ds1302_month_add);/月 time_buf3=ds1302_read_byte(ds1302_date_add);/日 time_buf4=ds1302_read_byte(ds1302_hr_add);/时 time_buf5=ds1302_read_byte(ds1302_min_add);/分 time_buf6=(ds1302_read_byte(ds1302_sec_add)&0x7f;/秒 time_buf7=ds1302_read_byte(ds1302_day_add);/周 for(i=0;i8;i+) /bcd处理tmp=time_bufi/16;time_buf1i=time_bufi%16;time_buf1i=time_buf1i+tmp*10;/*ds302初始化函数*/void ds1302_init(void) rst_clr;/*rst脚置低*/sck_clr;/*sck脚置低*/ ds1302_write_byte(ds1302_sec_add,0x00); /ss_ds18b20.c*/ds18b20温度传感器的读取写入函数库unsigned char data tread9;/5位aa后跟9位读取的ds18b20的数据unsigned int tempint,templt;/unsigned int t1_runs=0;/t1,触发的次数,用来长延时unsigned char alarmseti=0;/报警设置,设置项目sbit dq=p06;/数据线void temphtod(); /温度数值转换,并写入八位管暂存void writeram(); /写入ds18b20ramvoid readtemp(); /读取温度值,其实9位数据都读取,并保存到tread13中void transformtemp(); /ds18b20进行温度转换void ds_set(); /初始化ds18b20void writebyte(unsigned char);/写入ds18b20一个字节unsigned char readbyte();/读取ds18b20一个字节/读取温度=void readtemp()unsigned char i;ds_set();writebyte(0xcc);writebyte(0xbe);for(i=0;i=0xf0) /温度如果为负情况,取反temph=0xff-temph;templ=0xff-templ+1;tempi=temph*16*16+templ; /温度台阶(0.0625)数tempfloat=tempi*0.0625;/获得十进制温度值tempint=tempfloat;/截取整数位/温度检测报警=if(tempfloat=18) /设置温度报警限,精确到小数后(tempfloat为浮点数)led1=0;led2=0;led3=0; alarmspk=0;if(alarmon=0)/防止开始报警后重复进入该函数而无法跳出alarmon=1;elsealarmspk=1;alarmon=0;led1=1;led2=1;led3=1; /end 温度检测报警=if(tread1=0xf0) /温度如果为负情况,最高位显示“-”,否则按原值显示 lednum0=17;else lednum0=tempint/100; lednum1=tempint%100/10; lednum2=tempint%10; /lednum3=16;templt=(tempfloat-lednum0*100+lednum1*10+lednum2)*10000; lednum3=templt%10;lednum4=templt%100/10;lednum5=templt%1000/100;/lednum7=templt%10000/1000; /修改时间写入ds1302=void writeram()ds_set();writebyte(0xcc);writebyte(0x4e);writebyte(tread2);writebyte(tread3);ds_set();/=void transformtemp()ds_set();writebyte(0xcc);writebyte(0x44);/delaylong();ds_set();/=void ds_set()dq=1;dq=0;delay(70);dq=1;delay(20);/写1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GBT 12443-2017 金属材料 扭矩控制疲劳试验方法》专题研究报告
- 银行综合柜员测试验证知识考核试卷含答案
- 种苗繁育员安全文化能力考核试卷含答案
- 重冶火法冶炼工岗前深度考核试卷含答案
- 超重型汽车列车挂车工安全应急能力考核试卷含答案
- 制冷空调设备装配工创新实践竞赛考核试卷含答案
- 《GB-T 39809-2021平板玻璃窑炉能耗测定方法》专题研究报告
- 公司射孔取心工岗位职业健康技术规程
- 公司木制玩具制作工岗位标准化技术规程
- 《GBT 35478-2017 紧固件 螺栓、螺钉和螺柱预涂聚酰胺锁紧层技术条件》专题研究报告
- 2024年保育师考试测试题库及答案
- 2024年山东省济南市中考语文试题卷(含答案)
- 新版APQP附件模板A0-A8
- CJT511-2017 铸铁检查井盖
- 质量工程师简历模板
- 天然气场站安全知识培训
- 农业物联网与传统农业的差异与改进
- 厦门大学2005年333无机化学考研真题
- 光伏支架防腐设计规范
- 教师学习弘扬教育家精神心得体会5篇
- 产品报价单(5篇)
评论
0/150
提交评论