您的当前位置:首页正文

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

来源:画鸵萌宠网


#include //52系列单片机头文件

#include // 使用到空指令

/*****************************************************************************/

#define uint unsigned int //用简写符号表示无符号整型数据类型

#define uchar unsigned char //简写符号表示无符号字符型数据类型

#define FOSC 12000000 //晶振大小值设定,便于计算波特率

#define BAUD 9600

sbit PWM=P1^1; //控制信号输出口定义

uchar a,b,y,i,j,s[4];

/*******************************串口初始化程序********************************/

void InitUART(void)

{

unsigned int iTmpBaud;

unsigned long lTmpBaud;

iTmpBaud = 0;

//首先选定定时器2作为波特率发生器,16位定时器,自动装载

SCON = 0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI 0 0 0

//0 1 0 1 0

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; // / / / / / / T2OE DCEN //0 0 0 0 0 0 0 0*/

lTmpBaud = FOSC/BAUD;

lTmpBaud /= 32; //12T-mode

iTmpBaud = lTmpBaud & 0xFFFF;

iTmpBaud = 65536 - iTmpBaud;

RCAP2H = (iTmpBaud>>8) & 0x0FF;

RCAP2L = iTmpBaud & 0x0FF;

RI = 0; //清除接收中断标志

REN = 1; //允许串行接收

ES = 1; //允许串行中断

TR2 = 1; //启动定时器1

EA=1;//开总中断

}

/*******************************定**********************************/

void int0() interrupt 1 周期

{

时器 0中断入口

//生成PWM控制信号脉冲

TL0=0x18;

TH0=0xfc;

PWM=0; //输出高电平

TH1=a;

//设置定时器1初值

TL1=b;

TR1=1;

//开启定时器1

}

//************************************通过串口将接收到数据发送给**************************************

void R_S_Byte(uchar R_Byte)

{

SBUF = R_Byte;

PC端

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中断入口***************************/

void int3() interrupt 3

{

TR1=0; //关闭定时器1

PWM=1; //改变控制信号状态

}

//*********************************主程序***************************************

void main(void)

{

InitUART();

TMOD=0x11;

TL0=0x18;

TH0=0xfc;

EA=1;

ET0=1;

ET1=1;

TR0=1;

while(1)

{

a=(65536-s[0]*10)/256; 电平初值

b=(65536-s[0]*10)%256;

}

}

//定时器生成PWM占空比高

因篇幅问题不能全部显示,请点此查看更多更全内容

Top