原来的8个7端显示的<br />我想改成四个的就够的<br /><br />而且他是小数点后两位的<br />我要一位就可以的<br /><br />这个在温度是负数的时候好像有点问题的<br /><br />帮帮看下啦<br /><br /> #include <AT89X52.H> <br />#include <INTRINS.H> <br /> <br />unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7, <br /> 0xef,0xdf,0xbf,0x7f}; <br />unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f, <br /> 0x66,0x6d,0x7d,0x07, <br /> 0x7f,0x6f,0x77,0x7c, <br /> 0x39,0x5e,0x79,0x71,0x00}; <br /> <br />unsigned char code dotcode[32]={0,3,6,9,12,16,19,22, <br /> 25,28,31,34,38,41,44,48, <br /> 50,53,56,59,63,66,69,72, <br /> 75,78,81,84,88,91,94,97}; <br /> <br /> <br />sbit SDA=P1^6; <br />sbit SCL=P1^7; <br /> <br />unsigned char displaybuffer[8]={0,1,2,3,4,5,6,7}; <br />unsigned char eepromdata[8]; <br />unsigned char temperdata[2]; <br /> <br />unsigned char timecount; <br />unsigned char displaycount; <br /> <br />bit secondflag=0; <br />unsigned char secondcount=0; <br />unsigned char retn; <br />unsigned int result; <br />unsigned char x; <br />unsigned int k; <br />unsigned int ks; <br /> <br /> <br /> <br />void delay(void); <br />void delay10ms(void); <br />void i_start(void); <br />void i_stop(void); <br />void i_init(void); <br />void i_ack(void); <br />bit i_clock(void); <br />bit i_send(unsigned char i_data); <br />unsigned char i_receive(void); <br /> <br />bit start_temperature_T(void); <br />bit read_temperature_T(unsigned char *p); <br /> <br />void delay(void) <br />{ <br /> _nop_(); <br /> _nop_(); <br /> _nop_(); <br /> _nop_(); <br /> _nop_(); <br /> _nop_(); <br />} <br /> <br />void delay10ms(void) <br />{ <br /> unsigned int i; <br /> for(i=0;i<1000;i++) <br /> { <br /> delay(); <br /> } <br /> <br />} <br /> <br />void i_start(void) <br />{ <br /> SCL=1; <br /> delay(); <br /> SDA=0; <br /> delay(); <br /> SCL=0; <br /> delay(); <br />} <br /> <br />void i_stop(void) <br />{ <br /> SDA=0; <br /> delay(); <br /> SCL=1; <br /> delay(); <br /> SDA=1; <br /> delay(); <br /> SCL=0; <br /> delay(); <br />} <br /> <br />void i_init(void) <br />{ <br /> SCL=0; <br /> i_stop(); <br />} <br /> <br />void i_ack(void) <br />{ <br /> SDA=0; <br /> i_clock(); <br /> SDA=1; <br />} <br /> <br />bit i_clock(void) <br />{ <br /> bit sample; <br /> <br /> SCL=1; <br /> delay(); <br /> sample=SDA; <br /> _nop_(); <br /> _nop_(); <br /> SCL=0; <br /> delay(); <br /> return(sample); <br />} <br /> <br /> <br />bit i_send(unsigned char i_data) <br />{ <br /> unsigned char i; <br /> <br /> for(i=0;i<8;i++) <br /> { <br /> SDA=(bit)(i_data & 0x80); <br /> i_data=i_data<<1; <br /> i_clock(); <br /> } <br /> SDA=1; <br /> return(~i_clock()); <br />} <br /> <br />unsigned char i_receive(void) <br />{ <br /> unsigned char i_data=0; <br /> unsigned char i; <br /> <br /> for(i=0;i<8;i++) <br /> { <br /> i_data*=2; <br /> if(i_clock()) i_data++; <br /> } <br /> return(i_data); <br />} <br /> <br />bit start_temperature_T(void) <br />{ <br /> i_start(); <br /> if(i_send(0x90)) <br /> { <br /> if(i_send(0xee)) <br /> { <br /> i_stop(); <br /> delay(); <br /> return(1); <br /> } <br /> else <br /> { <br /> i_stop(); <br /> delay(); <br /> return(0); <br /> } <br /> } <br /> else <br /> { <br /> i_stop(); <br /> delay(); <br /> return(0); <br /> } <br />} <br /> <br />bit read_temperature_T(unsigned char *p) <br />{ <br /> i_start(); <br /> if(i_send(0x90)) <br /> { <br /> if(i_send(0xaa)) <br /> { <br /> i_start(); <br /> if(i_send(0x91)) <br /> { <br /> *(p+1)=i_receive(); <br /> i_ack(); <br /> *p=i_receive(); <br /> i_stop(); <br /> delay(); <br /> return(1); <br /> } <br /> else <br /> { <br /> i_stop(); <br /> delay(); <br /> return(0); <br /> } <br /> } <br /> else <br /> { <br /> i_stop(); <br /> delay(); <br /> return(0); <br /> } <br /> } <br /> else <br /> { <br /> i_stop(); <br /> delay(); <br /> return(0); <br /> } <br />} <br /> <br /> <br />void main(void) <br />{ <br /> P1=0xff; <br /> timecount=0; <br /> displaycount=0; <br /> <br /> TMOD=0x21; <br /> TH1=0x06; <br /> TL1=0x06; <br /> TR1=1; <br /> ET1=1; <br /> ET0=1; <br /> EA=1; <br /> <br /> <br /> if(start_temperature_T()) //向DS1624发送启动A/D温度转换命令,成功则启动T0定时1s。 <br /> { <br /> secondflag=0; <br /> secondcount=0; <br /> TH0=55536/256; <br /> TL0=55536%256; <br /> TR0=1; <br /> } <br /> <br /> while(1) <br /> { <br /> if(secondflag==1) <br /> { <br /> secondflag=0; <br /> TR0=0; <br /> if(read_temperature_T(temperdata)) //T0定时1s时间到,读取DS1624的温度值 <br /> { <br /> for(x=0;x<8;x++) <br /> { <br /> displaybuffer[x]=16; <br /> } <br /> x=2; <br /> result=temperdata[1]; //将读取的温度值进行数据处理,并送到显示缓冲区 <br /> while(result/10) <br /> { <br /> displaybuffer[x]=result%10; <br /> result=result/10; <br /> x++; <br /> } <br /> displaybuffer[x]=result; <br /> result=temperdata[0]; <br /> result=result>>3; <br /> displaybuffer[0]=(dotcode[result])%10; <br /> displaybuffer[1]=(dotcode[result])/10; <br /> if(start_temperature_T()) //温度值数据处理完毕,重新启动DS1624开始温度转换 <br /> { <br /> secondflag=0; <br /> secondcount=0; <br /> TH0=55536/256; <br /> TL0=55536%256; <br /> TR0=1; <br /> } <br /> } <br /> } <br /> } <br />} <br /> <br /> <br />void t0(void) interrupt 1 using 0 //T0用于定时1s时间到 <br />{ <br /> secondcount++; <br /> if(secondcount==100) <br /> { <br /> secondcount=0; <br /> secondflag=1; <br /> } <br /> TH0=55536/256; <br /> TL0=55536%256; <br />} <br /> <br /> <br />void t1(void) interrupt 3 using 0 //T1定时1ms用数码管的动态刷新 <br />{ <br /> timecount++; <br /> if(timecount==4) //T1定时1ms到 <br /> { <br /> timecount=0; <br /> P2=0xff;<br /> if (displaycount==5) <br /> { <br /> P0=(displaycode[displaybuffer][7-displaycount]] | 0x80); //在该位同时还要显示小数点 <br /> } <br /> else <br /> { <br /> P0=displaycode[displaybuffer][7-displaycount]]; <br /> } <br /> P2=displaybit[displaycount]; <br /> displaycount++; <br /> if(displaycount==8) <br /> { <br /> displaycount=0; <br /> } <br /> } <br />} <br /> |
|