📄 main.c
字号:
//--------------------------------------------------
//
// 作者:闵运华
// qq:121758163
// Email:minyunhua163@163.com
//--------------------------------------------------
#define Support_18b20
#define Support_i2c
#define Support_led
#include <reg51.h>
#ifdef Support_led
#include <led.h>
#endif
#ifdef Support_18b20
#include <18b20.h>
#endif
#ifdef Support_i2c
#include <i2c.h>
#endif
sbit 第一个八 = P2^4;
sbit 第二个八 = P2^5;
sbit 第三个八 = P2^6;
sbit 第四个八 = P2^7;
sbit 第一个灯脚位 = P1^0;
sbit 第二个灯脚位 = P1^1;
sbit 第三个灯脚位 = P1^2;
sbit 第四个灯脚位 = P1^3;
sbit 第五个灯脚位 = P1^4;
sbit 开门脚 = P3^0;
sbit 关门脚 = P3^1;
unsigned char 点亮当前八;
unsigned int 二百微秒重复次数;
bit 门的状态; //为1表示门己关着了
#define 门开着 0
#define 门关着 1
//遥控区
struct 遥控nec{
unsigned char 二百微秒出现的次数;
unsigned char 二点五毫秒出现的次数;
unsigned char 遥控状态;
unsigned int 系统码;
unsigned int 客户码;
unsigned char 码值位数计数;
unsigned char 遥控键长按重复次数;
};
struct 遥控nec 遥控;
#define 接收头码 (遥控.遥控状态 & 0x01)
#define 清除接收头码 遥控.遥控状态 &= 0x0fe;
#define 置接收头码 遥控.遥控状态 |= 0x01;
#define 重复接收108毫秒 (遥控.遥控状态 & 0x02)
#define 清除重复接收108毫秒 遥控.遥控状态 &= 0x0fd;
#define 置重复接收108毫秒 遥控.遥控状态 |= 0x02;
#define 接收客户码 (遥控.遥控状态&0x04)
#define 清除客户码 遥控.遥控状态 &= 0x0fb;
#define 置客户码 遥控.遥控状态 |= 0x04;
#define 遥控码接收完毕 (遥控.遥控状态 & 0x10)
#define 清除遥控码接收完毕 遥控.遥控状态 &= 0x0ef;
#define 置遥控码接收完毕 遥控.遥控状态 |= 0x10;
//函数声明
void 延时1秒(void);
void 延时10毫秒(void);
void Init_Sys();
void 延时半秒(void);
void main(void)
{
unsigned char 前一次的八 = 0;
Init_Sys();
显示数据(0x1234);
点亮当前八 = 0;
//初始化遥控结构的值
遥控.二百微秒出现的次数 = 0;
遥控.二点五毫秒出现的次数 = 0;
遥控.遥控状态 = 0;
遥控.系统码 = 0;
遥控.客户码 = 0;
遥控.码值位数计数 = 0;
遥控.遥控键长按重复次数 = 0;
当(1)
{
延时半秒();
#ifdef Support_18b20
//显示温度
如果(遥控.遥控状态 == 0 )
{
显示温度(读取温度());
}
#endif
}
}
//延时子程序
void 延时1秒(void)
{
二百微秒重复次数 = 0;
while(二百微秒重复次数 < 5000);
}
//延时子程序
void 延时半秒(void)
{
二百微秒重复次数 = 0;
while(二百微秒重复次数 < 2500);
}
//延时子程序
void 延时10毫秒(void)
{
二百微秒重复次数 = 0;
while(二百微秒重复次数 < 50);
}
void Init_Sys()
{
TH0 = (0xffff - 2500)/256;//定时中断为2.5ms
TL0 = (0xffff - 2500)%256;
TMOD = 0x01;// t0为十六位计数器
TR0 = 1; //允许时间零中断
ET0 = 1;
TH1 = 55;
TL1 = 55;
TMOD |= 0x20;//时间计数器1的工作模式为八位自动重装
TR1 = 1; //允许时间零中断
ET1 = 1;
IE0 = 1; //开外部中断零
EX0 = 1;
IT0 = 1;// INT0低电平触发(为1则为下降沿触发
EA = 1; //开总中断
}
//外部中断零
void ex0_int(void) interrupt 0
{
//EA = 0; //
遥控.二点五毫秒出现的次数 = 0;
如果(接收头码)
{
if(遥控.二百微秒出现的次数 <= (9000 + 4500 + 1000)/200 && 遥控.二百微秒出现的次数 >= (9000 - 1000 )/200)
{
清除接收头码;
置客户码;
}
}
否则如果(接收客户码)
{
if(遥控.二百微秒出现的次数 <= (2250 + 400)/200 && 遥控.二百微秒出现的次数 >= (1125 - 400)/200)
{
if(遥控.码值位数计数 > 15)
遥控.客户码 >>= 1;
else
遥控.系统码 >>= 1;
if(遥控.二百微秒出现的次数 >= (2250 + 1125)/200/2)
{
if(遥控.码值位数计数 > 15)
遥控.客户码 |= 0x8000;
else
遥控.系统码 |= 0x8000;
}
遥控.码值位数计数++;
if(遥控.码值位数计数 == 32)
{
置重复接收108毫秒;
清除客户码;
遥控.遥控键长按重复次数 = 0;
显示数据(((遥控.系统码 & 0xff)<< 8) | (遥控.客户码 &0xff));
遥控.码值位数计数 = 0;
置遥控码接收完毕;
}
}
else
{
遥控.遥控状态 = 0;
置接收头码;
遥控.码值位数计数 = 0;
}
}
否则如果(重复接收108毫秒)
{
if(遥控.二百微秒出现的次数 >= (9000 + 2250 - 1000)/200)
{
遥控.遥控键长按重复次数++;
显示数据(((遥控.系统码 & 0xff)<< 8) | (遥控.客户码 &0xff));
if(遥控.遥控键长按重复次数 > 10)
{
遥控.遥控键长按重复次数 = 0;
}
清除遥控码接收完毕;
}
else
{
遥控.遥控状态 = 0;
置接收头码;
遥控.码值位数计数 = 0;
}
}
否则
{
置接收头码;
}
遥控.二百微秒出现的次数 = 0;
//EA = 1; //开总中断
}
//每2.5毫秒中断一次
void time0(void) interrupt 1
{
//EA = 0; //
TH0 = (0xffff - 2500)/256;//定时中断为2.5ms
TL0 = (0xffff - 2500)%256;
点亮当前八++;
#if 1
第一个八 = 低;
第二个八 = 低;
第三个八 = 低;
第四个八 = 低;
P0=显示区[点亮当前八-1];
switch(点亮当前八)
{
case 1:
第一个八 = 高;
break;
case 2:
第二个八 = 高;
break;
case 3:
第三个八 = 高;
break;
case 4:
第四个八 = 高;
点亮当前八 = 0;
break;
default:
break;
}
#endif
遥控.二点五毫秒出现的次数++;
//如果过了一百一十毫秒证明没有遥控信号
if(遥控.二点五毫秒出现的次数 > 50)
{
if(遥控.遥控状态)
遥控.遥控状态 = 0;
遥控.二点五毫秒出现的次数 = 0;
}
//EA = 1; //开总中断
}
//每200us中断一次
void time1(void) interrupt 3
{
//EA = 0; //
遥控.二百微秒出现的次数 ++;
二百微秒重复次数++;
//EA = 1; //开总中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -