📄 bianma.txt
字号:
}
break;
case 20:sbuf2=sbuf1>>4; //把高半字节右移到的半字节
sbuf2=~sbuf2; //将低半字节取反
if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确
{ //接受错误
state1=0; // 将接收状态标志置为零,重新接收
buf1=RECEIVE; //初始化接收的地址
*buf1=NACK; //把NACK信号存入发送缓冲里
buf1_flag=1; //置标志位为1,使主程序能对接收错误进行处理
REN=0; //禁止接收
}
else
{
sbuf1&=0x0f; //仅保留低半字节,去掉高半字节
rsbuf1|=sbuf1; //高低半字节合并
*buf1++=rsbuf1; //将接收的数据保存至接收缓冲里,并且数据指针加一
buf1_length++; //接收数据长度加一
state1=10; //将state1置为10,准备接收下个字节的高半字节
}
break;
}
}
}
else{
TI=0; //清除发送中断标志
if(buf2_length) //判断发送长度是否为零
{ //发送长度不为零
if(state2==0) //判断是否发送高半字节
{ //发送高半字节
sbuf2=*buf2; //将要发送的字节送到sbuf2
rsbuf2=~sbuf2; //取反,使高半字节变为反码
sbuf2>>=4; //将高半字节右移到低半字节
rsbuf2&=0xf0; //保留高半字节,去掉低半字节
sbuf2&=0x0f; //保留低半字节,去掉高半字节
rsbuf2|=sbuf2; //合并高低半字节
SBUF=rsbuf2; //发送出去
state2=10; //将state2置为10准备发送下半字节
}
else
{ //发送低半字节
sbuf2=*buf2; //将要发送的字节送到sbuf2
buf2++; //指针加一
buf2_length--; //发送数据长度减一
rsbuf2=~sbuf2; //取反,使低半字节变为反码
rsbuf2<<=4; //将低半字节反码左移到高半字节
rsbuf2&=0xf0; //保留高半字节,去掉低半字节
sbuf2&=0x0f; //保留低半字节,去掉高半字节
rsbuf2|=sbuf2; //合并高低半字节
SBUF=rsbuf2; //发送出
state2=0;
}
}
else
{ //如果发送数据长度为零则发送数据帧尾
if(buf2_flag){ //判断是否发过数据帧尾
SBUF=TAIL; //将数据帧尾发送出去
while(TI==0);
TI=0;
buf2_flag=0; //置发送标志为零,表示发送完毕
}
}
}
EA=1; //开放中断
}
HT6221标准红外C语言解码程序
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//★HT6221标准红外C语言解码程序 ★
//★CPU AT89S51 晶振12MHz 接口 P.7 ★
//★ht6221 资料: ★
★
//★日期2006-06-14
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
#include<reg51.h>
#define UINT8 unsigned char
#define UINT16 unsigned int
#define UINT32 unsigned long
UINT8 IRCommandData;
UINT8 da[4]={0,0,0,0};
UINT8 table[18]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa7,0x26,0xa1,0xb1,0x34,0xab};
sbit IR=P3^7;
//============主程序====================================================
void delay(UINT16 cnt)
{
while(--cnt);
}
void d870us(void)
{
delay(108);//12M
}
void d1000us(void)
{
delay(125);//12M
}
void d4740us(void)
{
delay(593);//12M
}
//----------------------------------------------------
//-----------------------------------------------
// ht6221解码程序
//-----------------------------------------------
UINT8 IRDecode(void)
{
UINT8 i,m,n;
for(i=0;i<10;i++)
{
d870us();
if(IR) goto exit;
}
while(!IR);
d4740us();
//开始解码
for(m=0;m<4;m++){
for(n=0;n<8;n++){
while(!IR);
d870us();
if(IR)
{
d1000us();
da[m]=da[m]>>1;
da[m]=da[m]|0x80;
}
else
{
da[m]=da[m]>>1;
da[m]=da[m]|0;
}
//while(IR);
//while(!IR);
}
}
if((da[0]==0x0)&&(da[1]==0xFF))
{
if(da[2]==(~da[3]))
return da[2];
}
exit:
return 0;
}
void SendData(UINT8 c)
{
P0=c;
}
void main(void)
{
P2=0xFD;//选通一位数码管
P0=0xff;
while(1)
{
if(!IR)
{
IRCommandData=IRDecode();
switch(IRCommandData)
{
case 0x10:SendData(table[1]);break;
case 0x03:SendData(table[2]);break;
case 0x01:SendData(table[3]);break;
case 0x06:SendData(table[4]);break;
case 0x09:SendData(table[5]);break;
case 0x1d:SendData(table[6]);break;
case 0x1f:SendData(table[7]);break;
case 0x0d:SendData(table[8]);break;
case 0x19:SendData(table[9]);break;
default:break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -