#include<reg51.h> #include<intrins.h> /********* *接口定义 *********/ sbit H_CS=P1^0 ; sbit H_CLK=P1^1 ; sbit H_DATA=P1^2 ; sbit H_KEY=P1^3 ; sbit DQ=P1^6; /********* *HD7279各指令定义 *********/ #define REST 0xa4 //复位 #define TEST 0xbf //测试 #define RLC 0xa3 //循环左移 #define RRC 0xa2 //循环右移 #define RL 0xa1 //左移 #define RR 0xa0 //右移 #define DECODE0 0x80 //译码方式0 #define DECODE1 0xc8 //译码方式1 #define UNDECODE 0x90 //译码方式2,不译码 #define HIDE 0x98 //消隐 #define FLASH 0x88 //闪烁 #define SEGON 0xe0 //段亮 #define SEGOFF 0xc0 //段灭 #define READ 0x15 //读键盘 /************* *函数声明 *************/ void Sdelay(void); //短延时 void Ldelay(void); //长延时 void delay10ms(unsigned t); //延时10MS void sent_btye(unsigned char out_B); //发送一个字节 receive_btye(); //接收一个字节 void write(unsigned char comd,unsigned char dat); //发送一个命令 read(); //读键盘 delay15us(unsigned char n); char init18b20(void); void write18b20(unsigned ch); unsigned int read18b20(); void extemp(void); unsigned char readtemp(); void bm(void); /********* *子函数 *********/ void Sdelay(void) //短延时 { _nop_();_nop_();_nop_();_nop_();_nop_(); } void Ldelay(void) //长延时 {unsigned int i; for(i=0;i<10;i++) {Sdelay();} } void delay10ms(unsigned t) //延时10*t ms程序 {unsigned int i,j; for(i=0;i<t;i++) {for(j=0;j<0x390;j++) {_nop_();} } } void sent_byte(unsigned char out_B) //在7279中写入一个字节 {unsigned char i; H_CS=0; Ldelay(); for(i=0;i<8;i++) {if(out_B&0x80){H_DATA=1;} else{H_DATA=0;} H_CLK=1; Sdelay(); H_CLK=0; Sdelay(); out_B=out_B<<1; } H_DATA=0; } receive_byte() //接收一个来自7279的字节 {unsigned char i,in_B; H_DATA=1; Ldelay(); for(i=0;i<8;i++) {H_CLK=1; Sdelay(); in_B=in_B<<1; if(H_DATA) {in_B=in_B|0x01; H_CLK=0; Sdelay(); } H_CLK=0; return(in_B); } } void write(unsigned char comd,unsigned char dat) //在7279中写入指令 {sent_byte(comd); sent_byte(dat); } read() {unsigned char key; if(!H_KEY) {sent_byte(READ); key=receive_byte(); delay10ms(1); if(!H_KEY){return(key);} key=0xff; return(key); } } /************** *定义变量 **************/ unsigned char data dat[4]={0x00,0x00,0x00,0x00}; unsigned char i,j,k,count,temp; /************ 18b20程序 ************/
char init18b20(void) {unsigned char x=0; DQ=1; _nop_(); DQ=0; delay15us(36); //延时480us DQ=1; delay15us(4);; //延时60us x=DQ; DQ=1; delay15us(18); //延时270us } /******** 写数据18B20读写数据都从低位开始,而7279读写数据都是从高位开始 ******/ void write18b20(unsigned char ch) {unsigned char i; for(i=0;i<8;i++) {DQ=0; delay15us(1); //首先将DQ拉低,并延时15us DQ=ch&0x01; //从低8位开始写入 ch=ch>>1; //数据右移一位 delay15us(4); //写入数据后并延时45us以上 DQ=1; } } /**************** 读数据 ***********/ unsigned int read18b20() {unsigned char i; unsigned char ch=0; for(i=0;i<8;i++) {DQ=0; ch=ch>>1; DQ=1; delay15us(1); if(DQ==0) {ch=ch&0x7f; } else {ch=ch|0x80; } delay15us(3); //DQ=1; } return(ch); } /******* 15us标准延时程序 *******/ delay15us(unsigned char n) { _nop_(); for(;n>1;n--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();} }
/****** *读温度函数 *必须用extemp()函数启动温度转换后750ms才能取得到温度 *******/ unsigned char readtemp() {unsigned char t,x,y; init18b20(); write18b20(0xCC); //跳过skip rom write18b20(0x44); //启动温度转换 init18b20(); write18b20(0xCC); //跳过多路传感器识别 skip rom write18b20(0xBE); //读暂存器, x=read18b20(); //返回读出温度值 16位补码形式 y=read18b20(); x=x>>4; y=y<<4; t=x|y; return t; } /************************************* *** 显示温度函数 *************************************/ showtemp() { unsigned char t,x,y,z; t=readtemp(); if(t>0) {x=t/10; t=t%10; y=t/1; z=t%1; write(DECODE0,0x00); write(DECODE0+1,x); write(DECODE0+2,0x80+y); write(DECODE0+3,z); } else {t=~t; t=t+1; x=t/10; t=t%10; y=t/1; z=t%1; write(DECODE0,0x0a); write(DECODE0+1,x); write(DECODE0+2,0x80+y); write(DECODE0+3,z); } } main() { unsigned char t,x,y,z; sent_byte(TEST); Sdelay(); sent_byte(REST); Ldelay(); while(1){ showtemp(); } } |