0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

单片机

关于stc89c52单片机PWM输出的问题

关于stc89c52单片机PWM输出的问题

提问者:uwjfuwer 地点:- 浏览次数:6028 提问时间:10-19 10:52
我有更好的答案
提 交
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
端口少时正常,多了不正常,说明程序有误,特别要注意循环处理时的时间是否满足。
撰写答案
提 交
1 / 3
1 / 3
相关单片机
具有音调控制的单片机立体声前置放大器
用于单片机与电子装置中的开关电源
单片机软硬件复位的条件都有啥
电动机的单片机控制
单片机应用系统开发实例导航