资讯详情

51单片机+315M无线射频模块接受程序

用的就是那种最普通的 最便宜的 大约几块钱 的315兆的 接受发射,不带解码的,433m的程序也是一样的不用修改

压缩包中的内容:

上位机以及完整程序在文件夹中,大家可自己下载 地址是:http://www.ruidan.com/bbs/dpj-19033-1.html

下面是接受端的源代码: #include <AT89X52.H> #include "string.h"

//液晶块 #define LCM_RW P3_6 //定义引脚 #define LCM_RS P3_5 #define LCM_E P3_7 #define LCM_Data P1 #define Busy 0x80 //用于检测LCM状态字中的Busy标识 typedef int byte; typedef unsigned int word;

void Read_Temp(void); void mychar(char,char);

void WriteDataLCM(unsigned char WDLCM); void WriteCommandLCM(unsigned char WCLCM,BuysC); unsigned char ReadDataLCM(void); unsigned char ReadStatusLCM(void); void LCMInit(void); void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void); void Delay400Ms(void);

void delay(word useconds) { for(;useconds>0;useconds--); }

void mychar(char xx,char yy) {

DisplayOneChar(0,0,0x54); DisplayOneChar(1,0,0x65); DisplayOneChar(2,0,0x6D); DisplayOneChar(3,0,0x70); DisplayOneChar(4,0,0x65); DisplayOneChar(5,0,0x72); DisplayOneChar(6,0,0x61); DisplayOneChar(7,0,0x74); DisplayOneChar(8,0,0x75); DisplayOneChar(9,0,0x72); DisplayOneChar(10,0,0x65); DisplayOneChar(11,0,0x3A); ///////////////////////自定义字符 WriteCommandLCM(0x48, 0); //第一行 WriteDataLCM(0x06); WriteCommandLCM(0x49, 0); //第2行 WriteDataLCM(0x09); WriteCommandLCM(0x4a, 0); //第3 WriteDataLCM(0x09); WriteCommandLCM(0x4b, 0); //第4 WriteDataLCM(0x06); WriteCommandLCM(0x4c, 0); //第5 WriteDataLCM(0x00); WriteCommandLCM(0x4d, 0); //第6 WriteDataLCM(0x00); WriteCommandLCM(0x4e, 0); //第7 WriteDataLCM(0x00); WriteCommandLCM(0x4f, 0); //第8 WriteDataLCM(0x00); DisplayOneChar(xx,yy,0x01); DisplayOneChar(xx+1,yy,0x43); } //写数据 void WriteDataLCM(unsigned char WDLCM) { ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0; LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1; }

//写指令 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测 { if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; }

//读状态 unsigned char ReadStatusLCM(void) { LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & Busy); //检测忙信号 return(LCM_Data); }

void LCMInit(void) //LCM初始化 { LCM_Data = 0; WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms(); WriteCommandLCM(0x38,0); Delay5Ms();

WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏 WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0C,1); // 显示开及光标设置 }

//按指定位置显示一个字符 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码 WriteDataLCM(DData); }

//按指定位置显示一串字符 ***原来的遇到空格0x20就不显示*** void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) { unsigned char ListLength,j; ListLength = strlen(DData); Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (X <= 0xF) //X坐标应小于0xF { for(j=0;j<ListLength;j++) { DisplayOneChar(X, Y, DData[j]); //显示单个字符 X++; } } }

//5ms延时 void Delay5Ms(void) { unsigned int TempCyc = 5552; while(TempCyc--); }

//400ms延时 void Delay400Ms(void) { unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); }; }

sbit W_IN = P2^1; sbit W_OUT = P2^0;

unsigned char w_data;//接收时用于存储两次上升沿之间的时长,发送时存储前半周 unsigned char send_busy = 0;//存储发送时后半周 unsigned char recv_timer = 0; bit w_stat, last_w_stat;

unsigned char jiffies=0; void clock_timer(void) interrupt 1 using 1{ if (send_busy){ if(w_data){ w_data--; w_stat = 0; }else{ send_busy--; w_stat = 1; } W_OUT = w_stat; }else{ w_stat = W_IN; if (w_stat != last_w_stat){ last_w_stat = w_stat; if (w_stat){ w_data = recv_timer; recv_timer = 0; } } if (~recv_timer)//if(recv_busy != 0xff) recv_timer++; } jiffies++; }

void clock_init(void){ jiffies = 0; TMOD=0x02; TH0=TL0=0x0ce;//12M,50us //TH0=TL0=0x7a;//16M //TH0=TL0=0x75;//16.59M //TH0=TL0=0x72;//17M //TH0=TL0=0x37;//24M //TH0=TL0=0x47;//22.1844M, 100us //TH0=TL0=0xa3;//22.1844M, 50us EA=1; ET0=1;

TR0=1; } void init_serialcomm(void) { SC = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload PCON |= 0x80; //SMOD=1; TH1 = 0x0e6; //Baud:2400 fosc=11.0592MHz :f4 = 0x0e6; //IE |= 0x90; //Enable Serial Interrupt TR1 = 1; // timer 1 run RI=0; TI=1; }

void serial_out(unsigned char d){ while(!TI); TI=0; SBUF=(d); }

void send_string_com(unsigned char *str,int strlen)//串口程序 { unsigned char sum;

unsigned char k=0; //serial_out(02); do { //sum^=*(str+k); serial_out(*(str + k)); //serial_out('a'); k++; } while(k < strlen); //serial_out(sum); //serial_out('e'); }

//等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间. //超时单位为time_out * 100uS bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){ unsigned int time=jiffies; unsigned char n=0; do{ if (RI){ p[n++]=SBUF; RI=0; if(n==len) return 0; time=jiffies; } }while(jiffies-time < time_out); return 1; }

sys_init(){ clock_init(); init_serialcomm(); }

//============================================================= //发送程序 开始 //=============================================================

#define _0_WH 8//低电平脉宽 #define PULS_1_WIDTH 16//高电平脉宽 #define PULS_HEAD_WIDTH 8//前导信号脉宽 #define PULS_ART_WIDTH 24//引导信号脉宽 #define PULS_STOP_WIDTH 8//结束码脉宽

#define PULS_HEAD_COUS 16//前导信号长度

unsigned char send_buf[16]; #define send_byts send_buf[0]//剩余字节数,发送完后为0 unsigned char sending_byte;//当前正在发送的字节 unsigned char send_byte_p;//已发送字节数(含正在发送的字节) unsigned char send_bit_p;//当前正在发送的字节已发送位数(含正在发送的位)

#define SEND_PROGRENG 0x41 #define SEND_FAILED 0x21 #define SEND_SESS 0x31 unsigned char send_stat = 0;//发送程序当前状态,为0时正常 unsigned char head_counts;//前导信号(包括引导信号)

void start_send(){ send_byte_p = 0; send_bit_p = 0; send_stat = SEND_PROGRESSING; head_coun

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台