还有这个你- /**********************************************************
- 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;
- }
- }
-
- }
复制代码 都试试吧 |