1、相比热敏电阻来说,DS18B20单总线数字式温度传感器灵敏度高,精度高,但本次课程设计对温度精度的要求不高,且因为DS18B20温度传感器需要初始化,价格也比热敏电阻高,综合考虑,本设计采用热敏电阻对温度信号进行采集。3) 显示器的选取: 显示系统是单片机控制系统的重要组成部分,主要用于显示各种参数的值,常用的显示器有CRT、LED、LCD等。本设计用LED数码管显示需求片数并不多,观察方便,而LED数码管相对于其他显示器价格也比较便宜,成本也较低,所以本系统采用LED数码管显示。(2) 整体电路 图3-2(3) 单元电路设计1)晶振电路:瓷片电容C1、C2是用来驱动晶振Y1的,因为晶振的大小
2、是16M,所以选用20P的电容。图3-3-12)复位电路:复位电路选用了10nF的电解电容和10K的电阻。图3-3-23)温度显示数码管驱动电路:PE0PE3是进行位选通的控制,PD口进行段选通的控制。图3-3-3(4) 说明电路工作原理本设计使系统可以检测-50110范围内的温度,考虑到测温精度,设置显示数值精确到0.5并且设置温度的上下限,当温度值超过上下限温度时,报警电路中的蜂鸣器鸣响,报警灯闪。根据STM8S105C6T6的引脚特性,本设计中采用PB0PB2和PD口作为四位数码管的驱动引脚,PA3PA5作为外部中断的输入,PB4作为热敏电阻与单片机之间的信息传送。PB5与蜂鸣器相接,控
3、制蜂鸣器是否鸣响。RST作为复位输入,当振荡器工作时,RST引脚出现2个机器周期以上高电平使单片机复位。PB5与正常工作指示灯相连接,PB7引脚与报警灯相接,控制报警灯是否闪亮。XTAL1振荡器反相放大器及内部时钟发生器的输入端。XTAL2振荡器反相放大器的输出端。四、电路和程序调试过程与结果(1)设计逻辑图:(2)部分程序代码#include /调用单片机头文件#define uchar unsigned char /无符号字符型 宏定义 变量范围0255#define uint unsigned int /无符号整型 宏定义 变量范围065535 /数码管段选定义 0 1 2 3 4 5
4、6 7 8 9 uchar code smg_du=0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,0x04,0x05,/ A B C D E F 不显示 0x06,0xa4,0x9c,0x64,0x8c,0x8e,0xff; /断码 /数码管位选定义sbit smg_we1 = P20; /数码管位选定义sbit smg_we2 = P22;sbit smg_we3 = P24;sbit smg_we4 = P26;uchar dis_smg8 = 0x14,0x77,0x4c,0x45,0x27,0x85,0x84; uchar smg_i = 3; /显示
5、数码管的个位数sbit dq = P33; /18b20 IO口的定义bit flag_wd_z_f; /正负温度int temperature ; /*1ms延时函数*/void delay_1ms(uint q) uint i,j; for(i=0;iq;i+) for(j=0;j= smg_i) i = 0; P0 = 0xff; /消隐 smg_we_switch(i); /位选 P0 = dis_smgi; /段选 /*18b20初始化函数*/void init_18b20() bit q; dq = 1; /把总线拿高 delay_uint(1); /15us dq = 0; /给
6、复位脉冲 delay_uint(80); /750us /把总线拿高 等待 delay_uint(10); /110us q = dq; /读取18b20初始化信号 delay_uint(20); /200us /把总线拿高 释放总线/*写18b20内的数据*/void write_18b20(uchar dat) uchar i;8; /写数据是低位开始 dq = 0; /把总线拿低写时间隙开始 dq = dat & 0x01; /向18b20总线写数据了 delay_uint(5); / 60us dq = 1; /释放总线 dat = 1;/*读取18b20内的数据*/uchar rea
7、d_18b20() uchar i,value; /把总线拿低读时间隙开始 value /读数据是低位开始 if(dq = 1) /开始读写数据 value |= 0x80; /60us 读一个时间隙最少要保持60us的时间 return value; /返回数据/*读取温度的值 读出来的是小数*/uint read_temp() uint value; uchar low; init_18b20(); /初始化18b20 write_18b20(0xcc); /跳过64位ROM write_18b20(0x44); /启动一次温度转换命令 delay_uint(50); /500us ini
8、t_18b20(); /初始化18b20 EA = 0; write_18b20(0xbe); /发出读取暂存器命令 low = read_18b20(); /读温度低字节 value = read_18b20(); /读温度高字节 EA = 1; value = 8; /把温度的高位左移8位 value |= low; /把读出的温度低位放到value的低八中 if(value & 0xf000) = 0xf000) flag_wd_z_f = 1; /负温度 else flag_wd_z_f = 0; /正温度 value *= 0.625; /转换到温度值 小数 /返回读出的温度 /*定
9、时器0初始化程序*/void time_init() /开总中断 TMOD = 0X01; /定时器0、定时器1工作方式1 ET0 = 1; /开定时器0中断 TR0 = 1; /允许定时器0定时/*主函数*/void main() P0 = P1 = P2 = P3 = 0xff; time_init(); /初始化定时器 temperature = read_temp(); /先读出温度的值 delay_1ms(650); /先读出温度的值 dis_smg0 = smg_dutemperature % 10; /取温度的小数显示 dis_smg1 = smg_dutemperature / 10 % 10 & 0xfb; /取温度的个位显示 dis_smg2 = smg_dutemperature / 100 % 10 ; /取温度的十位显示 while(1) temperature = read_temp(); /先读出温度的值 if(flag_wd_z_f = 1) /负温度 smg_i = 4; dis_smg0 = smg_dutemperature % 10; dis_smg1 = smg_dutemperature / 10 % 10 & dis_smg2 = smg_dutemperature /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1