欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    51单片机设计数字温度计(流程图+源码+实物图片)要点(共19页).doc

    • 资源ID:16706680       资源大小:524KB        全文页数:19页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    51单片机设计数字温度计(流程图+源码+实物图片)要点(共19页).doc

    精选优质文档-倾情为你奉上DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示。图3-4 DS18B20程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。由于单片机的I/O口有限,所以数码管采用动态扫描的方式来进行显示。程序流程图如图所示。图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。具体的程序流程图如图所示。图按键程序流程图附1 源程序代码/* 程序名; 基于DS18B20的测温系统* 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。 * 编程者:ZPZ* 编程时间:2009/10/2 */#include<AT89X52.h> /将AT89X52.h头文件包含到主程序#include<intrins.h> /将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int /变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char /变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; /max是上限报警温度,min是下限报警温度bit s=0;/s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; /s1标志位用于上下限查看时的显示void display1(uint z); /声明display1()函数#include"ds18b20.h" /将ds18b20.h头文件包含到主程序#include"keyscan.h" /将keyscan.h头文件包含到主程序#include"display.h" /将display.h头文件包含到主程序/*主函数*/void main() beer=1; /关闭蜂鸣器 led=1; /关闭LED灯 timer1_init(0); /初始化定时器1(未启动定时器1)get_temperature(1); /首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器) while(1) /主循环 keyscan(); /按键扫描函数 get_temperature(0); /获取温度函数 keyscan(); /按键扫描函数 display(temp,temp_d*0.625);/显示函数 alarm(); /报警函数 keyscan(); /按键扫描函数 /* 程序名; _ds18b20_h_* 功 能: DS18B20的c51编程头文件 * 编程者:ZPZ* 编程时间:2009/10/2 * 说 明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d * (测得的温度小数部分),标志位f(测量温度的标志位0表示“正温度”1表* 示“负温度”),标志位f_max(上限温度的标志位0表示“正温度”、1表* 示“负温度”),标志位f_min(下限温度的标志位0表示“正温度”、1表* 示“负温度”),标志位w(报警标志位1启动报警0关闭报警)。 */#ifndef _ds18b20_h_/定义头文件#define _ds18b20_h_#define uint unsigned int /变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char /变量类型宏定义,用uchar表示无符号字符型(8位)sbit DQ= P23; /可位寻址变量定义,用DQ表示P2.3口sbit beer=P10; /用beer表示P1.0sbit led=P11; /用led表示P1.1uchar temp=0; /测量温度的整数部分uchar temp_d=0; /测量温度的小数部bit f=0; /测量温度的标志位,0表示“正温度”1表示“负温度”)bit f_max=0; /上限温度的标志位0表示“正温度”1表示“负温度”)bit f_min=0; /下限温度的标志位0表示“正温度”、1表示“负温度”)bit w=0;/报警标志位1启动报警0关闭报警)/*延时子函数*/void ds18b20_delayus(uint t) /延时几s while(t-);void ds18b20_delayms(uint t) /延时1ms左右 uint i,j; for(i=t;i>0;i-) for(j=120;j>0;j-);/*ds18b20初始化函数*/void ds18b20_init() / DS18B20初始化 DQ=1; /拉高数据线DQ=0; /控制器向DS18B20发低电平脉冲ds18b20_delayus(30); /延时480s左右DQ=1; /控制器拉高总线,while(DQ); /等待DS18B20拉低总线ds18b20_delayus(20); /延时,等待上拉电阻拉高总线DQ=1; /拉高数据线,准备数据传输;/*ds18b20字节读函数*/uchar ds18b20_read() /DS18B20 字节读取uchar i;/定义一个局部变量i(局部变量只在本函数中有效)uchar d = 0; /定义一个局部变量dDQ = 1; /准备读;for(i=8;i>0;i-) /一位一位的读,循环8次 d >>= 1; /d右移一位,低位先发;DQ = 0;_nop_();_nop_();_nop_();DQ = 1; /必须写1,否则读出来的将是不预期的数据;if(DQ) /在12us处读取数据,送给d的最高位d |= 0x80;ds18b20_delayus(10); return d; /返回读取的值/*ds18b20字节写函数*/void ds18b20_write(uchar d) / ds18b20字节写 uchar i; for(i=8;i>0;i-) /一位一位的写 DQ=0; _nop_(); _nop_();_nop_(); DQ=d&0x01;/写数据 ds18b20_delayus(5); DQ=1;d >>= 1; /d右移一位,低位先发; /*获取温度函数*/ void get_temperature(bit f)uchar a=0,b=0,c=0,d=0; uint i;ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc);/向DS18B20发跳过读ROM命令ds18b20_write(0x44);/写启动DS18B20进行温度转换命令,转换结果存入内部RAMif(f=1) /首次启动DS18B20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错误值。 display1(1);/用开机动画耗时elseds18b20_delayms(1);ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20发跳过读ROM命令ds18b20_write(0xbe);/写读内部RAM中9字节的内容命令a=ds18b20_read();/读内部RAM (LSB)b=ds18b20_read();/读内部RAM (MSB)if(f=1)/局部位变量f=1时读上下限报警温度 max=ds18b20_read(); /读内部RAM (TH) min=ds18b20_read(); /读内部RAM (Tl)if(max&0x80)=0x80) /若读取的上限温度的最高位(符号位)为1表明是负温度f_max=1;max=(max-0x80); /将上限温度符号标志位置1表示负温度,将上限温度转换成无符号数。 if(min&0x80)=0x80)/若读取的下限温度的最高位(符号位)为1表明是负温度f_min=1;min=(min-0x80);/将下限温度符号标志位置1表示负温度,将下限温度装换成无符号数。i=b;i>>=4;if (i=0) f=0; /i为0,表示读取的温度是正温度,设立正温度标记 temp=(a>>4)|(b<<4);/整数部分 a=(a&0x0f); temp_d=a;/小数部分else f=1; /i为1,表示读取的温度是负温度,设立负温度标记 a=a+1;/负数的小数部分取反加1 b=b;/负数的整数部分取反 temp=(a>>4)|(b<<4);/整数部分 a=(a&0x0f);/小数部分,低四位为小数位 temp_d=a; /*存储极限温度函数*/ void store_t() if(f_max=1) /若上限温度为负,将上限温度转换成有符号数(最高1是负,0是正)max=max+0x80;if(f_min=1) /若下限温度为负,将下限温度转换成有符号数min=min+0x80; ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20发跳过读ROM命令ds18b20_write(0x4e);/向DS18B20发写字节至暂存器2和3(TH和TL)命令ds18b20_write(max); /向暂存器TH(上限温度暂存器)写温度ds18b20_write(min); /向暂存器TL(下限温度暂存器)写温度ds18b20_write(0xff); /向配置寄存器写命令,进行温度值分辨率设置ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20发跳过读ROM命令ds18b20_write(0x48); /向DS18B20发将RAM中2、3字节的内容写入EEPROM /DS18B20上电后会自动将EEPROM中的上下限温度拷贝到TH、TL暂存器/*温度超限报警函数*/ void alarm() if(f_max=0) /若上限值是正值 if(f_min=0) /若下限值是正值 if(f=0) /若测量值是正值 if(temp+temp_d*0.0625)<=min|(temp+temp_d*0.0625)>=max) w=1;TR1=1; /当测量值小于最小值或大于最大值时报警 if(temp+temp_d*0.0625)<max&&(temp+temp_d*0.0625)>min) w=0; /当测量值大于最小值且小于最大值时不报警 if(f=1)w=1;TR1=1; /若测量值是负值时报警 if(f_min=1) /若下限值是负值 if(f=0) /若测量值是正值 if(temp+temp_d*0.0625)>=max)/当测量值大于最大值时报警 w=1;TR1=1; if(temp+temp_d*0.0625)<max )/当测量值小于最大值时不报警 w=0; if(f=1) /若测量值是负值 if(temp+temp_d*0.0625)>=min)/当测量值大于最小值时报警 w=1;TR1=1; if(temp+temp_d*0.0625)<min)/当测量值小于最小值时不报警 w=0; if(f_max=1) /若上限值是负值 if(f_min=1) /若下限值是负值 if(f=1) /若测量值是负值 if(temp+temp_d*0.0625)<=max|(temp+temp_d*0.0625)>=min)w=1;TR1=1; /当测量值小于最大值或大于最小值时报警,比较的是其绝对值 if(temp+temp_d*0.0625)<min&&(temp+temp_d*0.0625)>max) w=0; /当测量值小于最小值且大于最大值时不报警 if(f=0)w=1;TR1=1; /若测量值是正值时报警 #endif/* 程序名; _keyscan_H_ * 功 能: ds18b20键盘头文件,通过键盘设定设定上下限报警温度* 编程者:ZPZ* 编程时间:2009/10/2 */#ifndef _keyscan_H_/定义头文件#define _keyscan_H_sbit key1=P22; /可位寻址变量定义,用key1表示P2.2口sbit key2=P21; /用key2表示P2.1口sbit key3=P20;/用key3表示P2.0口sbit key4=P33;/用key4表示P3.3口uchar i=0; /定义全局变量i用于不同功能模式的选择,0正常模式,1上限调节模式,2下限调节模式uchar a=0;/定义全局变量a用于不同模式下数码管显示的选择bit k4=0;/K4按键双功能选择位,k4=0时K4按键选择消按键音的功能,k4=1时K4按键选择正负温度设定功能bit v=0;/K2、K3按键双功能选择位,v=0时选择上下限查看功能,v=1时选择上下限温度加减功能bit v1=0;/v1=1时定时1250ms时间到自动关闭报警上下限查看功能bit v2=0; /消按键音功能调整位,为0时开按键音,为1时关按键音/*读键盘延时子函数*/void keyscan_delay(uint z)/延时1ms左右 uint i,j; for(i=z;i>0;i-)for(j=120;j>0;j-);/*温度调节函数*/int temp_change(int count,bit f)/上下限温度调整 if(key2=0)/判断K2是否按下if(v2=0)beer=0;/v2=0开按键音,否则消按键音keyscan_delay(10);/延时10msif(key2=0)/再次判断K2是否按下(实现按按键时消抖) beer=1;/K2按下关按键音 if(f=0)/若温度为正 count+;/每按一下K2温度上调1 if(a=1)if(count>125) count=125;/当温度值大于125时不上调 if(a=2)if(count>125) count=125; if(f!=0)/若温度为负 count+;/每按一下K2温度下调1 if(a=1)if(count>55) count=55;/当温度值小于-55时不再下调 if(a=2)if(count>55) count=55; while(key2=0);keyscan_delay(10); /K2松开按键时消抖if(key3=0) if(v2=0)beer=0; keyscan_delay(10);if(key3=0) /K3按按键时消抖 beer=1; count-;/每按一下K3温度为正时下调1,为负时上调1if(a=1)if(count<0) count=0;/当温度值达到0时不再调if(a=2)if(count<0) count=0;while(key3=0); keyscan_delay(10);/K3松开按键时消抖return count;/*读键盘函数*/void keyscan() if(key1=0) if(v2=0) beer=0; keyscan_delay(10);if(key1=0)/K1按按键时消抖 beer=1; TR1=1;/开定时器1,通过s标志位的变化,实现在上下限温度调整时温度显示时闪烁的功能 k4=1;/在上下温度调节功能模式下选择K4的调整上下限温度正负的功能 v=1;/在上下温度调节功能模式下选择K2、K3的温度加减功能 i+;/K1按一下i加1,i=0进入正常模式,i=1进入调上限模式,i=2进入调下限模式 if(i>2)/K1按下三次后退出调节模式 i=0;/进入正常模式 TR1=0;/关定时器1 k4=0;/在正常模式下选择K4的消按键音功能 v=0;/在正常模式下选择K2、K3的查看上下限报警温度功能 store_t();/存储调整后的上下限报警温度 switch(i)/显示选择 case 0:a=0;break;/a=0选择显示测得的温度 case 1:a=1;break; /a=1选择显示上限温度 case 2:a=2;break; /a=2选择显示下限温度 default:break; while(key1=0);/K1松按键时消抖keyscan_delay(10);if(a=1&&v=1)/a=1选择显示上限温度且v=1时选择上下限温度加功能led=0;max=temp_change(max,f_max);/显示上限温度else if(a=2&&v=1)/a=2选择显示下限温度且v=1时选择上下限温度减功能led=1;min=temp_change(min,f_min);else;if(k4=1)/k4=1时K4按键选择正负温度设定功能if(key4=0) if(v2=0)beer=0; keyscan_delay(5);if(key4=0) beer=1; if(a=1) if(max>55) f_max=0;else f_max=f_max;/当温度大于55度时,只能设定为正温度 if(a=2) if(min>55) f_max=0;else f_min=f_min;/当温度大于55度时,只能设定为正温度 while(key4=0); keyscan_delay(10);if(v=0) /v=0时选择上下限查看功能if(key2=0) if(v2=0)beer=0; keyscan_delay(10);if(key2=0) beer=1; a=1;/选择上限显示 TR1=1;/开定时器1开始定时一分钟左右 s1=1; /上限显示不闪烁,显示一分钟左右自动退出while(key2=0); keyscan_delay(10);if(key3=0) if(v2=0)beer=0; keyscan_delay(10);if(key3=0) beer=1; a=2;/选择下限显示 TR1=1;/开定时器1开始定时1s s1=1; /下限显示不闪烁,显示1s自动退出 while(key3=0); keyscan_delay(10);if(v1=1)/v1=1时定时1s时间到自动关闭报警上下限查看功能a=0;v1=0;TR1=0; /a=0显示实测温度,v1清零,关定时器1if(k4=0) /k4=0时K4按键选择消按键音的功能 if(key4=0)if(v2=0)beer=0; keyscan_delay(10);if(key4=0) beer=1; v2=v2;/为0时开按键音,为1时关按键音 while(key4=0);keyscan_delay(10); #endif/* 程序名; _ds18b20_display_H_ * 功 能: ds18b20数码管动态显示头文件,通过定时器0延时实现数码管动态显示* 编程者:ZPZ* 编程时间:2009/10/2 */#ifndef _ds18b20_display_H_ /定义头文件#define _ds18b20_display_H_#define uint unsigned int /变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char /变量类型宏定义,用uchar表示无符号字符型(8位)sbit wei1=P24; /可位寻址变量定义,用wei1表示P2.4口sbit wei2=P25; /用wei2表示P2.5口sbit wei3=P26; /用wei3表示P2.6口sbit wei4=P27; /用wei4表示P2.7口uchar num=0; /定义num为全局无符号字符型变量,赋初值为0uchar code temperature1= 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f;/定义显示码表09uchar code temperature2= 0xbf,0x86,0xdb,0xcf,0xe6, 0xed,0xfd,0x87,0xff,0xef;/带小数点的0.9.uchar code temperature3= 0x00,0x80,0x40,0x76,0x38;/依次是不显示.-HL/*延时子函数*/void display_delay(uint t) /延时1ms左右uint i,j;for(i=t;i>0;i-) for(j=120;j>0;j-);/*定时器1初始化函数*/void timer1_init(bit t) TMOD=0x10;/设定定时器1工作在方式1,最大定时65.53ms TH0=0x3c;/定时器赋初值,定时50ms TL0=0xb0; EA=1;/开总中断 ET1=1;/开定时器1中断 TR1=t; / 局部变量t为1启动定时器1,为0关闭定时器1/*定时器1中断函数*/void timer1() interrupt 3 TH0=0x3c;/重新赋初值,定时50ms TL0=0xb0;num+;/每进入一次定时器中断num加1(每50ms加1一次) if(num<5) s=1;if(w=1)beer=1;led=1;elsebeer=1;led=1;Else /进入4次中断,定时200ms时若报警标志位w为1则启动报警,不为1不启动/实现间歇性报警功能s=0;if(w=1)beer=0;led=0;elsebeer=1;led=1;if(num>20)/进入20次中断,定时1s num=0;/num归0,重新定开始定时1s s1=0;/定时1s时间到时自动关闭报警上下限显示功能 v1=1;/定时1s时间到时自动关闭报警上下限查看功能 /*调整报警上下限显示选择函数*/void selsct_1(uchar f,uchar k) /消除百位的0显示,及正负温度的显示选择 if(f=0)/若为正温度,百位为0则不显示百位,不为0则显示 if(k/100=0) P0=temperature30; else P0=temperature1k/100; if(f=1)/若为负温度,若十位为0,百位不显示,否则百位显示- if(k%100/10=0) P0=temperature30; else P0=temperature32; void selsct_2(bit f,uchar k)/消除十位的0显示,及正负温度的显示选择 if(f=0) /若为正温度,百位十位均为0则不显示十位,否则显示十位 if(k/100=0)&&(k%100/10=0) P0=temperature30; else P0=temperature1k%100/10; if(f=1)/若为负温度,若十位为0,十位不显示,否则十位显示- if(k%100/10=0) P0=temperature32; else P0=temperature1k%100/10; /*主显示函数*/void display(uchar t,uchar t_d) /用于实测温度、上限温度的显示 uchar i; for(i=0;i<4;i+) /依次从左至右选通数码管显示,实现动态显示 switch(i) case 0: /选通第一个数码管 if(a=0)selsct_1(f,t); /若a=0则在第一个数码管上显示测量温度的百位或- if(a=1)

    注意事项

    本文(51单片机设计数字温度计(流程图+源码+实物图片)要点(共19页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开