大神,最近在网上看了很多您的回答,想问下您52单片机无线传输,数据接收储存转发C语言怎么编写啊?

大神,最近在网上看了很多您的回答,想问下您52单片机无线传输,数据接收储存转发C语言怎么编写啊?,第1张

#include <REGX52h>
#define uchar unsigned char
uchar data IRcode[4]; //定义一个4字节的数组用来存储代码
uchar CodeTemp; //编码字节缓存变量
uchar i,j,k; //延时用的循环变量
sbit IRsignal=P3^2; //HS0038接收头OUT端直接连P32(INT0)
/延时09ms子程序/
void Delay0_9ms(void)
{uchar j,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--) ;
}
/延时1ms子程序/
void Delay1ms(void)
{uchar i,j;
for(i=2;i>0;i--)
for(j=230;j>0;j--) ;
}
/延时45ms子程序/
void Delay4_5ms(void)
{uchar i,j;
for(i=10;i>0;i--)
for(j=225;j>0;j--) ;
}
/ 延时子程序 /
void Delay(void)
{uchar i,j,k;
for(i=200;i>0;i--)
for(j=200;j>0;j--)
for(k=3;k>0;k--) ;
}
/中断0解码服务子程序/
void int0(void) interrupt 0 using 2
{
EA=0;
for(k=0;k<10;k++)
{Delay0_9ms();
if (IRsignal==1) //如果09ms后IRsignal=1,说明不是引导码
{k=10;break;}
else if(k==9) //如果持续了10×09ms=9ms的低电平,说明是引导码
{while(IRsignal==0);
Delay4_5ms(); //跳过持续45ms的高电平
for(i=0;i<4;i++) //分别读取4个字节
{for(j=1;j<=8;j++) //每个字节8个bit的判断
{ while(IRsignal==0); //等待上升沿
Delay0_9ms(); //从上升沿那一时刻开始延时09ms,再判断IRsignal
if(IRsignal==1) //如果IRsignal是"1",则向右移入一位"1"
{Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else
if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
}
IRcode[i]=CodeTemp;
CodeTemp=0;
}
for(i=0;i<4;i++) //通过串口将代码发出
{
SBUF=IRcode[i];
while(!TI); //等待一个字节发送完毕
TI=0;
}
Delay();
}
}
EA=1;
}
/串口初始化程序/
void initUart(void)
{
TMOD|=0x20;
SCON=0x50;
PCON|=0x80;
TH1=0xff; //57600bps @ 110592MHz
TL1=0xff;
TR1=1;
}
/主程序/
void main()
{ initUart();
IT0=1; //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
EX0=1; //外部中断INT0开, (1:开, 0:关 )
EA=1; //开所有中断
CodeTemp=0; //初始化红外编码字节缓存变量
Delay();
while(1);
}

你这样写当然不行了,要想使用计数器触发中断,必须要靠"外力"才行,也就是说要在定时器问对应IO口输入脉冲才行,按照你的要求,10个脉冲中断一次,执行一次清零。要实现这个,可以每计算一次人为发送一个脉冲给定时器IO。

#include "reg52h" // 包含头文件
typedef unsigned char uint8; // 无符号8位整型变量
sbit P1_7 = P1 ^ 7;
uint8 T_Count=0; // 初始化计数的值
void main (void)
{
while(1)
{
if(P1_7==1)
{
Delay(80); // 延时消抖
if(P1_7==1) //按键按下
T_Count++; //计数加1
if(T_Count==60) //加到59以后,计数归零
T_Count=0;
}
}
}

mov b,#10

div ab

mov 50h,a

mov a,b

da a

mov 52h,a

anl 52h,#0fh

swap a

anl a,#0fh

mov 51h,a

end

我只说说方法吧,先mov R0,a;把原数暂存于R0中

and a,#0fh;

mov R1,a;低四位保存至R1

mov a,R0;

and a,#0f0h;

swap a;交换高四位与低四位

此时再把a中的数乘以10再加上R1中保存的数就可以了。只说了大致思路,具体的自己写吧。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/10231240.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存