收藏 分享(赏)

嵌入式课程设计.pdf

上传人:精品资料 文档编号:11080138 上传时间:2020-02-06 格式:PDF 页数:13 大小:1.11MB
下载 相关 举报
嵌入式课程设计.pdf_第1页
第1页 / 共13页
嵌入式课程设计.pdf_第2页
第2页 / 共13页
嵌入式课程设计.pdf_第3页
第3页 / 共13页
嵌入式课程设计.pdf_第4页
第4页 / 共13页
嵌入式课程设计.pdf_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、 嵌入式课程设计 学 院 专业班级 姓 名 学 号 年 月 单片机课程设计 41501602 王强 物联 1501 2 嵌入式课程设计 学院: 计算机与通信工程学院 专业: 物联网工程 班级: 物联 1501 姓名: 王强 学号: 41501602 实验日期: 2017 年 12 月 25 日 实验名称: 嵌入式课程设计 实验目的: 以 STC89 开发板为硬件平台, 开发温度采集、动态数码管显示、按键响应、与 PC 串口通讯的综合程序,实现以下功能: 1) PC 上的串口调试助手通过串口给 STC89 开发板发送“ GetTemp” 命令。 2) STC89 开发板从串口接收到“ GetTe

2、mp” 命令后启动温度传感器 DS18B20 的测温程序获取当前温度,测试完成时将所测得温度数据显示在动态数码管上。 (动态数码管在温度获取之前应该显示“ FFFFFFFF” , 只有在获取温度后才显示温度值 ) 3)动态数码管显示出温度数据后, 请通过按键触发 STC89 开发板通过串口回送步骤 2所测的温度数据给 PC 上串 口调试助手,同时恢复动态数码管显示为“ FFFFFFFF” 。为保证每个同学的实验都独立完成,要求回送的数据包含自己的学号,即如果你的学号是 20150809,当前温度值是 19.6 摄氏度,那么在 PC 上的串口调试助手应该显示: 20150809 : 19.6 C

3、。 硬件电路说明: 1) STC89 处理器管脚和晶振电路 单片机课程设计 41501602 王强 物联 1501 3 2)独立按键 独立按键一共 5 个,分别连接在单片机的 P3.0 到 P3.4 口。去抖动的方式,我们采用软件延时的方法。过程如下: 先设置 IO 口为高电平(一般上电默认就为高) , 读取 IO 口电平确认是否有按键按下 ,如有 IO 电平为低电平后,延时几个 ms, 再读取该 IO 电平,如果任然为低电平,说明对应按键按下 , 执行相应按键的程序 。 3) DS18B20 温度传感器部分 DS18B20 内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器

4、1 提供一频率稳定的计数脉冲。 高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器 2 提供一个频率随温度变化的计数脉冲。 初始时,温度寄存器被预置成 -55,每当计数器 1 从预置数开始减计数到 0 时,温度寄存器中寄存的温度值就增加 1,这个过程重 复进行,直到计数器 2 计数到 0 时便停止。 初始时,计数器 1 预置的是与 -55相对应的一个预置值。以后计数器 1 每一个循环的预置数都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器 1 的预置数也就是在给定温度处使温度寄存器寄存值增加 1计数器所需要的计数个数。 DS18B2

5、0 内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2 停止计数后,比较器将计数器 1 中的计数剩余值转换为温度值后与 0.25进行比较,若低于 0.25,温度寄存器的最低位就置 0;若 高于 0.25,最低位就置 1;若高于 0.75时,温度寄存器的最低位就进位然后置 0。这样,经过比较后所得的温度寄存器的值就是最终读单片机课程设计 41501602 王强 物联 1501 4 取的温度值了,其最后位代表 0.5,四舍五入最大量化误差为 1/2LSB,即 0.25。 温度寄存器中的温度值以 9 位数据格式表示,最高位为符号位,其余 8 位以二进制补码形式表示温度值。测温结束

6、时,这 9 位数据转存到暂存存储器的前两个字节中,符号位占用第一字节, 8 位温度数据占据第二字节。 DS18B20 测量温度时使用特有的温度测量技术。 DS18B20 内部的低温度系数振荡器能产生稳定的频 率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打开时, DS18B20 进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累加器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应该为 9 位,但因符号位扩展成高 8 位,所以最后以 16 位补码形式读出。 电路图及管脚如下: 4)串口通信 串行通信是将数据字节分成一位一位的形式在

7、一条传输线上逐个地传送,此时只需要一条数据线,外加一条公共信号地线和若干控制信号线。因为一次只能传送一位,所以对于一个字节的数据,至少要分 S 位才能传送完毕。串行通信的必要过程是 :发送时,要把并单片机课程设计 41501602 王强 物联 1501 5 行数据变成串行数据发送到线路上去,接收时,要把串行信号再变成并行数据,这样才能被计算机及其他设备处理。 在串行通信中,收、发双方对发送或接收数据的速率要有约定。通过编程可对单片机串行口设定为 4 种工作方式,其中方式 0 和方式 2 的波特率是固定的,而方式 1 和方式 3的波特率是可变的,由定时器 T1 的溢出率来决定。串行口的 4 种工

8、作方式对应三种波特率。由于输入的移位时钟的来源不同,所以各种方式的波特率计算公式也不相同,以下是4 种方式波特率的计算公式。 开发板的电路图如下图 5) 动态 数码管显示 单片机课程设计 41501602 王强 物联 1501 6 数码管的显示原理是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是 10 个,显示一个 8 字需要 7 个小段,另外还有一个小数点,所以其内部一共有 8 个小的发光二极管,最后还有一个公共端,生产商为了 封装统一,单位数码管都封装 10 个引脚,其中第 3和第 8 引脚是连接在一起的。

9、而它们的公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。 上图展出了常用的两种数码管的引脚排列和内部结构。总所周知,点亮发光二极管就是要给予它足够大的正向压降。所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。如上图左(一共 a、 b、 c、 d、 e、 f、 g、 DP 八段),如果要显示“ 1”则要点亮 b、c 两段 LED;显示“ A”则点亮 a、 b、 c、 e、 f、 g 这六段 LED; 动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。 单片机课程设计 41501602 王强 物联 1501 7 完整程序

10、代码 : 主程序文件 main.c: #include“temp.h“ /引用 temp.h 头文件,包括一些有关温度传感器的函数 #include“reg51.h“ /引用 reg51.h 头文件,说明引脚地址 #define GPIO_DIG P0 /将 P0 端口定义为 GPIO_DIG #define GPIO_LED P2 /将 P2 端口定义为 GPIO_LED sbit LSA=P22; /位选, P22 定义为 LSA sbit LSB=P23; /同上位选定义变量 sbit LSC=P24; /同上位选定义变量 sbit K3=P32; /位选, P32 定义为 K3 按键

11、unsigned int disp8=0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71;/显示 FFFFFFFF unsigned char code DIG_CODE10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /0、 1、 2、 3、 4、 5、 6、 7、 8、 9 的显示码 unsigned char check17=0,0,0,0,0,0,0; /用来存放串口通信传送字符 unsigned char check27=G,e,t,T,e,m,p; /用来比较串口通信传送字符 unsigned c

12、har message17=4,1,5,0,1,6,0,2,:,0,0,0,0,0,0,0,0; /显示学号为 41501602: unsigned char DisplayData8; /用来存放要显示的 8 位数的值 unsigned char KeyValue=0; /是否按下独立按键的标志位 void DigDisplay(); /动态数码管显示函数 void UsartConfiguration(); /串口设置函数 void LcdDisplay(int); /数码管显示读取到的温度 void IntConfiguration(); /设置外部中断 void Delay(unsig

13、ned int n); /延时函数 void Timer0Configuration(); /定时器初始设置 void CheckMessage(char m); /逐字检查串口通信字符是否正确 unsigned int flag=0; /数码管显示标志位 unsigned int j=0; / 用于CheckMessage 逐字检查发送字符 unsigned char Num=0; /动态数码管位选 /* 主函数模块 */ void main() /主函数 unsigned int i; IntConfiguration(); / 初 始 化外部中断设置 UsartConfiguration

14、(); / 初 始 化串口设置 Timer0Configuration(); / 初 始 化定时器设置 while(1) if(flag=1) /当flag 为 1 时数码管直接显示当前温度 LcdDisplay(Ds18b20ReadTemp(); /调用温度传感器函数并在数码管显示温度 if(flag=0) /当flag 为 0 时数码管显示 FFFFFFFF 单片机课程设计 41501602 王强 物联 1501 8 for(i=0;i0;n-) for(b=1;b0;b-) for(a=22;a0;a-); void Int0() interrupt 0 /外部中断 0 的中断函数 K

15、3 按键中断 unsigned int k=0; Delay(1); /延时消抖 if(K3=0) /如果 K3 按键被按下的话,动态数码管就显示FFFFFFFF KeyValue=1; flag=0; for(k=0;k7) Num=0; void Timer0Configuration() /定时器初始设置 TMOD=0X20; /选择为定时器模式,工作方式 2,仅用 TRX 打开启动。 TH0=0X9C; /给定时器赋初值,定时 100us TL0=0X9C; ET0=1; /打开定时器 0 中断允许 EA=1; /打开总中断 TR0=1; /打开定时器 /* 温度传感器 DS18B20

16、 模块 */ void LcdDisplay(int temp) /数码管显示读取到的温度 unsigned char datas = 0, 0, 0, 0, 0; /定义数组 float tp; if(temp0;y-) for(x=110;x0;x-); /* * 函数 名 : Ds18b20Init * 函数功能 : 初始化 * 输入 : 无 * 输出 : 初始化成功返回 1,失败返回 0 unsigned char Ds18b20Init() unsigned int i; DSPORT=0; / 将 总 线 拉 低480us960us i=70; while(i-);/延时 642u

17、s DSPORT=1; /然后拉高总线,如果DS18B20 做出反应会将在 15us60us 后总线拉低 i=0; while(DSPORT) /等待 DS18B20 拉低总线 i+; if(i5000)/等待 5MS return 0;/初始化失败 return 1;/初始化成功 /* * 函数名 : Ds18b20WriteByte * 函数功能 : 向 18B20 写入一个字节 * 输入 : com * 输出 : 无 */ void Ds18b20WriteByte(unsigned char dat) unsigned int i,j; for(j=0;j=1; /* * 函数名 :

18、Ds18b20ReadByte * 函数功能 : 读取一个字节 * 输入 : com * 输出 : 无 */ unsigned char Ds18b20ReadByte() unsigned char byte,bi; unsigned int i,j; for(j=8;j0;j-) 单片机课程设计 41501602 王强 物联 1501 12 DSPORT=0;/先将总线拉低 1us i+; DSPORT=1;/然后释放总线 i+; i+;/延时 6us等待数据 稳定 bi=DSPORT; /读取数据,从最低位开始读取 /*将 byte 左移一位,然后与上右移 7 位后的 bi,注意移动之后

19、移掉那位补 0。 */ byte=(byte1)|(bi7); i=4; /读取完之后等待 48us 再接着读取下一个数 while(i-); return byte; /* * 函数名 : Ds18b20ChangTemp * 函数功能 : 让 18b20 开始转换温度 * 输入 : com * 输出 : 无 */ void Ds18b20ChangTemp() Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); /跳过 ROM操作命令 Ds18b20WriteByte(0x44); /温度转换命令 / Delay1ms(100); /等待

20、转换成功,而如果你是一直刷着的话,就不用这个延时了 /* * 函数名 : Ds18b20ReadTempCom * 函数功能 : 发送读取温度命令 * 输入 : com * 输出 : 无 */ void Ds18b20ReadTempCom() Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); /跳过 ROM 操作命令 Ds18b20WriteByte(0xbe); /发送读取温度命令 /* * 函数名 : Ds18b20ReadTemp * 函数功能 : 读取温度 * 输入 : com * 输出 : 无 */ int Ds18b20Rea

21、dTemp() int temp=0; unsigned char tmh,tml; Ds18b20ChangTemp(); /先写入转换命令 Ds18b20ReadTempCom(); /然后等待转换完后发送读取温度命令 tml=Ds18b20ReadByte(); /读取温度值共 16位,先读低字节 tmh=Ds18b20ReadByte(); /再读高字节 temp=tmh; temp=8; temp|=tml; return temp; 13 实验 效果 : 1)在给开发板发送“ GetTemp” 命令之前,动态数码管显示“ FFFFFFFF”: 2)用串口调试助手通过串口给开发板发送“ GetTemp” 命令之后,动态数码管显示当前温度: 3)按下 K3 按键后动态数码管再次显示“ FFFFFFFF”,而此时串口调试助手显示 我的学号 41501602 加当前温度 : 41501602: 23.94 C

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报