《嵌入式课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计.docx(16页珍藏版)》请在优知文库上搜索。
1、嵌入式课程设计学院:计算机与通信工程学院专业:物联网工程班级:物联姓名:学号:实验日期:2017年X月X日实验名称:嵌入式课程设计实验目的:以STC89开发板为硬件平台,开发温度采集、动态数码管显示、按键响应、与PC串口通讯的综合程序,实现以下功能:1) PC上的串口调试助手通过串口给STC89开发板发送“GetTcmp”命令。2) STC89开发板从串口接收到“GetTemp”命令后启动温度传感器DS18B20的测温程序获取当前温度,测试完成时将所测得温度数据显示在动态数码管上。(动态数码管在温度获取之前应该显示“FFFFFFFF”,只有在获取温度后才显示温度值)3)动态数码管显示出温度数据
2、后,请通过按键触发STC89开发板通过串口回送步骤2所测的温度数据给PC上串口调试助手,同时恢复动态数码管显示为“FFFFFFFF。为保证每个同学的实验都独立完成,要求回送的数据包含自己的学号,即如果你的学号是20150809,当前温度值是19.6摄氏度,那么在PC上的串口调试助手应该显示:20150809:19.60C0硬件电路说明:1)STC89处理器管脚和晶振电路GNDXTl33P1 2MXT233P2)独立按键独立键盘独立按键一共5个,分别连接在单片机的P3.0到P3.4口。去抖动的方式,我们采用软件延时的方法。过程如下:先设置10口为高电平(一般上电默认就为高),读取K)口电平确认是
3、否有按键按下,如有IO电平为低电平后,延时几个ms,再读取该10电平,如果任然为低电平,说明对应按键按下,执行相应按键的程序。3)DS18B20温度传感器部分DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。初始时,温度寄存器被预置成-55,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1,这个过程重复进行,直到计数器2计数到0时便停止。初始时,计数器1预置的是与-55相对应的一个预置值。以后计数器1每一个循环的预置数
4、都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加IC计数器所需要的计数个数。DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25C进行比较,若低于0.25C,温度寄存器的最低位就置0;若高于0.25C,最低位就置1:若高于0.75C时,温度寄存器的最低位就进位然后置0。这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5,四舍五入最大量化误差为12LSB,即0.25C。温
5、度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。DS18B20测量温度时使用特有的温度测量技术。DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打开时,DS18B20进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累加器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。电路图及管脚
6、如下:18B20 Pl7温度检测V267756784)串口通信串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要一条数据线,外加一条公共信号地线和若干控制信号线。因为一次只能传送一位,所以对于一个字节的数据,至少要分S位才能传送完毕。串行通信的必要过程是:发送时,要把并单片机课程设计41501602王强物联1501行数据变成串行数据发送到线路上去,接收时,要把串行信号再变成并行数据,这样才能被计算机及其他设备处理。接收设备8位腋次传送发送设备串行通信方式在串行通信中,收、发双方对发送或接收数据的速率要有约定。通过编程可对单片机串行口设定为4种工作方式,其中方式0和方式2
7、的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器Tl的溢出率来决定。串行口的4种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以各种方式的波特率计算公式也不相同,以下是4种方式波特率的计算公式。方式0的波特率=AsC/12。方式1的波特率=(2smod32)(Tl溢出率)。方式2的波特率=(2smod64)fax.方式3的波特率=(2smod/32)(Tl溢出率)。5)动态数码管显示数码管的显示原理是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示一个8字需要7个小段,另外还有一
8、个小数点,所以其内部一共有8个小的发光二极管,最后还有一个公共端,生产商为了封装统一,单位数码管都封装10个引脚,其中第3和第8引脚是连接在一起的。而它们的公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。引脚排列共阳假结构共阴极结构(a)常见LED数码管上图展出了常用的两种数码管的引脚排列和内部结构。总所周知,点亮发光二极管就是要给予它足够大的正向压降。所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。如上图左(一共a、b、c、d、e、f、g、DP八段),如果要显示“1”则要点亮b、c两段LED;显示“A”则点亮a、b、c、e、f、g这六段LED;动态显
9、示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。完整程序代码:主程序文件main.cs#includetemp.h/引用temph头文件,包括一些有关温度传感器的函数ttincludereg51.h,/引用reg51.h头文件,说明引脚地址WdefineGPIO_DIGPO将PO端口定义为GPIO-DIGffdefineGPIO_LEDP2将P2端口定义为GPIO_LEDSbitLSA=P22;位选,P20定义为LSASbitLSB=P23;同上位选定义变量SbitLSC=P24;同上位选定义变量SbitK3=P32;位选,P39定义为K3按键unsignedi
10、ntdisp8=071,0x71r0x71,0x71,0x71r0x71,0x71,0x71);显示FFFFFFFFunsignedcharcodeDIG-CODE10)=03f,006,05b,04f,0x66,06d,07d,007,07f,06f);0、1、2、3、4、5、6、7、8,9的显示码unsignedcharcheckl(7=,0,0,0,0,0,0,0);/用来存放串口通信传送字符unsignedcharcheck2(7=,G,le,t,T,e,m7p,;/用来比较串口通信传送字符unsignedcharmessage17=71757Zl670,2,07070,07070,0
11、,0);显示学号为41501602:unsignedcharDisplayData8;用来存放要显示的8位数的值unsignedcharKeyVaIue=O;/是否按下独立按键的标志位voidDigDispIayO;动态数码管显示函数voidUsartConfigurationO;voidLcdDisplay(int);到的温度voidIntConfigurationO;voidDelay(unsignedintn);voidTimerOConfigurationO;voidCheckMessage(charm);信字符是否正确串口设置函数数码管显示读取设置外部中断延时函数定时器初始设置逐字检
12、查串口通unsignedintflag=O;位unsignedintj=0;CheckMessage逐字检查发送字符unsignedcharNUm=0;数码管显示标志用于动态数码管位选/本*今*主函数模块*今*A*/voidmain()/主函数unsignedinti;IntConfigurationO;初始化外部中断设置UsartConfigurationO;初始化串口设置TimerOConfigurationO;初始化定时器设置while(l)if(fag=l)/当flag为1时数码管直接显示当前温度1.cdDisplay(Dsl8b20ReadTemp();调用温度传感器函数并在数码管显
13、示温度)if(fag=O)/当flag为0时数码管显示FFFFFFFFfor(i=0;i0;n-)(for(b=l;b0;b-)for(a=22;a0;a-);)voidlnt()interrupt0设置外部中断跳变沿触发方式打开INTO跳变沿触发方式打开INTl打开总中断延时50us误差OUS外部中断。的中断函数K3按键中断unsignedintk=0;DeIay(I);延时消抖if(K3=0)如果K3按键被按下的话,动态数码管就显示FFFFFFFFKeyVaIue=I;fag=O;for(k=0;k17;k+)逐字将message字符数组中字符送入SBUF(SBUF=message(k);将接收到的数据放入到发送寄存器while(!