




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于PIC单片机的实时温度控制系统/ 实现的功能:数码管显示实时温度,支持负温度/ 芯片PIC16F877/ XT:4MHZ/*#include /包含单片机内部资源预定义#define LVP 0x3f39/ 晶振:XT;代码:没有代码保护;上电延时定时器关闭;/ 低电压复位禁止;看门狗关闭 ;低电压编程禁止_CONFIG (XT & UNPROTECT & PWRTDIS & BORDIS & WDTDIS & LVP);#define uch unsigned char /给unsigned char起别名 uch#define DQ RA2 /定义18B20数据端口 #define DQ_DIR TRISA2 /定义18B20D口方向寄存器 #define DQ_HIGH() DQ_DIR =1 /设置数据口为输入#define DQ_LOW() DQ_DIR = 0;DQ = 0 /设置数据口为输出const unsigned char ledcode12=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40;/不带小数点的共阴极数码管0123456789段码,正负符号位const unsigned char ledcode112=0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00,0x40; /带小数点的共阴极数码管0123456789段码 ,正负符号位void init_port(void);void delay(char x,char y); void delay_1ms(void);void delay_ms(unsigned int time);void interrupt dealtime();void tmint(void);void timetoseg(uch fh_temp,uch bai_temp,uch shi_temp,uch ge_temp,uch sf_temp,uch bf_temp,uch qf_temp,uch wf_temp);void binary_temp(uch TL , signed char TH);void reset(void);void write_byte(uch val);uch read_byte(void);void get_temp(void);unsigned char display_data8;unsigned char intcount=0; uch TLV=0 ; /采集到的温度高8位uch THV=0; /采集到的温度低8位union temp /定义一个联合体int T; uch TV2; temp;signed char TZ=0; /转换后的温度值整数部分,有符号位uch TX=0; /转换后的温度值小数部分unsigned int wd; /转换后的温度值BCD码形式unsigned char fh; /符号位unsigned char bai; /整数百位unsigned char shi; /整数十位unsigned char ge; /整数个位unsigned char shifen; /十分位unsigned char baifen; /百分位unsigned char qianfen; /千分位unsigned char wanfen; /万分位/*/ 主程序/*void main(void)init_port();tmint();while(1) get_temp(); timetoseg(fh,bai,shi,ge,shifen,baifen,qianfen,wanfen); /*/ 端口初始化/ PORTD作为数码管段驱动(高有效)/ PORTE作为数码管位选择驱动(低有效)/*void init_port(void)RBPU=0;/ PORTB=0xFF;TRISB=0xFF; PORTD=0x00; /TRISC=0x00; /C口控制LED指示灯,设置成输出TRISD=0; /D口当作数码管段,设置成输出ADCON1=0x07; /使A口,E口全为数字I/O口TRISE=0x00; /E口当作数码管位选择控制脚,设置成输出 PORTE=0x00; /*/ 延时程序/*void delay(char x,char y) char z;do z=y; do;while(-z); while(-x);/其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。/则是:14+(3*(Y-1)+7)*(X-1)。/*/ 延迟程序/*void delay_1ms(void)unsigned int n;for(n=0;n0;time-) delay_1ms(); /-/复位DS18B20函数void reset(void)uch presence=1;while(presence) DQ_LOW() ; /主机拉至低电平 delay(2,90); /延时480503us DQ_HIGH(); /释放总线等电阻拉高总线,并保持1560us delay(2,8); /延时60us if(DQ=1) presence=1; /没有接收到应答信号,继续复位 else presence=0; /接收到应答信号 delay(2,70); /延时240us /-/写18b20写字节函数void write_byte(uch val)uch i;uch temp;for(i=8;i0;i-) temp=val&0x01; /最低位移出 DQ_LOW(); NOP(); NOP(); NOP(); NOP(); NOP(); /从高拉至低电平,产生写时间隙 if(temp=1) DQ_HIGH(); /如果写1,拉高电平 delay(2,7); /延时63us DQ_HIGH(); NOP(); NOP(); val=val1; /右移一位/-/18b20读字节函数uch read_byte(void)uch i;uch value=0; /读出温度static bit j;for(i=8;i0;i-) value=1; DQ_LOW(); /每次读时隙由主机发起,拉低总线至少1s。 NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); /6us DQ_HIGH(); /读时隙开始后的15s内释放总线,拉至高电平,准备采样总线。 NOP(); NOP(); NOP(); NOP(); NOP(); /5us j=DQ; /采样总线 if(j) value|=0x80; /把采样到的数据放入value delay(2,7); /所有读时隙至少60s,这里大约63usreturn(value);/-/启动温度转换函数void get_temp() int i;DQ_HIGH();reset(); /复位等待从机应答 write_byte(0XCC); /忽略ROM匹配 write_byte(0X44); /发送温度转化命令 for(i=10;i0;i-) delay(201,132); reset(); /再次复位,等待从机应答 write_byte(0XCC); /忽略ROM匹配 write_byte(0XBE); /发送读温度命令TLV=read_byte(); /读出温度低8位 THV=read_byte(); /读出温度高8位DQ_HIGH(); /释放总线 TZ=(TLV4)|(THV4); /温度整数部分TX=TLV=0) /如果是正温度 fh=0x0A; /正数符号位 bai=TH/100; /整数部分百位 shi=(TH%100)/10;/十位 /整数十位 ge=(TH%100)%10;/个位 /整数部分个位 wd=0; if (TL & 0x80) wd=wd+5000; if (TL & 0x40) wd=wd+2500; if (TL & 0x20) wd=wd+1250; if (TL & 0x10) wd=wd+625; /以上4条指令把小数部分转换为BCD码形式 shifen=wd/1000; /十分位 baifen=(wd%1000)/100; /百分位 qianfen=(wd%100)/10; /千分位 wanfen=wd%10; /万分位 NOP(); else /否则,是负温度,要求补码temp.TV0=TL;temp.TV1=TH ;temp.T=(temp.T)+0x0010; /补码形式,起反加1 TL=temp.TV0;TH=temp.TV1; fh=0x0B; /负数符号位 bai=TH/100; /整数部分百位 shi=(TH%100)/10;/十位 /整数十位 ge=(TH%100)%10;/个位 /整数部分个位 wd=0; if (TL & 0x80) wd=wd+5000; if (TL & 0x40) wd=wd+2500; if (TL & 0x20) wd=wd+1250; if (TL & 0x10) wd=wd+625; /以上4条指令把小数部分转换为BCD码形式 shifen=wd/1000; /十分位 baifen=(wd%1000)/100; /百分位 qianfen=(wd%100)/10; /千分位 wanfen=wd%10; /万分位 NOP();/ 温度值各位转换成段码/*void timetoseg(uch fh_temp,uch bai_temp,uch shi_temp,uch ge_temp,uch sf_temp,uch bf_temp,uch qf_temp,uch wf_temp) display_data0 = ledcodewf_temp; display_data1 = ledcodeqf_temp; display_data2 = ledcodebf_temp; display_data3 = ledcodesf_temp; display_data4 = ledcode1ge_temp; display_data5 = ledcodeshi_temp; display_data6 = ledcodebai_temp; display_data7 = ledcodefh_temp;/*/ 定时中断初始化(OPTION_REG)/*void tmint(void)T0CS=0; /时钟源为内部指令周期 PSA=0; /分频器分配给TMR0 / PS2=0; /TMR0的分频比为1:16 PS1=1;PS0=1;/GIE=1; /允许总中断 T0IE=1; /允许定时器0溢出中断T0IF=0; /清楚定时器0中断标志TMR0=0X06; /预置初值 T=(256-6)x16=4000uS/*void interrupt dealtime() /中断入口,该中断完成数码管的动态扫描 /每中断一次的时间为4毫秒 T0IF=0; TMR0=0X06; PORTD = 0x00; /先关闭显示 if(intcount=0) PORTD = display_data0; PORTE=0x00; intcount+=1; else if(intcount=1) PORTD = display_data1; PORTE=0x01; intcount+=1; else if(intcount=2) PORTD = display_data2; PORTE=0x02; intcount+=1; else if(intcount=3) PORTD = display_data3; PORTE=0x03; intcount+=1; else if(intcount=4) PORTD = display_data4; PORTE=0x04; intcount+=1; else if(intcount=5) PORTD = display_data5; PORTE=0x05; intcount+=1; else if(intcount=6) PORTD = display_data6; PORTE=0x06; intcount+=1; else if(intcount=7) PORTD = display_data7; PORTE=0x07; intcount = 0; 仿真图:袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课件上传后不显示问题分析
- 教学比赛课件注意事项
- 2025年粪污管理岗位面试解析及模拟题
- 2025年航空安全知识测试及答案
- 2025年航空安全员实操考核指南
- 2025年康复社工招聘笔试考试大纲
- 说明文拓展探究题课件
- 2025年吊塔维护安全操作模拟题
- 2025年政府会计准则实施能力考试模拟题及答案模拟练习模拟题库
- 2025年统计员招聘笔试红白理事会重点
- 04S520埋地塑料排水管道施工标准图集
- 变电站工程施工三措
- 2023年苏教版小学四年级上册综合实践活动教案全册
- 2024风电场在役叶片维修全过程质量控制技术要求
- 2024年首届全国“红旗杯”班组长大赛考试题库1400题(含答案)
- 湖南省建筑工程定额
- 分布式光伏经济评价规范
- 电梯基础知识课件
- 教导式面谈总公课件
- 广东省地质灾害危险性评估实施细则(2023年修订版)
- 学前儿童家庭教育(高职)全套教学课件
评论
0/150
提交评论