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