?? hongwai_fashe.c
字號:
//以下為試驗簡單但可行的的程序,發射數據,鍵盤對應的按鍵為b鍵,用于控制萬年歷鬧鈴的開關,簡化了協議
//發射部分:接入兩個外部中斷,2個按鍵分別對應兩個按鍵碼被發射出去
#include <reg52.h>
#define uchar unsigned char
sbit NA=P3^6; //控制紅外發射管的亮滅,高電平時發射信號
int count; //延時計數器
int endcount; //終止延時計數
uchar flag; //紅外發送標志
uchar hongwai_fashe_enable=0;
uchar k=0x06;
void Senddata(uchar p_data); //發送函數
void delay(); //延時程序,1秒
void zhongduan1(void) interrupt 0
{
k=0x38;
hongwai_fashe_enable=1;
}
void zhongduan2(void) interrupt 2
{
k=0x64;
hongwai_fashe_enable=1;
}
void main(void)
{
count = 0;
flag = 0;
endcount=0;
NA=0; //
EA = 1; //允許CPU中斷
EX0=1;
EX1=1;
IT0=1;
IT1=1;
TMOD = 0x11; //設定時器0和1為16位模式1
ET0 = 1; //定時器0中斷允許
TH0 = 0xff;
TL0 = 0xe6; //設定時值0的裝入值,輸出脈沖頻率為38K,即26us中斷一次
TR0 = 1; //開始計數
delay();
for(;;)
{
if( hongwai_fashe_enable==1)
{
Senddata(k); //開始發送數據
hongwai_fashe_enable=0;
}
}
}
void timeint(void) interrupt 1 //定時器0中斷處理
{
TH0=0xff;
TL0=0xe6; //26us中斷一次,再重裝數據
count++;
if (flag==1) //如果允許發送
{
NA=~NA; //開始紅外發射管發射載波信號(不停的反相),接收時認做低電平
}
else
{
NA = 0; //沒有發射載波信號
}
}
void Senddata(uchar p_data) //發送函數
{
int i;
uchar getdata; //操作的數據
//發送9ms的起始碼(發射載波),9000us,為26us的346倍
endcount=346;
flag=1; //允許發送載波
count=0;
do{}while(count<endcount);
//發送4.5ms的結果碼(紅外管不發光,接收時認做高電平)
flag=0;
endcount=173; //紅外管發射信號
count=0;
do{}while(count<endcount);
//發送八位數據
getdata=p_data;
for(i=0;i<8;i++)
{
if(getdata-(getdata/2)*2) //取出每一位的信息
{
endcount=65;
}
else
{
endcount=21;
}
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
endcount=22; //發出高電平
count=0;
do{}while(count<endcount);
getdata=getdata>>1;
}
flag=0;
NA=0;
}
void delay() //延時程序,大約 1s
{
int i,j;
for(i=0;i<1000;i++)
{
for(j=0;j<125;j++){;}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -