|
|
//********************************************單片機紅外發射*******************************************
#include "reg52.h"
sbit ir=P2^7;//紅外發射管控制腳,使用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=125;i>0;i--);
}
//---------------------------------------------------------------------------
void ir_sendbyte() //紅外發送一個字節數據
{
unsigned char i;
for(i=0;i<8;i++) //發送8位數據
{
set_count=35;//35; //發送編碼中的0.56ms高電平
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的低電平
else set_count=35;//35; //為0則0.565ms的低電平
irflag=0; //低電平則不發射
count=0; //中斷計數清0
TR0=1; //開啟定時器0
while(count<set_count); //等待發送完
TR0=0; //關閉定時器0
ircode=ircode>>1; //將數據右移,即從低位到高位發送
}
TR0=0;
set_count=0;
count=0;
ir=1; //發射完了關閉紅外發射二極管
}
//---------------------------------------------------------------------------
void ir_send() //發送紅外數據
{
set_count=672;//672; //發送編碼中的引導碼(9ms高電平+4.5ms低電平)
irflag=1; //啟動紅外發射二極管發射
count=0; //中斷計數清0
TR0=1;
while(count<set_count);
TR0=0;
set_count=336;//336; //發送編碼中的4.5ms低電平
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();
}
//---------------------------------------------------------------------------
void timer0_init() //定時器初始化
{
EA=1;
TMOD=0x02; //定時0 8位自動重裝模式
ET0=1;
TH0=0xf3;//0xf3; //定時13us,38K紅外矩形波,晶振24M (//后為12M晶振下的數值)
TL0=0xf3;
}
//---------------------------------------------------------------------------
void main()
{
P1=0x00;
timer0_init(); //定時0初始化
count=0; //中斷計數先清0
irflag=0; //紅外發射標志先置0
irdata=9; //1 //55 55 55 A9
while(1) //2 //AA 55 55 53
{ //4 //55 55 55 04
ir_send(); //發送紅外編碼 //5 //55 55 55 49
delay(50); //6 //00 55 55 0A
} //7 //00 55 55 15
} //8 //54 55 55 4D
//----------------------------------------------------------------------- //9 //00 55 55 11
void timer0() interrupt 1 //定時器0中斷 //10 //A8 55 55 13
{
count++;
if(irflag==1) ir=~ir; //有發射標志,則發射38khz的矩形波
else ir=1; //否則不發射,即相當于發射編碼中的低電平
}
|
-
image022.jpg
(47.95 KB, 下載次數: 34)
下載附件
2019-10-5 19:52 上傳
-
image012.jpg
(42.82 KB, 下載次數: 44)
下載附件
2019-10-5 19:52 上傳
-
image006.jpg
(39.52 KB, 下載次數: 33)
下載附件
2019-10-5 19:52 上傳
-
硬件原理圖.jpg
(175.22 KB, 下載次數: 37)
下載附件
2019-10-5 19:51 上傳
-
image024.jpg
(46.34 KB, 下載次數: 36)
下載附件
2019-10-5 19:52 上傳
-
image026.jpg
(45.54 KB, 下載次數: 36)
下載附件
2019-10-5 19:52 上傳
-
-
履帶式蔽障車.rar
2019-10-5 19:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
17.82 MB, 下載次數: 19, 下載積分: 黑幣 -5
-
-
實例二、直流電機控制.rar
2019-10-5 19:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
78.8 KB, 下載次數: 22, 下載積分: 黑幣 -5
|