付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式课程设计学院:计算机与通信工程学院专业:物联网工程班级:物联1501姓名:王强学号:41501602实验日期:2017年12月25日实验名称:嵌入式课程设计实验目的:以STC89开发板为硬件平台,开发温度采集、动态数码管显示、按键响应、与PC串口通讯的综合程序,实现以下功能:1) PC上的串口调试助手通过串口给STC89开发板发送“GetTemp'命令。2) STC89开发板从串口接收到“GetTemp'命令后启动温度传感器DS18B20的测温程序获取当前温度,测试完成时将所测得温度数据显示在动态数码管上。(动态数码管在温度获取之前应该显示“FFFFFFFF,只有在获取温
2、度后才显示温度值)3)动态数码管显示出温度数据后,请通过按键触发STC89开发板通过串口回送步骤2所测的温度数据给PC上串口调试助手,同时恢复动态数码管显示为“FFFFFFFF。为保证每个同学的实验都独立完成,要求回送的数据包含自己的学号,即如果你的学号是20150809,当前温度值是19.6摄氏度,那么在PC上的串口调试助手应该显示:20150809:19.6°C硬件电路说明:1)STC89处理器管脚和晶振电路Lee3CPU1|*1O41jvd1PIO1P)DV(:CPI|PQ.Qr1T-Jijrruuri*j,PH.2PO.ln/L1-汽3Pl3PD.2fl47Pl4PQJibF
3、Udri3e-Pl5PQ43,rLf4PlBPl.(5P0.5Pl7POLEJITFUBRSTVTDPD7手£产uLXU1UPj0DEAA>pP31"T4DEPROG.FJ.!<INrOPSEHPS1INtlP2.?TtX|KXJU1J产?二一工川尸;irr.|;2gmu尸百414P>4P2SF35TlPl.5U*OH1JP4122BF2J,A1J*J&1«P36P2.1J517F57RDP2.1J*JAl2IVXT<L2Pl>AlJI1厂XTAL1P2.LJiPTrnJFLxGKDP2t0Z1U-V'L2)独立按键K
4、1独立键盘RXDTXDnTFsTP箝(S2独立按键一共5个,分别连接在单片机的P3.0到P3.4口。去抖动的方式,我们采用软件延时的方法。过程如下:先设置IO口为高电平(一般上电默认就为高),读取IO口电平确认是否有按键按下,如有IO电平为低电平后,延时几个mg再读取该IO电平,如果任然为低电平,说明对应按键按下,执行相应按键的程序。3) DS18B2欧度传感器部分DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。初始时,温度寄存器被预置成
5、-55C,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1C,这个过程重复进行,直到计数器2计数到0时便停止。初始时,计数器1预置的是与-55C相对应的一个预置值。以后计数器1每一个循环的预置数都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1C计数器所需要的计数个数。DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25C进行比较,若低于0.25C,温度寄存器的最低位就置0;
6、若高于0.25C,最低位就置1;若高于0.75C时,温度寄存器的最低位就进位然后置0。这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5C,四舍五入最大量化误差为±1/2LSB,即0.25Co温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。DS18B20测量温度时使用特有的温度测量技术。DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打开时,DS
7、18B2眦行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累加器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。电路图及管脚如下:微处理器I/ODSI8B20接其他单总线设备中外部电源+3V+55V温度检测VCC1SB23P1-P17亘)P14P13近P71Ho4)串口通信串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要条数据线,外加一条公共信号地线和若干控制信号线。因为一次只能传送一位,所以对于个字节的数据,至少要分S位才能传送完毕。串行通信的必要过程是:发送时
8、,要把并行数据变成串行数据发送到线路上去,接收时,要把串行信号再变成并行数据,这样才能被计算机及其他设备处理。接收设稿串彳丁通信方式在串行通信中,收、发双方对发送或接收数据的速率要有约定。通过编程可对单片机串行口设定为4种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。串行的4种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以各种方式的波特率计算公式也不相同,以下是4种方式波特率的计算公式。方式0的波特率二八JI2n方式】的波特率=(2SMOD/32)x(T1溢出率八方式2的波特率=(2SMOD/64)方式3的波特率=(2s
9、mod/32)x(T1溢出率)。开发板的电路图如下图<MDCHI2345irdHcvl22U(i>DVCC丁XDR232RXI>RTS#V3UI>U»R片XI用即XOCISP14611It)VB27isTs470RI。LJI.5KAUK)R12±ZCIOICH12M22CINDCl2二22pFGND5)动态数码管显示数码管的显示原理是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示一个8字需要7个小段,另外还有一个小数点,所以其内部一共有8个小的发光二极管,
10、最后还有一个公共端,生产商为了封装统一,单位数码管都封装10个引脚,其中第3和第8引脚是连接在一起的。而它们的公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。从阳强结构©Wf©ahq&卜心dJcLJP=dQeDPo引脚排列上图展出了常用的两种数码管的引脚排列和内部结构。总所周知,点亮发光二极管就是要给予它足够大的正向压降。所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。如上图左(一共a、b、c、d、e、f、g、DP八段),如果要显示"1"则要点亮b、c两段LED;显示“A”则点亮a、b、c、e、f、g这六
11、段LED;动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。V可mulnJuLMHHmSEIfwn,hG:1,QpLJ:QwQdp4p-<ip*c电.电上Q由由QQw:山:心事际可j,q、强h完整程序代码:主程序文件main.c:串口设置函数/数码管显示读取/设置外部中断延时函数定时器初始设置逐字检查串口通#include"temp.h"/引用temp.h头文件,包括一些有关温度传感器的函数#include"reg51.h"/引用reg51.h头文件,说明引脚地址#defineGPIO_DIGP0将P0端口定义为
12、GPIO_DIG#defineGPIO_LEDP2将P2端口定义为GPIO_LEDsbitLSA=P2A2;位选,P2A2定义为LSAsbitLSB=P2A3;/同上位选定义变量sbitLSC=P2A4;/同上位选定义变量sbitK3=P3A2;/位选,P3A2定义为K3按键函数voidUsartConfiguration();voidLcdDisplay(int);到的温度voidIntConfiguration();voidDelay(unsignedintn);voidTimer0Configuration();voidCheckMessage(charm);信字符是否正确unsigne
13、dintflag=0;/数码管显示标志位unsignedintj=0;用于CheckMessageig字检查发送字符unsignedcharNum=0;/动态数码管位选I*主函数模块*unsignedintdisp8=0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71;/显示FFFFFFFFunsignedcharcodeDIG_CODE10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/0、1、2、3、4、5、6、7、8、9的显示码unsignedcharcheck17='0','0&
14、#39;,'0','0','0','0','0'/用来存放串口通信传送字符unsignedcharcheck27='G','e','t','T','e','m','p'/用来比较串口通信传送字符unsignedcharmessage17='4','1','5','0','1','6','0',&
15、#39;2',':','0','0','0','0','0','0','0','0'显示学号为41501602:unsignedcharDisplayData8;/用来存放要显示的8位数的值unsignedcharKeyValue=0;/是否按下独立按键的标志位voidDigDisplay();/动态数码管显示*/voidmain()/主函数unsignedinti;IntConfiguration();/初始化外部中断设置UsartConfi
16、guration();/初始化串口设置Timer0Configuration();/初始化定时器设置while(1)if(flag=1)/当flag为1时数码管直接显示当前温度LcdDisplay(Ds18b20ReadTemp();/调用温度传感器函数并在数码管显示温度if(flag=0)/当flag为0时数码管显示FFFFFFFFfor(i=0;i<8;i+)/循环给unsignedintk=0;disp口数组赋值dispi=0x71;/dispi赋/如果K3按键被按下的话,动态数码管就显示Delay(1);/延时消抖if(K3=0)FFFFFFFFKeyValue=1;flag=0
17、;for(k=0;k<17;k+)逐字将message小符数组中字符送入SBUFSBUF=messagek;/*将接收到的数据放入到发送寄存器独立按键模块*/voidIntConfiguration()/设置外部中断while(!TI);/等待发送数据完成TI=0;/清除发送完成标志位if(k=17)/设置INT0IT0=1;/跳变沿触发方式/如果messaged组发送完毕就归零准备下一次(下降沿)EX0=1;打开INT0k=0;的中断允许。/设置INT1IT1=1;/跳变沿触发方式else为下降沿EX1=1;的中断允许打开INT1KeyValue=0;按键没被按下的时候就一直保持当前状
18、态,/K3显示当前温EA=1;/打开总中断voidDelay(unsignedintn)/延时50us误差0usI*unsignedchara,b;串口通信模块for(;n>0;n-)*1for(b=1;b>0;b-)for(a=22;a>0;a-);voidUsartConfiguration()串口设置SCON=0X50;/设置为工彳方式1voidInt0()interrupt0外部中断0的中断函数TMOD=0X20;K3按键中断/设置计数器工作方式2,也就是自动重装模式单片机课程设计41501602王强物联1501PCON=0X80;特率加倍TH1=0XF3;数器初始值
19、设置,注意波特率是4800的TL1=0XF3;/波/计/打/打出去接收/清判断发送逐字检查/将按位逐字/不/符1*动态数码管模块*CO-I;开接收中断EA-1;开总中断TR1-1;/打开计数器)voidUsart()interrupt4/串口中(unsignedcharreceiveData;receiveData-SBUF;/到的数据RI-0;除接收中断标志位CheckMessage(receiveData);/字节是否正确)voidCheckMessage(charm)/串口通信字符是否正确(check1j-m;串口接收到的字符一位一位的赋给check1if(check1j!-check2
20、j)/检查发送字符是否符合要求(flag-1;符合直接退出)if(j-6)合时改变显示标志位,数码管显示当前温度(flag-1;)j+;按位检查*/voidDigDisplay()interrupt1/动态数码管显示(/定时器在工作方式二会自动重装初,所以不用在赋值。TH0-0X9c;给定时器赋初值,定时1msTL0-0X00;GPIO_DIG-0;消隐switch(Num)/位选,选择点亮的数码管,(case(7):LSA-0;LSB-0;LSC-0;reak;/显示第7位case(6):LSA-1;LSB-0;LSC-0;reak;/显示第6位case(5):LSA-0;LSB-1;LSC
21、-0;reak;/显示第5位case(4):LSA-1;LSB-1;LSC-0;reak;/显示第4位case(3):LSA-0;LSB-0;LSC-1break;/显示第3位case(2):LSA-1;LSB-0;LSC-1break;/显示第2位case(1):LSA-0;LSB-1;LSC-1break;/显示第1位case(0):LSA-1;LSB-1;LSC-1break;/显示第0位)GPIO_DIG=dispNum;/发送段码Num+;动态数码管从0到7循环点亮if(Num>7)Num=0;voidTimer0Configuration()/定时器初始设置TMOD=0X20
22、;/选择为定时器模式,工作方式2,仅用TRX丁开启动。TH0=0X9C;给定时器赋初值,定时100usTL0=0X9C;ET0=1;/打开定时器0中断允许EA=1;/打开总中断TR0=1;/打开定时器/*温度传感器DS18B2醵块*/voidLcdDisplay(inttemp)/数码管显示读取到的温度unsignedchardatas=0,0,0,0,0;/定义数组floattp;if(temp<0)/当温度值为负数disp2=0x40;/如果温度值为负数的时候,disp2数码管显示负号-/因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=tem
23、p;tp=temp;temp=tp*0.0625*100+0.5;留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就算由?.5,还是在小数点后面。elsedisp2=0;如果温度不是负数,就置零tp=temp;/因为数据处理有小数点所以将温度赋给一个浮点型变量如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点后面的数自动去掉,不管是否大于0.5,
24、而+0.5之后大于0.5的就是进1了,小于0.5的就算加上0.5,还是在小数点后面。message9=(temp/10000)+'0'/具体温度的百位message10=(temp%10000/1000)+'0'/具体温度的十位message11=(temp%1000/100)+'0'/具体温度的个位message12='.'小数点字符message13=(temp%100/10)+'0'/具体温度的十分位message14=(temp%10)+'0'/具体温度的千分位message15='
25、o'/message15和16字符串代表。C摄氏度符号message16='C'disp0=0;/disp0和disp1直接置零disp1=0;disp3=DIG_CODEtemp/10000;/数码管显示具体温度的百位disp4=DIG_CODEtemp%10000/1000;/数码管显示具体温度的十位disp5=DIG_CODEtemp%1000/100|0x80;/数码管显示具体温度的个位温度传感器temp.c:#include"temp.h"/* 函数名:Delay1ms* 函数功能:延时函数* 输入:无*输出:无*/voidDelay1ms
26、(unsignedinty)(unsignedintx;for(y;y>0;y-)for(x=110;x>0;x-);)/* 函数名:Ds18b20Init* 函数功能:初始化* 输入:无*输出:初始化成功返回1,失败返回0*/unsignedcharDs18b20Init()(unsignedinti;DSPORT=0;/将总线拉低480us960usi=70;while(i-);/延时642usDSPORT=1;然后拉高总线,如果DS18B20故出反应会将在15us60us后总线拉低共阴接法,数码管为高电平驱动,且小数点的段接在IO的bit7,所以用|0x80来点亮小数点dis
27、p6=DIG_CODEtemp%100/10;/数码管显示具体温度的十分位disp7=DIG_CODEtemp%10;/数码管显示具体温度的千分位)while(DSPORT)/等待DS18B20j低总线(i+;if(i>5000)/等待>5MSreturn0;/初始化失败)return1;/初始化成功)/* 函数名:Ds18b20WriteByte* 函数功能:向18B20写入一个字节* 输入:com* 输出:无* */voidDs18b20WriteByte(unsignedchardat)(unsignedinti,j;for(j=0;j<8;j+)(DSPORT=0;/
28、每写入一位数据之前先把总线拉低1usi+;DSPORT=dat&0x01/然后写入一个数据,从最低位开始i=6;while(i-);/延时68us,持续时间最少60usDSPORT=1;/然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat>>=1;)/*函数名:Ds18b20ReadByte*函数功能:读取一个字节*输入:com*输出:无*命令/*/unsignedcharDs18b20ReadByte()(unsignedcharbyte,bi;unsignedinti,j;for(j=8;j>0;j-)(DSPORT=0;先将总线拉低1usi+;DSPORT=1;懿后释放总线i+;i+;/延时6us等待数据稳定bi=DSPORT;/读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0o*/byte=(byte>>1)|(bi<<7);i=4;/读取完之后等待48us再接着读取下一个数while(i-);returnbyte;/*函数名:Ds18b20ChangTemp*函数功能:让18b20开始转换温度*输入:com*输出:无*/voidDs18b20ChangTemp()(Ds18b20Init();Delay1ms(1);Ds18b2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 服务礼仪教材课件
- 服务流程介绍课件
- 服务工人培训课件
- 房屋动态课件
- 服务标准培训模板课件
- 放太阳教学课件
- 防烫伤英文课件
- 扶梯技术交底课件
- 启动供应商评估与筛选流程通知函4篇
- 法庭方面的课件
- 2026年质量管理体系内部审核员考试审核发现与报告备考习题及答案
- 中医科医院感染管理制度-001
- 2025-2026学年七年级上学期期中考试语文试题(无答案)
- 2025青岛水务集团有限公司招聘(89人)笔试历年备考题库附带答案详解
- SA8000-2026社会责任管理体系内审管理评审全套资料
- 养老院冬季安全知识培训内容课件
- 大思政课视域下推进中小学学科德育的策略研究
- T/CNFAGS 16-2024绿色甲醇分级标准(试行)
- 学校物业外包管理方案与安全监管措施
- DB51∕T 2244-2016 农村公路路面典型结构设计指南
- 屋面防水技术规范
评论
0/150
提交评论