小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 5045|回复: 2

求大侠帮忙看看我的定时器模拟PWM输出??

[复制链接]
发表于 2013-5-22 20:54:17 | 显示全部楼层 |阅读模式
PWM输出遇到问题了,上电PWM有输出。就是不能通过串口调节PWM输出。附代码如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar Buffer =0;                                         //从串口接收的数据
uint i=0,j,URTAReceivedCount=0,n=1;
uchar flag=0;
uchar data Tempdatatable[4],CommandDatatable[4];         //数据包
bit pwm;   
int k=1,pwm_flag=3;      //turn_flag为转动方向标志   
                         //pwm_flag为PWM占空比标志  
sbit ena=P1^0;       //PWM 输出

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)               //1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
uchar temp;
    ES=0;                                //关串口中断
    RI=0;                                //软件清除接收中断
    temp=SBUF;
if(temp==0XFF && URTAReceivedCount<2)
    {
   
  Tempdatatable[0]=0XFF;          //包头
        URTAReceivedCount++;
}
else
{
  Tempdatatable[n]=temp;
  n++;   
}
if(URTAReceivedCount==2)            //包尾
{
      Tempdatatable[0]=0XFF;
      Tempdatatable[3]=0XFF;
      n=1;
      URTAReceivedCount=0;           //组包完毕
      temp="";
      
}
   CommandDatatable[0]=Tempdatatable[0];
   CommandDatatable[1]=Tempdatatable[1];
   CommandDatatable[2]=Tempdatatable[2];
   CommandDatatable[3]=Tempdatatable[3];
   ES=1;                                       //开串口中断
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x21;
    PCON = 0x00;
    SCON = 0x50;   
    TH1 = 0xFd;    //设置波特率 9600
    TL1 = 0xFd;
    TR1 = 1;  //启动定时器1
  
ES = 1;  //开串口中断
    EA = 1;  //开总中断
    IT0=0;
    EX0=1;
}
void TimerInit()
{                        
EA=1;                              //开总中断
//    TMOD=0x01;   
    TH0=0xfc;   
    TL0=0x18;     
    ET0=1;   
    TR0=1;                                
}
/********************************************************************
* 名称 :Moto_Up()
* 功能 : PWM +。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Moto_up()
{
    pwm_flag=pwm_flag+1;   
    if(pwm_flag>6)   
    {   
        pwm_flag=6;   
    }
}
/********************************************************************
* 名称 :Moto_down()
* 功能 : PWM -。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Moto_down()
{   
    pwm_flag=pwm_flag-1;   
    if(pwm_flag<0)   
    {   
        pwm_flag=0;   
    }   
}

void main()
{   
     Delay_1ms(200);
       Com_Init();           //串口初始化
           TimerInit();
   
  while(1)
  {
   if(CommandDatatable[0]==0XFF && CommandDatatable[3]==0XFF)
      {
           switch (CommandDatatable[1])     
             {
                   case 0X00:  
                      switch(CommandDatatable[2])  
                           {
                             case 0X00:
                                     Moto_up();
                                            break;
                               case 0X01:
                                      Moto_down();
                                            break;

                              }
                   break;
      default :  TR0=0;TR2=0;
                         break;
               }

    }
   }
}
/********************************************************************
* 名称 :
* 功能 : PWM输出
* 输入 : 无
* 输出 : 无
***********************************************************************/
void timer0() interrupt 1   
{     
    k++;   
    if(k==7)   
    {   
        k=1;   
    }   
    if(k<=pwm_flag)   
    {   
        pwm=1;   
    }   
    else   
    {   
        pwm=0;   
    }   
    ena=pwm;   
}
回复

使用道具 举报

发表于 2013-5-23 00:07:39 | 显示全部楼层
不懂,。帮顶。。。。等高手来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-25 12:31:32 | 显示全部楼层
怎么没人解决呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-5-14 09:17 , Processed in 1.078658 second(s), 18 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表