今天总算把温控和红外搞定了 , 纠结了 2天 今天发现居然是程序问题!!! 汗颜~~~
温控说来说去还是写0 写1 时间片要弄会 虽然现在还有些模糊 还有就是检测完一个数据后的移位,今天才发现 读温度函数 和写温度函数的位移竟然全反了。。。
红外 关键还是逻辑思路要清晰 先接受编码 然后收集编码 再解码 最后读码。至于显示 还是蛮简单的。重要的还是在收集编码和检验是否有编码的程序编写。这是最容易出错的地方了。
虽然心里的一块石头落了下来 但又来了块更大的 “串口!!!!!!!!!!!” 你到底是哪里出问题了 给点提示行不。 对串口无语了。。。
温控程序:
#include <reg52.h> //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制 //此表为8个数码管位选控制, 共阴数码管 1-8个 - unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制 #define uchar unsigned char #define uint unsigned int sbit DQ=P3^7; unsigned char temp; void delay(unsigned int t) { while(t--); } void delay1(unsigned int i) { char j; for(i;i>0;i--) for(j=19;j>0;j--); } /***********初始化函数***************/ void init() { unsigned char n; DQ=1; delay(8); DQ=0; delay(80); DQ=1; delay(8); n=DQ; delay(4); } /**********写时序函数**************/ void write_byte(unsigned char dat) { unsigned char j; for(j=0;j<8;j++) { DQ=0; DQ=dat&0x01; delay(4); DQ=1; dat>>=1; } delay(4); } /*********读时序函数*****************/ uchar read_byte(void) { unsigned char i,k=0; for(i=0;i<8;i++) { DQ=0; k>>=1; DQ=1; if(DQ) k|=0x80; delay(4); } return k; } /***********读温度函数****************/ uchar readtemp(void) { uchar a,b; init(); write_byte(0xcc); write_byte(0x44); delay(300); init(); write_byte(0xcc); write_byte(0xbe); a=read_byte(); b=read_byte(); b<<=4; b+=(a&0xf0)>>4; return b; } /***************显示函数**************/ void display() { P1=0xfe; P0=Disp_Tab[temp/10]; delay1(50); P1=0xfd; P0=Disp_Tab[temp%10]; delay1(50); } /**************主函数***********************/ void main() { while(1) { display(); temp=readtemp(); } }
红外程序: #include <reg51.h> #define uchar unsigned char #define uint unsigned int //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制 //此表为8个数码管位选控制, 共阴数码管 1-8个 - unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制 uchar starflag; uchar irrtime,bitnum,ireceok,irprosok; uchar irtable[33]; uchar ircode[4]; uchar disp[8]; /********延时函数*************/ void delay(uint i) { char j; for(i;i>0;i--) for(j=6245;j>0;j--); } /*********定时器中断初始化***********/ void timer0init() { TMOD=0x02; TH0=0x00; TL0=0x00; EA=1; ET0=1; TR0=1; } /*****外部中断初始化************/ void exter0init() { EA=1; EX0=1; IT0=1; } /**********定时器中断********/ void timer0() interrupt 1 { irrtime++; } /**************外部中断**************/ void exeter0() interrupt 0 { if(starflag) { if(irrtime>53) { bitnum=0; } irtable[bitnum]=irrtime; irrtime=0; bitnum++; if(bitnum==33) { bitnum=0; ireceok=1; } } else { starflag=1; irrtime=0; } } /************解码**************/ void irpros() { uchar i,j,k,value; k=1; for(i=0;i<4;i++) { for(j=0;j<8;j++) { value=value>>1; if(irtable[k]>6) { value=value|0x80; } k++; } ircode[i]=value; } irprosok=1; } /********存码****************/ void irwork() { disp[0]=ircode[0]/16; disp[1]=ircode[0]%16; disp[2]=ircode[1]/16; disp[3]=ircode[1]%16; disp[4]=ircode[2]/16; disp[5]=ircode[2]%16; disp[6]=ircode[3]/16; disp[7]=ircode[3]%16; } /*************显示************/ void display() { uchar i; for(i=0;i<8;i++) { P0=Disp_Tab[disp[i]]; P1=dispbit[i]; delay(5); } } /***********主函数**************/ void main() { timer0init(); exter0init(); while(1) { if(ireceok==1) { irpros(); ireceok=0; } if(irprosok==1) { irwork(); irprosok=0; } display(); } }