嵌入式课程设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
单片机课程设计
41501602 王强 物联 1501
取的温度值了,其最后位代表 0.5℃,四舍五入最大量化误差为±1/2LSB,即 0.25℃。 温度寄存器中的温度值以 9 位数据格式表示, 最高位为符号位, 其余 8 位以二进制补码 形式表示温度值。测温结束时,这 9 位数据转存到暂存存储器的前两个字节中,符号位占用 第一字节,8 位温度数据占据第二字节。 DS18B20 测量温度时使用特有的温度测量技术。DS18B20 内部的低温度系数振荡器能产 生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打 开时,DS18B20 进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累 加器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应 该为 9 位,但因符号位扩展成高 8 位,所以最后以 16 位补码形式读出。 电路图及管脚如下:
4)串口通信 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要 一条数据线,外加一条公共信号地线和若干控制信号线。因为一次只能传送一位,所以对 于一个字节的数据,至少要分 S 位才能传送完毕。串行通信的必要过程是:发送时,要把并
4
单片机课程设计
41501602 王强 物联 1501
嵌入式课程设计
学
院
专业班级 姓 学 名 号
年
月
单片机课程设计
41501602 王强 物联 1501
嵌入式课程设计
学院:计算机与通信工程学院 专业:物联网工程 姓名: 王强 学号:41501602 班级: 物联 1501 实验日期: 2017 年 12 月 25 日
实验名称:
嵌入式课程设计
实验目的:
unsigned disp[8]={0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71}; //显示 FFFFFFFF unsigned char
int
********************************/
void main() code 函数 { unsigned int i; IntConfiguration(); 外部中断设置
sbit LSA=P2^2; //位选,P2^2 定义为 LSA sbit LSB=P2^3; //同上位选定义变量 sbit LSC=P2^4; //同上位选定义变量 sbit K3=P3^2; //位选,P3^2 定义为 K3 按键
unsigned int flag=0; 位 unsigned int j=0; CheckMessage 逐字检查发送字符 unsigned char Num=0;
上图展出了常用的两种数码管的引脚排列和内部结构。总所周知,点亮发光二极管就 是要给予它足够大的正向压降。所以点亮数码管其实也就是给它内部相应的发光二极管正 向压降。如上图左(一共a、b、c、d、e、f、g、DP 八段) ,如果要显示“1”则要点亮b、 c 两段LED;显示“A”则点亮a、b、c、e、f、g 这六段LED; 动态显示是多个数码管, 交替显示, 利用人的视觉暂停作用使人看到多个数码管同时显 示的效果。
{ LcdDisplay(Ds18b20ReadTemp()); //调用温度传感器函数并在数码管显示温度 } if(flag==0) // 当
void DigDisplay();
// 动 态 数 码
flag 为 0 时数码管显示 FFFFFFFF
7
单片机课程设计
{ for(i=0;i<8;i++) disp[]数组赋值 { disp[i]=0x71; //disp[i]赋值 } } // 循 环 给 K3 按键中断 {
// 用
UsartConfiguration(); 串口设置
// 初 始 化
// 用
Timer0Configuration(); 定时器设置
// 初 始 化
char
while(1) { if(flag==1) flag 为 1 时数码管直接显示当前温度 // 当
message[17]={'4','1','5','0','1','6','0','2',':','0','0','0','0','0','0','0', '0'}; //显示学号为 41501602: unsigned char DisplayData[8]; 要显示的 8 位数的值 unsigned char KeyValue=0; 按下独立按键的标志位 // 是否 // 用 来 存 放
以 STC89 开发板为硬件平台, 开发温度采集、动态数码管显示、按键响应、与 PC 串口 通讯的综合程序,实现以下功能: 1)PC 上的串口调试助手通过串口给 STC89 开发板发送“GetTemp”命令。 2)STC89 开发板从串口接收到“GetTemp”命令后启动温度传感器 DS18B20 的测温程序 获取当前温度,测试完成时将所测得温度数据显示在动态数码管上。(动态数码管在温度获 取之前应该显示“FFFFFFFF”, 只有在获取温度后才显示温度值) 3)动态数码管显示出温度数据后, 请通过按键触发 STC89 开发板通过串口回送步骤 2 所测的温度数据给 PC 上串口调试助手,同时恢复动态数码管显示为“FFFFFFFF”。为保证 每个同学的实验都独立完成, 要求回送的数据包含自己的学号, 即如果你的学号是 20150809, 当前温度值是 19.6 摄氏度,那么在 PC 上的串口调试助手应该显示:20150809 : 19.6°C。
开发板的电路图如下图
5)动态数码管显示
5
单片机课程设计
41501602 王强 物联 1501
数码管的显示原理是靠点亮内部的发光二极管来发光, 下面就来我们讲解一个数码管是 如何亮起来的。数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是 10 个, 显示一个 8 字需要 7 个小段,另外还有一个小数点,所以其内部一共有 8 个小的发光二极 管,最后还有一个公共端,生产商为了封装统一,单位数码管都封装 10 个引脚,其中第 3 和第 8 引脚是连接在一起的。 而它们的公共端又可分为共阳极和共阴极, 中间图为共阴极内 部原理图,右图为共阳极内部原理图。
硬件电路说明:
1)STC89 处理器管脚和晶振电路
2
单片机课程设计
41501602 王强 物联 1501
2)独立按键
独立按键一共 5 个,分别连接在单片机的 P3.0 到 P3.4 口。去抖动的方式,我们采用 软件延时的方法。过程如下: 先设置 IO 口为高电平(一般上电默认就为高) ,读取 IO 口电平确认是否有按键按下, 如有 IO 电平为低电平后,延时几个 ms,再读取该 IO 电平,如果任然为低电平,说明对应 按键按下,执行相应按键的程序。 3)DS18B20 温度传感器部分 DS18B20 内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器 1 提供一频率稳定的计数脉冲。 高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器 2 提供一个频率 随温度变化的计数脉冲。 初始时,温度寄存器被预置成-55℃,每当计数器 1 从预置数开始减计数到 0 时,温度 寄存器中寄存的温度值就增加 1℃,这个过程重复进行,直到计数器 2 计数到 0 时便停止。 初始时,计数器 1 预置的是与-55℃相对应的一个预置值。以后计数器 1 每一个循环的 预置数都由斜率累加器提供。 为了补偿振荡器温度特性的非线性性, 斜率累加器提供的预置 数也随温度相应变化。 计数器 1 的预置数也就是在给定温度处使温度寄存器寄存值增加 1℃ 计数器所需要的计数个数。 DS18B20 内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器 2 停止计数后, 比较器将计数器 1 中的计数剩余值转换为温度值后与 0.25℃进行比较, 若低 于 0.25℃,温度寄存器的最低位就置 0;若高于 0.25℃,最低位就置 1;若高于 0.75℃时, 温度寄存器的最低位就进位然后置 0。这样,经过比较后所得的温度寄存器的值就是最终读
行数据变成串行数据发送到线路上去,接收时,要把串行信号再变成并行数据,这样才能 被计算机及其他设备处理。
在串行通信中,收、发双方对发送或接收数据的速率要有约定。通过编程可对单片机 串行口设定为 4 种工作方式,其中方式 0 和方式 2 的波特率是固定的,而方式 1 和方式 3 的波特率是可变的,由定时器 T1 的溢出率来决定。串行口的 4 种工作方式对应三种波特 率。由于输入的移位时钟的来源不同,所以各种方式的波特率计算公式也不相同,以下是 4 种方式波特率的计算公式。
6
单片机课程设计
41501602 王强 物联 1501
完整程序代码:
主程序文件 Fra Baidu bibliotekain.c:
#include"temp.h" // 引 管显示函数 void UsartConfiguration(); void LcdDisplay(int); 到的温度 void IntConfiguration(); #define GPIO_DIG P0 //将 P0 端口定义为 GPIO_DIG #define GPIO_LED P2 //将 P2 端口定义为 GPIO_LED void Delay(unsigned int n); void Timer0Configuration(); void CheckMessage(char m); 信字符是否正确 //设置外部中断 //延时函数 //定时器初始设置 // 逐字检查串口通 //串口设置函数 // 数码管显示读取 用 temp.h 头文件,包括一些有关温度传感器的函数 #include"reg51.h" 用 reg51.h 头文件,说明引脚地址 // 引
// 数码管显示标志
//
用
于
//动态数码管位选
/********************************************** ********************************* 主函数模块 ***********************************************
// 主
DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 x07,0x7f,0x6f}; //0、1、2、3、4、5、6、7、8、9 的显示码
// 初 始 化
unsigned char check1[7]={'0','0','0','0','0','0','0'}; 来存放串口通信传送字符 unsigned char check2[7]={'G','e','t','T','e','m','p'}; 来比较串口通信传送字符 unsigned
41501602 王强 物联 1501
unsigned int k=0; Delay(1); if(K3==0) //如果 K3 按键被按下的话,动态数码管就显示 FFFFFFFF { KeyValue=1; //延时消抖
} }
flag=0; for(k=0;k<17;k++) //逐字将 message[]字符数组中字符送入 SBUF
/********************************************** ********************************* 独立按键模块 *********************************************** ********************************/ void IntConfiguration() { //设置 INT0 IT0=1; 发方式(下降沿) EX0=1; 的中断允许。 //设置 INT1 IT1=1; 发方式为下降沿 EX1=1; 的中断允许 EA=1; 断 } // 打 开 总 中 // 打开 INT1 // 跳 变 沿 触 else } // 打开 INT0 // 跳 变 沿 触 //设置外部中断
{ SBUF=message[k]; //将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 } if(k==17) //如果 message 数组发送完毕就归零准备下一次 { k=0; }
单片机课程设计
41501602 王强 物联 1501
取的温度值了,其最后位代表 0.5℃,四舍五入最大量化误差为±1/2LSB,即 0.25℃。 温度寄存器中的温度值以 9 位数据格式表示, 最高位为符号位, 其余 8 位以二进制补码 形式表示温度值。测温结束时,这 9 位数据转存到暂存存储器的前两个字节中,符号位占用 第一字节,8 位温度数据占据第二字节。 DS18B20 测量温度时使用特有的温度测量技术。DS18B20 内部的低温度系数振荡器能产 生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打 开时,DS18B20 进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累 加器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应 该为 9 位,但因符号位扩展成高 8 位,所以最后以 16 位补码形式读出。 电路图及管脚如下:
4)串口通信 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要 一条数据线,外加一条公共信号地线和若干控制信号线。因为一次只能传送一位,所以对 于一个字节的数据,至少要分 S 位才能传送完毕。串行通信的必要过程是:发送时,要把并
4
单片机课程设计
41501602 王强 物联 1501
嵌入式课程设计
学
院
专业班级 姓 学 名 号
年
月
单片机课程设计
41501602 王强 物联 1501
嵌入式课程设计
学院:计算机与通信工程学院 专业:物联网工程 姓名: 王强 学号:41501602 班级: 物联 1501 实验日期: 2017 年 12 月 25 日
实验名称:
嵌入式课程设计
实验目的:
unsigned disp[8]={0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71}; //显示 FFFFFFFF unsigned char
int
********************************/
void main() code 函数 { unsigned int i; IntConfiguration(); 外部中断设置
sbit LSA=P2^2; //位选,P2^2 定义为 LSA sbit LSB=P2^3; //同上位选定义变量 sbit LSC=P2^4; //同上位选定义变量 sbit K3=P3^2; //位选,P3^2 定义为 K3 按键
unsigned int flag=0; 位 unsigned int j=0; CheckMessage 逐字检查发送字符 unsigned char Num=0;
上图展出了常用的两种数码管的引脚排列和内部结构。总所周知,点亮发光二极管就 是要给予它足够大的正向压降。所以点亮数码管其实也就是给它内部相应的发光二极管正 向压降。如上图左(一共a、b、c、d、e、f、g、DP 八段) ,如果要显示“1”则要点亮b、 c 两段LED;显示“A”则点亮a、b、c、e、f、g 这六段LED; 动态显示是多个数码管, 交替显示, 利用人的视觉暂停作用使人看到多个数码管同时显 示的效果。
{ LcdDisplay(Ds18b20ReadTemp()); //调用温度传感器函数并在数码管显示温度 } if(flag==0) // 当
void DigDisplay();
// 动 态 数 码
flag 为 0 时数码管显示 FFFFFFFF
7
单片机课程设计
{ for(i=0;i<8;i++) disp[]数组赋值 { disp[i]=0x71; //disp[i]赋值 } } // 循 环 给 K3 按键中断 {
// 用
UsartConfiguration(); 串口设置
// 初 始 化
// 用
Timer0Configuration(); 定时器设置
// 初 始 化
char
while(1) { if(flag==1) flag 为 1 时数码管直接显示当前温度 // 当
message[17]={'4','1','5','0','1','6','0','2',':','0','0','0','0','0','0','0', '0'}; //显示学号为 41501602: unsigned char DisplayData[8]; 要显示的 8 位数的值 unsigned char KeyValue=0; 按下独立按键的标志位 // 是否 // 用 来 存 放
以 STC89 开发板为硬件平台, 开发温度采集、动态数码管显示、按键响应、与 PC 串口 通讯的综合程序,实现以下功能: 1)PC 上的串口调试助手通过串口给 STC89 开发板发送“GetTemp”命令。 2)STC89 开发板从串口接收到“GetTemp”命令后启动温度传感器 DS18B20 的测温程序 获取当前温度,测试完成时将所测得温度数据显示在动态数码管上。(动态数码管在温度获 取之前应该显示“FFFFFFFF”, 只有在获取温度后才显示温度值) 3)动态数码管显示出温度数据后, 请通过按键触发 STC89 开发板通过串口回送步骤 2 所测的温度数据给 PC 上串口调试助手,同时恢复动态数码管显示为“FFFFFFFF”。为保证 每个同学的实验都独立完成, 要求回送的数据包含自己的学号, 即如果你的学号是 20150809, 当前温度值是 19.6 摄氏度,那么在 PC 上的串口调试助手应该显示:20150809 : 19.6°C。
开发板的电路图如下图
5)动态数码管显示
5
单片机课程设计
41501602 王强 物联 1501
数码管的显示原理是靠点亮内部的发光二极管来发光, 下面就来我们讲解一个数码管是 如何亮起来的。数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是 10 个, 显示一个 8 字需要 7 个小段,另外还有一个小数点,所以其内部一共有 8 个小的发光二极 管,最后还有一个公共端,生产商为了封装统一,单位数码管都封装 10 个引脚,其中第 3 和第 8 引脚是连接在一起的。 而它们的公共端又可分为共阳极和共阴极, 中间图为共阴极内 部原理图,右图为共阳极内部原理图。
硬件电路说明:
1)STC89 处理器管脚和晶振电路
2
单片机课程设计
41501602 王强 物联 1501
2)独立按键
独立按键一共 5 个,分别连接在单片机的 P3.0 到 P3.4 口。去抖动的方式,我们采用 软件延时的方法。过程如下: 先设置 IO 口为高电平(一般上电默认就为高) ,读取 IO 口电平确认是否有按键按下, 如有 IO 电平为低电平后,延时几个 ms,再读取该 IO 电平,如果任然为低电平,说明对应 按键按下,执行相应按键的程序。 3)DS18B20 温度传感器部分 DS18B20 内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器 1 提供一频率稳定的计数脉冲。 高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器 2 提供一个频率 随温度变化的计数脉冲。 初始时,温度寄存器被预置成-55℃,每当计数器 1 从预置数开始减计数到 0 时,温度 寄存器中寄存的温度值就增加 1℃,这个过程重复进行,直到计数器 2 计数到 0 时便停止。 初始时,计数器 1 预置的是与-55℃相对应的一个预置值。以后计数器 1 每一个循环的 预置数都由斜率累加器提供。 为了补偿振荡器温度特性的非线性性, 斜率累加器提供的预置 数也随温度相应变化。 计数器 1 的预置数也就是在给定温度处使温度寄存器寄存值增加 1℃ 计数器所需要的计数个数。 DS18B20 内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器 2 停止计数后, 比较器将计数器 1 中的计数剩余值转换为温度值后与 0.25℃进行比较, 若低 于 0.25℃,温度寄存器的最低位就置 0;若高于 0.25℃,最低位就置 1;若高于 0.75℃时, 温度寄存器的最低位就进位然后置 0。这样,经过比较后所得的温度寄存器的值就是最终读
行数据变成串行数据发送到线路上去,接收时,要把串行信号再变成并行数据,这样才能 被计算机及其他设备处理。
在串行通信中,收、发双方对发送或接收数据的速率要有约定。通过编程可对单片机 串行口设定为 4 种工作方式,其中方式 0 和方式 2 的波特率是固定的,而方式 1 和方式 3 的波特率是可变的,由定时器 T1 的溢出率来决定。串行口的 4 种工作方式对应三种波特 率。由于输入的移位时钟的来源不同,所以各种方式的波特率计算公式也不相同,以下是 4 种方式波特率的计算公式。
6
单片机课程设计
41501602 王强 物联 1501
完整程序代码:
主程序文件 Fra Baidu bibliotekain.c:
#include"temp.h" // 引 管显示函数 void UsartConfiguration(); void LcdDisplay(int); 到的温度 void IntConfiguration(); #define GPIO_DIG P0 //将 P0 端口定义为 GPIO_DIG #define GPIO_LED P2 //将 P2 端口定义为 GPIO_LED void Delay(unsigned int n); void Timer0Configuration(); void CheckMessage(char m); 信字符是否正确 //设置外部中断 //延时函数 //定时器初始设置 // 逐字检查串口通 //串口设置函数 // 数码管显示读取 用 temp.h 头文件,包括一些有关温度传感器的函数 #include"reg51.h" 用 reg51.h 头文件,说明引脚地址 // 引
// 数码管显示标志
//
用
于
//动态数码管位选
/********************************************** ********************************* 主函数模块 ***********************************************
// 主
DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0 x07,0x7f,0x6f}; //0、1、2、3、4、5、6、7、8、9 的显示码
// 初 始 化
unsigned char check1[7]={'0','0','0','0','0','0','0'}; 来存放串口通信传送字符 unsigned char check2[7]={'G','e','t','T','e','m','p'}; 来比较串口通信传送字符 unsigned
41501602 王强 物联 1501
unsigned int k=0; Delay(1); if(K3==0) //如果 K3 按键被按下的话,动态数码管就显示 FFFFFFFF { KeyValue=1; //延时消抖
} }
flag=0; for(k=0;k<17;k++) //逐字将 message[]字符数组中字符送入 SBUF
/********************************************** ********************************* 独立按键模块 *********************************************** ********************************/ void IntConfiguration() { //设置 INT0 IT0=1; 发方式(下降沿) EX0=1; 的中断允许。 //设置 INT1 IT1=1; 发方式为下降沿 EX1=1; 的中断允许 EA=1; 断 } // 打 开 总 中 // 打开 INT1 // 跳 变 沿 触 else } // 打开 INT0 // 跳 变 沿 触 //设置外部中断
{ SBUF=message[k]; //将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 } if(k==17) //如果 message 数组发送完毕就归零准备下一次 { k=0; }