|
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;
}
|
|