電路原理圖如下:
]XG{GYHWFJVQO})UWGZ0.png (226.72 KB, 下載次數: 54)
下載附件
圖
2019-6-16 21:09 上傳
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uint times=0;
- sbit led1=P1^0;
- sbit led2=P1^1;
- sbit led3=P1^2;
- sbit led4=P1^3;
- sbit ledup=P1^4;
- sbit leddown=P1^5;
- #define SBM 0x80 //識別碼
- #define m9 (65536-9000) //約9mS
- #define m4_5 (65536-4500) //約4.5mS
- #define m1_6 (65536-1630) //約1.65mS
- #define m_65 (65536-580) //約0.65mS
- #define m_56 (65536-560) //約0.56mS
- #define m40 (65536-40000) //約40mS
- #define m56 (65536-56000) //56mS
- #define m2_25 (65536-2250) //約2.25mS
- sbit IR = P3^6; //定義發射引腳(接PNP三極管基極)
- uchar KEY(void);
- void SanZhuan(void);
- void ZZ(uchar x);
- void Z0(uchar temp);
- void TT0(bit BT,uint x);
- void YS(uchar time);
- void delay(unsigned char n){
- do{
- _nop_();
- _nop_();
- _nop_();
- n--;
- }while(n);
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數功能:主函數
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void main(void)
- {
- TMOD = 0x01; //T0 16位工作方式
- IR=1; //發射端口常態為高電平
- while(1)
- {
- SanZhuan();
- }
- }
- uchar KEY(void)
- {
- P1 = 0xff; //將鍵盤端口行值設為1,列值設為0
- if(led1==0){
- return 1;
- }else if(led2==0){
- return 2;
- }else if(led3==0){
- return 3;
- }else if(led4==0){
- return 4;
- }else if(ledup==0){
- return 5;
- }else if(leddown==0){
- return 6;
- }
- return 0;
- }
- /***************************************************************
- 函數功能:散轉程序
- 入口參數:v
- //
- // 13 14 15 16
- // 9 10 11 12
- // 5 6 7 8
- // 1 2 3 4
- ***************************************************************/
- void SanZhuan(void)
- {
- uchar v;
- v = KEY();
- switch(v)
- {
- case 1:ZZ(0x01);v=0;break; //" "
- case 2:ZZ(0x02);v=0;break; //" "
- case 3:ZZ(0x03);v=0;break; //" "
- case 4:ZZ(0x04);v=0;break; //" "
- case 5:ZZ(0x05);v=0;break; //" "
- case 6:ZZ(0x06);v=0;break; //" "
- default:v=0;
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數功能:發送主程序
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void ZZ(uchar x)
- {
- TT0(1,m9); //高電平9mS
- TT0(0,m4_5); //低電平4.5mS
- /*┈ 發送4幀數據 ┈*/
- Z0(SBM);
- Z0(~SBM);
-
- Z0(x);
- Z0(~x);
- /*┈┈ 結束碼 ┈┈*/
- TT0(1,m_65);
- TT0(0,m40);
- /*┈┈ 重復碼 ┈┈*/
- while(KEY())
- {
- TT0(1,m9);
- TT0(0,m2_25);
- TT0(1,m_56);
- TT0(0,m40);
- TT0(0,m56);
-
- }
-
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數功能:單幀發送程序
- 入口參數:1幀數據
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void Z0(uchar temp)
- {
- uchar v;
- for (v=0;v<8;v++) //循環8次移位
- {
- TT0(1,m_65); //高電平0.65mS
- if(temp&0x01) TT0(0,m1_6); //發送最低位
- else TT0(0,m_56);
- temp >>= 1; //右移一位
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數功能:38KHz脈沖發射 + 延時程序
- 入口參數:(是否發射脈沖,延時約 x (uS))
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- 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; //脈沖停止后,發射端口常態為高電平
- }
- /***************************************************************
- 函數功能:按鍵消抖 延時程序
- 入口參數:1ms×time (晶振=12MHz)
- ***************************************************************/
- void YS(uchar time)
- {
- uchar i,j;
- for(i=0; i<time; i++)
- for(j=0; j<247; j++)_nop_();
- }
復制代碼
|