单片机小结

上传人:xzh****18 文档编号:45916174 上传时间:2018-06-20 格式:PDF 页数:11 大小:190.85KB
返回 下载 相关 举报
单片机小结_第1页
第1页 / 共11页
单片机小结_第2页
第2页 / 共11页
单片机小结_第3页
第3页 / 共11页
单片机小结_第4页
第4页 / 共11页
单片机小结_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《单片机小结》由会员分享,可在线阅读,更多相关《单片机小结(11页珍藏版)》请在金锄头文库上搜索。

1、 单片机电子温度计 从去年暑假开始接触单片机,做了整整一个暑假,因为是从一块木板,铝板 开始做起的, 用了CAD画机械图, 用AD画电路连接图和PCB, 用了80C51和STC5410 单片机,通过本学期的学习,更进一步对单片机的了解。于是用手上的一片 STC89C52 和 DS18B20 做了一个电子温度计,精确度为 0.1 度。 整个系统主要由电源模块、传感器测温模块、单片机控制模块及数码管显示 模块组成,下面是详细介绍。 一一DS18B20DS18B20 高精度数字传感器DS18B20具有,线路简单,体积小的特点。只需一根总线和单 片机相连, 便可实现单片机与传感器之间的通信。 数字化测

2、温系统, 有芯片内部, 模块直接将温度值转化为数字量输出,最高精度可达0.625摄氏度。 1、DS18B20的特点 (1)、只要求一个端口即可实现通信。 (2)、在DS18B20 中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任何元器件即可实现测温。 (4)、测量温度范围在55。C 到125。C 之间。 (5)、数字温度计的分辨率用户可以从9 位到12 位选择。 (6)、内部有温度上、下限告警设置。 2、DS18B20 的引脚介绍 序号 名称 引脚功能描述 1 GND 地信号 2 DQ 数据输入/输出引脚。开漏单总线接口引脚。当 被用着在寄生电源下,也可以向器件提供电源 3

3、 VDD 可选择的VDD 引脚。当工作于寄生电源时,此引 脚必须接地 3 DS18B20 的使用方法 由于DS18B20 采用的是1Wire 总线协议方式, 即在一根数据线实现数据的 双向传输,而对AT89S51 单片机来说,硬件上并不支持单总线协议,因此,我们 必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20 芯片的访问。 由 于DS18B20 是在一根I/O 线上读写数据,因此,对读写的数据位有着严格的时序 要求。DS18B20 有严格的通信协议来保证各位数据传输的正确性和完整性。该协 议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机 作为主设备,单总线

4、器件作为从设备。而每一次命令和数据的传输都是从主机主 动 启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需 启动读时序完成数据接收。数据和命令的传输都是低位在先。 DS18B20可直接将被测温度转化为串行数字信号,以供单片机处理,它还具 有微型化、低功率、高性能、抗干扰能力强等优点。通过编程,DS18B20可以实 现912位的温度读数。信息经过单线接口送入DS18B20或从DS18B20送出,因此从 单片机到DS18B20仅需连接一条信号线和地线。读、写和执行温度变换所需的电 源可以由数据线本身提供,而不需要外部电源。 4.程序实现 DS18B20的通信协议主要有产品说明书提

5、供,只要仿照其中的示例程序书写,就 可以实现与DS18B20的通信,从而读取到当前的温度值,然后再对获得的二进制 温度值进行处理,化为十进制存在相关寄存器中,提供给后面程序进行进一步处 理。 void Init_DS18B20(void) /初始化 unsigned char x=0; DQ = 1; /DQ 复位 delay(8); /稍做延时 DQ = 0; /单片机将 DQ 拉低 delay(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay(15); unsigned char ReadOneChar(void) /读一个字节 unsigned char i

6、=0; unsigned char dat = 0; for (i=8;i0;i-) DQ = 0; dat=1; DQ = 1; if(DQ) dat|=0x80; delay(5); return(dat); void WriteOneChar(unsigned char dat) /写一个字节 unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat delay(5); DQ = 1; dat=1; delay(5); void ReadTemperature(void) /温度读取 unsigned char a=0; unsigned

7、 int b=0; unsigned int t; Init_DS18B20(); WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x44); / 启动温度转换 delay(200); Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等(共可读 9 个寄存器) 前两个就是温度 a=ReadOneChar(); /低位 b=ReadOneChar(); /高位 b4)*10+(t temp_real=t; 二数码管显示二数码管显示 数码管模块主要用

8、于温度值的显示,系统选用的是四位共阴数码管。数码管有四 个位选端口加八个断选接口共十二跟引脚,由于数码管的引脚排列为乱序排列, 为了方便在硬件上并没有对其作出调整,而是通过软件进行重新排序的。 数码管的驱动使用的是上拉电阻,通过实验比较,最终选定 300 欧姆排阻为最终 方案。 每位数码管由八段 LED 组成,即传统的七段码加上小数点组成,八个小段分别命 名为 a,b,c,d,e,f,g,h,而将十进制 BCD 码转为数码管显示的表格也就 成为七段码译码表,数码管的显示内容是通过查表实现的。 由于数码管引脚有限,单片机的 I/O 口数量也不多,所以不可能让四位数码管同 时点亮,只能通过动态刷新

9、的方法,即在极端的时间内将四位数码管依次点亮, 然后通过人眼的视觉暂留现象,差生一种同时亮的错觉,从而在上面显示出四位 数字来。 相关程序: 数码管的动态刷新主要由定时器中断控制,当定时器中断到达时变熄灭上一位、 显示下一位,如此循环往复,不断动态刷新数码管。而且采用中断的方式可以将 main 函数空出来,方便以后其他功能的扩展。 由于传感器通信时有时序的问题,所以耗时较长,为防止出现测温时数码管闪烁 的现象,在传感器的测温过程不断插入数码管刷新子函数,保证数码管显示的连 续无闪烁。 void led_led(unsigned char j) /点亮数码管一位 if(tablej else l

10、ed_a1=0; if(tablej else led_a2=0; if(tablej else led_a3=0; if(tablej else led_a4=0; if(tablej else led_a5=0; if(tablej else led_a6=0; if(tablej else led_a7=0; if(tablej else led_a8=0; void led_light(void) /数码管显示 smg+; if (smg3) smg=0; led_b1=1;led_b2=1;led_b3=1;led_b4=1; led_a1=0;led_a2=0;led_a3=0;l

11、ed_a4=0; led_a5=0;led_a6=0;led_a7=0;led_a8=0; if(smg=0) led_b1=0;led_led(a); if(smg=1) led_b2=0;led_led(b); if(smg=2) led_b3=0;led_led(c); if(smg=3) led_b4=0;led_led(d); if (f=smg) led_a8=1; 三三电路图电路图 四四程序部分程序部分: #include #include #include /全局变量定义 unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6

12、d,0x7d,0x07,0x7f,0x6f,0x39,0x00, 0x40; /数码管显示表格( 0,1,2,3,4,5,6,7,8,9,c,空, -) unsigned int a,b,c,d,f; /显示位置(低-高) unsigned int num; /计时器 1 标志位 int temp_real; /当前真实温度*10 unsigned char smg=0; /数码管显示段位 /引脚定义 sbit led_a1=P24; sbit led_a2=P22; sbit led_a3=P34; sbit led_a4=P36; sbit led_a5=P37; sbit led_a6=

13、P25; sbit led_a7=P33; sbit led_a8=P35; sbit led_b4=P23; sbit led_b3=P26; sbit led_b2=P27; sbit led_b1=P32; sbit DQ=P00; /函数定义 void delay(unsigned int i);/延时函数 void led_led(unsigned char j); /点亮数码管一位 void led_light(void); /数码管显示 void Init_DS18B20(void); /18b20 初始化 unsigned char ReadOneChar(void); /18

14、b20 读一个字节 void WriteOneChar(unsigned char dat); /18b20 写一个字节 void ReadTemperature(void); /温度读取 void temp_temp(void); /温度数据处理 void chushihua(void); /程序初始化 /- /主函数 void main(void) chushihua(); /初始化程序 while(1); /- void chushihua(void) /程序初始化 TMOD |= 0x01; /计时器 0 TH0=0xb1; TL0=0xe0; ET0=1; TR0=1; TMOD|=0X20; /计时器 1 TH1=0XFC; TL1=0X18; ET1=1; TR1=1; EA=1; /打开总中断 /- /延时 void delay(unsigned int i)/延时函数 while(i-); /-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号