欢喜的温控和红外 外带 悲剧的串口

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值