還有這個你- /**********************************************************
- 315M無線解碼51程序
- 無線碼寬電平脈沖時間1.8ms,低電平脈沖時間600us,
- 同步碼低電平時間18.6ms lcd1602顯示碼值
- MCU:STC12C5a60s2,11.0591MHzOSC,
- 大數碼管實驗板調試通過
- ***************************************************/
-
- #include <stc12c5a60s2.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define _rlcar_(RX) CY=RX&0X80//RX帶進位左移1位,數據放入ACC
- sbit WUXIAN=P3^3;
- sbit led=P1^3;
- sbit lcdrs=P3^6;
- sbit lcdrw=P3^5;
- sbit lcden=P3^7;
- sbit beep=P1^7;//蜂鳴器
- uchar code Tab[]={'0','1','2','3','4','5','6','7','8',//大寫
- '9','A','B','C','D','E','F'};
- uchar code Tab1[]="315M WU XIAN JMA";//315無線解碼
- uchar code Tab2[]="MA ZHI:";//碼值
- uchar disp[8];
- uchar bdata wx_data0,wx_data1,wx_data2; //存儲24位無線數據
- uchar data wx_code0,wx_code1,wx_code2;
- uchar data wx_count,wxcount_buf; //低電平時間計數器
- uchar data wx_bit; //無線碼位數
- uchar data t_10ms;
- uchar data t_50ms;
- bit tb_flag; //同步碼接收成功標志
- bit wx_ok; //無線碼接收成功標志
- bit wx_sta; //無線信號輸入腳的高低電平狀態
- void write_dat(uchar dat);
- void display();//顯示函數;
- void irwork();//數據分離
- void decode();
- void delay(uint z) //延時子程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=220;y>0;y--);
- }
- void write_com(uchar com)//定義一個帶參數的寫命令子程序
- {
- lcdrs=0; //1602的rs為0時,接收命令,為1時接收數據
- P0=com;//把void write_com(uchar com)中的COM中的數據給P0口
- delay(2);
- lcden=1;
- delay(2);
- lcden=0;
- delay(2);
- }
- void init_1602()//定義一個初始化子程序
- {
- uchar i;
- lcden=0;
- lcdrw=0;
- write_com(0x38);//調用 write_com子程序并把0x38賦給P0口,顯示模式打開
- // write_com(0x0f);//調用 write_com子程序并把“開顯示,顯示光標,光標閃爍”指令碼賦給P0口
- write_com(0x06);//調用 write_com子程序并把“地址指針加1,整屏不移動”指令碼賦給P0口
- //write_com(0x80+0x10);//數據指針初始化,讓指針指向可顯示的最右端
- write_com(0x80);//數據指針初始化,讓指針指向最左端,顯示從第一行開始
- write_com(0x01);//調用 write_com子程序并把"清零指"令碼賦給P0口
- write_com(0x0c);//不顯示光標
- write_com(0x81);
- for(i=0;i<16;i++)
- {
- write_dat(Tab1[i]);
- delay(2);
- }
- write_com(0x80+0x40);
- for(i=0;i<7;i++)
- {
- write_dat(Tab2[i]);
- delay(2);
- }
- }
-
- void write_dat(uchar dat)//定義一個帶參數的寫數據子程序
- {
- lcdrs=1; //1602的rs為0時,接收命令,為1時接收數據
- P0=dat;//把void write_shu(uchar shu)中的COM中的數據給P0口
- delay(2);
- lcden=1;
- delay(2);
- lcden=0;
- delay(2);
- }
- void mcu_initialize()
- {
- WDT_CONTR=0x00; //關閉看門狗
- AUXR=0; //定時器0和1設為傳統8051速度,12分頻
- // P0=0;
- TR0=0;
- TH0 = 0xa4;//11.0592M //100us中斷一次
- TL0 = 0x00;
- //TH0=0x9c;//12M//100us中斷一次
- //TL0=0x00;
- TMOD|=0x02; //設置T0為自動裝入的8位定時器
- ET0=1; //允許T0中斷
- EA=1;
- TR0=1; //啟動T0
- }
- void main()
- {
- mcu_initialize();
- init_1602();
- while(1)
- {
-
-
- }
- }
- void decode()
- {
- if(WUXIAN)
- { //檢測無線I/O口為高
- if(!wx_sta)
- {
- wx_sta=1; //無線信號從低變高
- wxcount_buf=wx_count;
- if(tb_flag)
- { //同步碼標志為1
- if((0x02<wxcount_buf)&&(wxcount_buf<0x08))
- { //低電平脈寬范圍在200us到800us之間
- CY=1;
- }
- else
- if((0x0d<wxcount_buf)&&(wxcount_buf<0x14))
- { //低電平脈寬范圍在1.3ms到2ms之間
- CY=0;
- }
- else
- { //干擾碼
- loop2:wx_count=0;
- wx_bit=0;
- wxcount_buf=0;
- tb_flag=0;
- return;
- }
- _rlcar_(wx_data0);//移位寄存器,接收一位數據
- wx_data0=ACC;
- _rlcar_(wx_data1);
- wx_data1=ACC;
- _rlcar_(wx_data2);
- wx_data2=ACC;
- if(++wx_bit==24)
- { //接收完24位碼,接收成功標志wx_ok置1
- tb_flag=0;
- wx_bit=0;
- wx_ok=1;
- wx_code0=wx_data0;
- wx_code1=wx_data1;
- wx_code2=wx_data2;
- irwork();
- display();
- // P0=wx_code0; //p1口接LED顯示數據
- }
- }
- else
- {
- if((0x87<wxcount_buf)&&(wxcount_buf<0xc8))
- tb_flag=1;//抵電平脈寬范圍在13.5ms到20ms之間,把同步碼標志置1
- else
- goto loop2;
- }
- }
- }
- else
- {
- if(wx_sta)
- {
- wx_count=0; //無線信號從高變低,清零低電平脈寬計數器
- wx_sta=0;
- }
- else
- wx_count++; //無線信號為低電平,低電平脈寬計數器加1
- }
- }
- void irwork()//數據分離
- {
- disp[0]=wx_code0/16;//取高四位
- disp[1]=wx_code0%16;//取低四位
- disp[2]=wx_code1/16;//取高四位
- disp[3]=wx_code1%16;//取低四位
- disp[4]=wx_code2/16;//取高四位
- disp[5]=wx_code2%16;//取低四位
- // disp[6]=ircode[3]/16;//取高四位
- // disp[7]=ircode[3]%16;//取低四位
- }
- void display()//顯示函數
- {
- write_com(0x80+0x48);
- write_dat(Tab[disp[0]]);
- write_dat(Tab[disp[1]]);
- write_dat(Tab[disp[2]]);
- write_dat(Tab[disp[3]]);
- write_dat(Tab[disp[4]]);
- write_dat(Tab[disp[5]]);
- // write_dat(Tab[disp[6]]);
- // write_dat(Tab[disp[7]]);
- }
- void timer0_isr() interrupt 1
- {
- decode();
- if(++t_10ms>=100)
- { //P3.7口接的LED以0.5s的速度閃爍
- t_10ms=0;
- if(++t_50ms>=50)
- {
- led=!led;
- t_50ms=0;
- }
- }
-
- }
復制代碼 都試試吧 |