?? 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
//遙控區
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 + -