該代碼使用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; //脈沖停止后,發射端口常態為高電平
- }
復制代碼
|