PWM占空比调制程序(双定时器)

  • 格式:doc
  • 大小:22.00 KB
  • 文档页数:4
InitUART();
TMOD=0x11;
TL0=0x18;
TH0=0xfc;
EA=1;
ET0=1;
ET1=1;
TR0=1;
while(1)
{
a=(65536-s[0]*10)/256; //定时器生成PWM占空比高电平初值
b=(65536-s[0]*10)%256;
}
}
void int0() interrupt 1 //生成PWM控制信号脉冲周期
{
TL0=0x18;
TH0=0xfc;
PWM=0; //输出高电平
TH1=a;
//设置定时器1初值
TL1=b;
TR1=1;
//开启定时器1
}
//************************************通过串口将接收到数据发送给PC端**************************************
PCON = 0x00;//PCON的地址是87H,这里SMOD =0
T2CON = 0x30;//TF2 EXF2 RCLK TCLK EXEN2 TR2 C(/T2) CP(/RL2) //0 0 1 1 0 0 0 0
/*T2MOD = 0x00;// //////T2OEDCEN //0 0 0 0 0 0 0 0*/
void InitUART(void)
{
unsigned int iTmpBaud;
unsigned long lTmpBaud;
iTmpBaud = 0;
//首先选定定时器2作为波特率发生器,16位定时器,自动装载
SCON = 0x50;//SM0 SM1 SM2 REN TB8 RB8 TI RI//0 1 0 1 0 0 0 0
#define uchar unsigned char //简写符号表示无符号字符型数据类型
#define FOSC 12000000 //晶振大小值设定,便于计算波特率
#define BAUD 9600
sbit PWM=P1^1; //控制信号输出口定义
uchar a,b,y,i,j,s[4];
/*******************************串口初始化程序********************************/
#include<reg52.h> //52系列单片机头文件
#include<intrins.h> //使用到空指令
/*****************************************************************************/
#define uint unsigned int //用简写符号表示无符号整型数据类型
RI = 0;//清除接收中断标志
REN = 1;//允许串行接收
ES = 1;//允许串行中断
TR2 = 1;//启动定时器1
EA=1;//开总中断
}
/*******************************定时器0中断入口**********************************/
void int3() interrupt 3
{
TR1=0; //关闭定时器1
PWM=1; //改变控制信号状态
}
//*********************************主程序***************************************
void main(void)
{
void R_S_Byte(uchar R_Byte)
{
SBUF = R_Byte;
while( TI == 0 );//查询法
TI = 0;
}
//*********************************串口收到数据****************************************
void UARTRead(void) interrupt 4 //接收上位机发送的控制指令
{
if(RI) //判断接收标志
{
s[i]=SBUF; //接收到的数据放入数组a
}
RI=0;
i++;
if(i==4)
{
i=0;
for(j=0;j<4;j++)
{Байду номын сангаас
R_S_Byte(s[j]);
}
}
}
/***************************定时器1中断入口***************************/
lTmpBaud = FOSC/BAUD;
lTmpBaud /= 32;//12T-mode
iTmpBaud = lTmpBaud & 0xFFFF;
iTmpBaud = 65536 - iTmpBaud;
RCAP2H = (iTmpBaud>>8) & 0x0FF;
RCAP2L = iTmpBaud & 0x0FF;