下面给大家整理下315m无线模块的接收程序
#include
#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
{
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)
{
scon = 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
tl1 = 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 >1)
void send(){
//下面两行在wirless()中已经执行过了,所以无需写上
// if (send_stat != send_progressing)
// return;
if (!send_busy){
if(send_byts || send_bit_p){
if (head_counts){
head_counts--;
if(head_counts)
send_puls(puls_head_width);
else
send_puls(puls_start_width);
}else{
if (send_bit_p == 0){
sending_byte = send_buf[send_byte_p];
send_byte_p++;
send_byts--;
send_bit_p = 8;
}
if(sending_byte & 0x80){
send_puls(puls_1_width);
}else{
send_puls(puls_0_width);
}
sending_byte < puls_type - puls_0_width / 2 && puls_in < puls_type + puls_0_width / 2)
#define head_need_recived 8
void recv(){
unsigned puls_width;
if ((recv_stat == recv_success) || !w_data)
return;
puls_width = w_data;
w_data = 0;
#if 0 //输出脉宽
serial_out(puls_width);
// printhex(puls_width);
#endif
if (recv_step < head_need_recived){
if(test_puls(puls_width, puls_head_width)){
recv_step++;
}else{
recv_step = 0;
}
}else if (recv_step == head_need_recived){
if(test_puls(puls_width, puls_start_width)){
serial_out(0xbb);
recv_byte_p = 0;
recv_bit_p = 8;
recv_stat = 0;
recv_step++;
}else{
if(!test_puls(puls_width, puls_head_width)){
recv_step = 0;
}
}
}else{
//serial_out(puls_width);
recving_byte < head_need_recived) //如果检测到当前有其它单元正在发送,继续等待
send_delay = send_delay_time;
else{
if(test_puls(w_data, puls_0_width) //如果检测到当前有其它单元正在发送,继续等待
|| test_puls(w_data, puls_1_width)
//|| test_puls(w_data, puls_head_width)
|| test_puls(w_data, puls_start_width)
//|| test_puls(w_data, puls_stop_width)
){
if (valid_puls_counts)
valid_puls_counts--;
else
send_delay = send_delay_time;
}else{
valid_puls_counts = valid_puls_count;
}
}
}
}
void display_t()
{
displayonechar(9,1,recv_buf[5]);
displayonechar(8,1,recv_buf[4]);
displayonechar(7,1,recv_buf[3]);
displayonechar(6,1,recv_buf[2]);
displayonechar(5,1,recv_buf[1]);
displayonechar(0,0,0x54);
}
#define scmd_set_port 0x51
#define scmd_get_port 0x52
#define scmd_reset 0x61
#define scmd_lcd_outstr 0x71
#define scmd_lcd_reset 0x72
#define scmd_lcd_setxy 0x73
#define scmd_lcd_setline 0x74
#define scmd_lcd_clear 0x75
#define sresp_get_port_error 0x41
#define sresp_set_port_error 0x42
#define heart_beat_interval 200 //心跳间隔 x / 1000 秒
unsigned int heart_beat_timer = heart_beat_interval;
unsigned int last_jiffies=0;
void main(){
delay400ms(); //启动等待,等lcm讲入工作状态
lcminit(); //lcm初始化
delay5ms(); //延时片刻(可不要)
mychar(10,1); //显示 自定义字符
init_serialcomm();
p0=0x0ff;
p2=0x00;
sys_init();
//send_string_com(ok,2);
//lcd_reset();
//lcd_power_on();
//lcd_self_test();
while(1){
if (jiffies - last_jiffies >= 20){//每次中断为50us,所以要20次才为1ms
last_jiffies = jiffies;
heart_beat_timer--;
if (send_delay)
send_delay--;
}
if (heart_beat_timer == 0){
heart_beat_timer = heart_beat_interval;
while(1) {recv();if (recv_stat == recv_success)
{
p0_0=~p0_0;
send_string_com(recv_buf,strlen(recv_buf));
display_t();
recv_stat = 0;break;}
recv_stat = 0;
}
}
/*#if 0
if (send_stat == 0){
//碰撞测试
start_send(8);
send_buf[1]='t';
send_buf[2]='e';
send_buf[3]='s';
send_buf[4]='t';
send_buf[5]='o';
send_buf[6]='k';
send_buf[7]='!';
lcd_out_string(sending:);
//send_string_com(send_buf,strlen(send_buf));
printhex(send_buf[0]);
printhex(send_buf[1]);
}
#endif
*/
wirless();
if (send_stat == send_failed){
send_stat = 0;
}else if (send_stat == send_success){
send_stat = 0;
p2_3=~p2_3;
}
//recv();
//send_string_com(start,5);
/*while(1) {recv();if (recv_stat == recv_success)
{
p0_0=~p0_0;
send_string_com(recv_buf,strlen(recv_buf));} }*/
/* if (recv_stat == recv_success){
//send_string_com(test1,5);
#if 1
//unsigned int i;
//for(i=0; i
// serial_out(recv_buf[i]); //输出接收到的字符
p0_0=~p0_0;
send_string_com(recv_buf,strlen(recv_buf));
#else
//if (recv_buf[1]=='o')
//p0=0x00;
//lcd_out_string(data recived:);
//printhex(recv_buf[0]);
//printhex(recv_buf[1]);
//outchar('\n');
//send_string_com(test3,5);
#endif
recv_stat = 0;
}
*/
#if 0
if (ri){
unsigned char scmd[17];
heart_beat_timer = heart_beat_interval;
wait_serial(scmd, 1, 0);
switch(scmd[0]){
case scmd_reset:
((void (code *) (void))0x0000) ();//软件复位
case scmd_set_port:
if (wait_serial(scmd, 2, 200))
break;
switch(scmd[0]){
case 0:
p0 = scmd[1];
break;
case 1:
p1 = scmd[1];
break;
case 2:
p2 = scmd[1];
break;
case 3:
p3 = scmd[1];
break;
}
break;
case scmd_get_port:
if (wait_serial(scmd, 1, 200))
break;
switch(scmd[0]){
case 0:
serial_out(p0);
break;
case 1:
serial_out(p1);
break;
case 2:
serial_out(p2);
break;
case 3:
serial_out(p3);
break;
}
break;
case scmd_lcd_outstr:
if (wait_serial(scmd, 1, 200))
break;
scmd[scmd[0]] = 0;
if (wait_serial(scmd, scmd[0], 200))
break;
lcd_out_string(scmd);
break;
case scmd_lcd_reset:
lcd_reset();
break;
case scmd_lcd_clear:
lcd_clear();
break;
case scmd_lcd_setxy:
if (wait_serial(scmd, 2, 200))
break;
setxy(scmd[0], scmd[1]);
break;
case scmd_lcd_setline:
if (wait_serial(scmd, 1, 200))
break;
setline(scmd[0]);
break;
default:
break;
}
}
#endif
}
}
郭明錤曝光iPhone SE3细节:2021年推出
中国移动5G精品网络建设的四大提升方面
高效软件开发过程的三个步骤
澜起科技全新第五代津逮®CPU上市!
威尔逊恒流源电路的仿真分析
315m无线模块怎么接收程序?程序是什么?
移位寄存器的工作原理
浅谈IC验证者眼中的FS
日本研发出6G芯片 美国宣布启动6G试验!
冠状病毒影响分析 扰乱全球生产及供应链
腾讯最新发布基于AMD EPYC的Star Lake服务器
Lyft准备IPO创企依然亏损严重,盈利遥遥无期
通过AI智能化技术,让金融行业迎来了极大利好
行业、政策双重驱动 思必驰提交IPO申请
利用MAXREFDES117测量心率和脉搏血氧饱和度
讨好年轻人 大众POLO Match特别版官图
人工智能在助力疫情防控中的应用情况分析
PN网络里设备名称的重要性
滤波电容器寿命短是什么原因
plc有哪两种工作状态 plc处理的是什么信号