欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機紅外遙控器發射程序
[打印本頁]
作者:
吳海晨o
時間:
2021-11-11 19:39
標題:
單片機紅外遙控器發射程序
該代碼使用51單片機,晶振為11.0592m,實現紅外發送的作用,也就是模擬遙控器的作用,如果想要發送的遠,建議加三極管放大,其對應按鍵,以及IR接口在程序可見。
單片機源程序如下:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define SBM 0x80 //識別碼
#define ms9 (65536-9000) //約9mS
#define ms4_5 (65536-4500) //約4.5mS
#define ms1_6 (65536-1630) //約1.65mS
#define ms_65 (65536-580) //約0.65mS
#define ms_56 (65536-560) //約0.56mS
#define ms40 (65536-40000) //約40mS
#define ms56 (65536-56000) //56mS
#define ms2_25 (65536-2250) //約2.25mS
sbit IR = P0^1; //定義發射引腳(接PNP三極管基極)
sbit IR2 = P0^2;
sbit IR3 = P0^3;
sbit KEY0 = P1^7;
sbit KEY1 = P1^0;
sbit KEY2 = P1^3;
sbit KEY3 = P1^7;
sbit KEY4 = P1^1;
sbit KEY5 = P1^2;
sbit KEY6 = P1^4;
sbit KEY7 = P1^5;
uchar KEY(void);
void SanZhuan(void);
void ZZ(uchar x);
void Z0(uchar temp);
void TT0(bit BT,uint x);
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*┈┈┈┈┈┈┈┈┈┈┈函數功能:主函數┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
TMOD = 0x01; //T0 16位工作方式
IR=1; //發射端口常態為高電平
while(1)
{
SanZhuan();
DelayMs(500);
}}
uchar KEY(void)
{
if(KEY0==0) return 1;
if(KEY1==0) return 2;
if(KEY2==0) return 3;
if(KEY3==0) return 4;
if(KEY4==0) return 5;
if(KEY5==0) return 6;
if(KEY6==0) return 7;
if(KEY7==0) return 8;
return 0;
}
void SanZhuan(void)
{
uchar v;
v = KEY();
switch(v)
{
case 1:ZZ(0x45);v=0;break; //" 數字1 "
case 2:ZZ(0x16);v=0;break; //" 數字2 "
case 3:ZZ(0x19);v=0;break; //" 數字3 "
case 4:ZZ(0x0d);v=0;break; //" 數字4 "
case 5:ZZ(0x0c);v=0;break; //" 數字1 "
case 6:ZZ(0x18);v=0;break; //" 數字2 "
case 7:ZZ(0x5e);v=0;break; //" 數字3 "
case 8:ZZ(0x08);v=0;break; //" 數字4 "
default:ZZ(0x19);v=0;
}
}
/*┈┈┈┈┈┈┈┈┈┈函數功能:發送主程序┈┈┈┈┈┈┈┈┈┈┈┈*/
void ZZ(uchar x)
{
TT0(1,ms9); //高電平9mS
TT0(0,ms4_5); //低電平4.5mS
/*┈ 發送4幀數據 ┈*/
Z0(SBM);
Z0(~SBM);
Z0(x);
Z0(~x);
/*┈┈ 結束碼 ┈┈*/
TT0(1,ms_65);
TT0(0,ms40);
/*┈┈ 重復碼 ┈┈*/
//while(KEY())
{
TT0(1,ms9);
TT0(0,ms2_25);
TT0(1,ms_56);
TT0(0,ms40);
TT0(0,ms56);
}}
void Z0(uchar temp)
{
uchar v;
for (v=0;v<8;v++) //循環8次移位
{
TT0(1,ms_65); //高電平0.65mS
if(temp&0x01) TT0(0,ms1_6); //發送最低位
else TT0(0,ms_56);
temp >>= 1; //右移一位
}
}
/*┈┈┈┈┈┈┈┈┈38KHz脈沖發射 + 延時程序┈┈┈┈┈┈┈┈┈┈┈┈*/
void TT0(bit BT,uint x)
{
TH0 = x>>8; //輸入T0初始值
TL0 = x;
TF0=0; //清0
TR0=1; //啟動定時器0
if(BT == 0) while(!TF0); //BT=0時不發射38KHz脈沖只延時;BT=1發射38KHz脈沖且延時;
else while(1) //38KHz脈沖,占空比5:26
{
IR = 0;
if(TF0)break;
if(TF0)break;
IR = 1;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
}
TR0=0; //關閉定時器0
TF0=0; //標志位溢出則清0
IR =1; //脈沖停止后,發射端口常態為高電平
}
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1