今天总算把温控和红外搞定了 , 纠结了 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();
}
}