- 8条回答
-
WYF13760287143
06-29 23:22
/*串口接收*/
#include
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
static unsigned char dat,countT0;
void delay(int t)
{
char i;
while(t--)
{
for(i=0;i<100;i++);
}
}
void timerinit()
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
//TMOD &= 0x0F; //清除定时器1模式位
TMOD = 0x22; //设定定时器1、定时器0为8位自动重装方式
TL1 = 0xe8; //设定定时初值 //1200
TH1 = 0xe8; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ET0 = 1; //允许定时器0中断
TR0 = 1; //timer0 start
TL0 = 0xe8; //设定定时0初值 //0.1ms
TH0 = 0xe8; //设定定时器0重装值
ES=1;
EA=1;
}
void qianjing()
{
if(countT0<50)
{
led1=0;
}
if(countT0>50)
{
led1=1;
}
}
void houtui()
{
if(countT0<50)
{
led2=0;
}
if(countT0>50)
{
led2=1;
}
}
void left()
{
if(countT0<50)
{
led3=0;
}
if(countT0>50)
{
led3=1;
}
}
void right()
{
if(countT0<50)
{
led4=0;
}
if(countT0>50)
{
led4=1;
}
}
void jieshou()
{
switch(dat)
{
case 0xaa:qianjing();break;//如果串口接收的为0xaa ,则P1.0口输出PWM
case 0x77:houtui();break;//如果串口接收的为0x77 ,则P1.1口输出PWM
case 0xa7:left(); break;//如果串口接收的为0xa7 ,则P1.2口输出PWM
case 0x7a:right();break;//如果串口接收的为0x7a ,则P1.3口输出PWM
// case 0xa0:P1=0xe0;break;
// default:P1=0xff;break;
}
}
void main()
{
dat=0x00;
timerinit();
delay(1);
while(1)
{
jieshou();
}
}
/*串口接收*/
void uart() interrupt 4
{
if(RI) //接收中断
{
RI=0; //读取接受到的数据
dat=SBUF;
}
}
void timer0() interrupt 1
{
// TL0 = 0x9c; //设定定时0初值 //0.1ms
// TH0 = 0x9c; //设定定时器0重装值
countT0++;
if(countT0==100)countT0=0;
}
-
zixiang_huang
06-27 22:02
但是实测PWM输出有不定时的断续现象
-
镁酷科技
06-26 02:12
由于串口是用433M无线传输的,是信号误码原因引起的,问题已确定,但是这个误码怎么处理呢?
-
60user92
06-27 21:52
误码处理,在传输固定数据的时候,可用查表法处理。
但是在传输不确定的数据情况下怎么处理误码呢?
在线等。
-
刘祥1982
06-23 20:52
通常无线传输是靠协议和校验来保证数据正确性的,高要求下可以使用纠错编码来恢复部分有错的数据。不过,楼主的应用是根据无线传输的数据来决定PWM输出,那将是实时的,纠错算法需占用大量带宽,楼主所用信道未必能很好的支持,所以还是用校验吧,发现有错则维持上一帧数据不变,这虽然不真实,但总比误码好。
-
sdfdsg
06-27 23:16
/*串口接收*/
#include
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
static unsigned char dat,dat0,countT0;
void delay(int t)
{
unsigned int i;
while(t--)
{
for(i=0;i<100;i++);
}
}
void timerinit()
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
//TMOD &= 0x0F; //清除定时器1模式位
TMOD = 0x22; //设定定时器1、定时器0为8位自动重装方式
TL1 = 0xe8; //设定定时初值 //1200
TH1 = 0xe8; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ET0 = 1; //允许定时器0中断
TR0 = 1; //timer0 start
TL0 = 0xe8; //设定定时0初值 //0.1ms
TH0 = 0xe8; //设定定时器0重装值
ES=1;
EA=1;
}
void qianjing()
{
if(countT0<50)
{
led1=0;
}
if(countT0>50)
{
led1=1;
}
}
void houtui()
{
if(countT0<50)
{
led2=0;
}
if(countT0>50)
{
led2=1;
}
}
void left()
{
led3=1;
}
void right()
{
led4=1;
}
void jieshou()
{
switch(dat)
{
case 0xaa:qianjing();break;
case 0x77:houtui();break;
case 0x7a:left();break;
case 0xa7:right();break;
default:P1=0x00;break;
}
}
void main()
{
dat=0x00;
P1=0xff;
timerinit();
delay(1);
while(1)
{
jieshou();
}
}
/*串口接收*/
void uart() interrupt 4
{
if(RI) //接收中断
{
dat0=SBUF;
RI=0; //读取接受到的数据
}
switch(dat0)
{
case 0xaa:dat=dat0;break;
case 0x77:dat=dat0;break;
case 0x7a:dat=dat0;break;
case 0xa7:dat=dat0;break;
case 0xa0:dat=dat0;break;
default:P1=0x00;break;
}
}
void timer0() interrupt 1
{
countT0++;
if(countT0>99)countT0=0;
}
-
guotong1984
07-01 14:56
是不是外围元件有问题,换片或上拉试试。
-
kghfh
06-28 02:49
端口少时正常,多了不正常,说明程序有误,特别要注意循环处理时的时间是否满足。