欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機紅外通信發射程序
[打印本頁]
作者:
1232323
時間:
2017-11-9 19:42
標題:
單片機紅外通信發射程序
#include "reg52.h"
sbit ir=P1^0;//紅外發射管控制腳,使用24M晶振
sbit ka=P2^0;
sbit kb=P2^1;
unsigned int count, set_count; //中斷計數,設定中斷次數
bit irflag,keyflag; //紅外發送標志位,按鍵標志位
unsigned char irsys[]={0x00,0xff};//16位用戶碼
unsigned char irdata,ircode; //發送的紅外數據
//---------------------------------------------------------------------------
void delay(unsigned int a)//延時約1ms,晶振24M ,此處延時不需很精確
{
unsigned char i;
while(--a!=0)
for(i=300;i>0;i--); //若是12M晶振i=125
}
//---------------------------------------------------------------------------
void keyscan() // 按鍵掃描
{
if(ka==0){keyflag=1;irdata=0x0a;} //a鍵按下,則發射數據0x0a
if(kb==0){keyflag=1;irdata=0x0b;} //b鍵按下,則發射數據0x0b
}
//---------------------------------------------------------------------------
void ir_sendbyte() //紅外發送一個字節數據
{
unsigned char i;
for(i=0;i<8;i++) //發送8位數據
{
set_count=43;//35; //發送編碼中的0.56ms高電平 (//后為12M晶振下的數值)
irflag=1; //啟動紅外發射二極管發射
count=0; //中斷計數先清0
TR0=1; //開啟定時器0
while(count<set_count); //等待發送完
TR0=0; //關閉定時器0
if(ircode&0x01) set_count=130;//130; //判斷紅外編碼最低位,若為1則1.69ms的低電平 (//后為12M晶振下的數值)
else set_count=43;//35; //為0則0.565ms的低電平 (//后為12M晶振下的數值)
irflag=0; //低電平則不發射
count=0; //中斷計數清0
TR0=1; //開啟定時器0
while(count<set_count); //等待發送完
TR0=0; //關閉定時器0
ircode=ircode>>1; //將數據右移,即從低位到高位發送
}
}
//---------------------------------------------------------------------------
void ir_send() //發送紅外數據
{
set_count=692;//672; //發送編碼中的引導碼(9ms高電平+4.5ms低電平) (//后為12M晶振下的數值)
irflag=1; //啟動紅外發射二極管發射
count=0; //中斷計數清0
TR0=1;
while(count<set_count);
TR0=0;
set_count=346;//336; //發送編碼中的4.5ms低電平(//后為12M晶振下的數值)
irflag=0; //低電平則不發射
count=0;
TR0=1;
while(count<set_count); //等待發送完
TR0=0;
ircode=irsys[0]; //發送16位用戶碼的前1-8位
ir_sendbyte();
ircode=irsys[1]; //發送16位用戶碼的前9-16位
ir_sendbyte();
ircode=irdata; //發送8位數據碼
ir_sendbyte();
ircode=~irdata; //發送8位數據反碼
ir_sendbyte();
set_count=43;//35; //發送編碼中的0.56ms高電平 (//后為12M晶振下的數值)
irflag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ir=1;
delay(23);
//延時23ms(編碼中的23ms低電平)
set_count=692;//670; //發送編碼中的引導碼(9ms高電平+4.5ms低電平) (//后為12M晶振下的數值)
irflag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=346;//336; //發送編碼中的4.5ms低電平(//后為12M晶振下的數值)
irflag=0;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
set_count=43;//35; //發送編碼中的0.56ms高電平 (//后為12M晶振下的數值)
irflag=1;
count=0;
TR0=1;
while(count<set_count);
TR0=0;
ir=1; //發射完了關閉紅外發射二極管
}
//---------------------------------------------------------------------------
void timer0_init() //定時器初始化
{
EA=1;
TMOD=0x02; //定時0 8位自動重裝模式
ET0=1;
TH0=0xe6;//0xf3; //定時13us,38K紅外矩形波,晶振24M (//后為12M晶振下的數值)
TL0=0xe6;
}
//---------------------------------------------------------------------------
void main()
{
timer0_init(); //定時0初始化
count=0; //中斷計數先清0
irflag=0; //紅外發射標志先置0
while(1)
{
keyscan(); //鍵值掃描
if(keyflag) //若有按鍵按下
{
delay(10);
ir_send(); //發送紅外編碼
delay(500);
keyflag=0; //按鍵標志清零
delay(100);
}
}
}
//---------------------------------------------------------------------------
void timer0() interrupt 1 //定時器0中斷
{
count++;
if(irflag==1) ir=~ir; //有發射標志,則發射38khz的矩形波
else ir=1; //否則不發射,即相當于發射編碼中的低電平
}
/*說明:本人經多次調試發現若在24M晶振下使用,發射很正常,而在12M晶振下發射的數據則穩定性要差很多,正在完善中*/
復制代碼
作者:
36516351
時間:
2019-4-14 14:43
有沒有原理圖
作者:
jemery1030
時間:
2019-7-23 12:57
感謝無私分享好物
作者:
單片機愛好者@R1
時間:
2019-7-24 10:15
謝謝分享的資料
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1