资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
基于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
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号