📄 pwmkeilc51.txt
字号:
-----------------------------------------------------------------*/
#include
//#include
#include
/*------------------------------------------------
AT89S5X SFR定义(REGX52.h中未定义)
--------------------------------------------------*/
sfr AUXR = 0x8e;
sfr WDTRST = 0xa6;
sfr16 TIMEER2 = 0xcc;
sfr16 RCAP2 = 0xca;
/*-----------------------------------------------
PWM管脚定义
------------------------------------------------*/
sbit PWM = P1^0;//可以为任意IO管脚
typedef struct Systemstruct{//系统数据结构
unsigned int PwmCount;//700~2300uS
unsigned int RamTest;//内部ram自检变量
/*--------------------------------------------------------------------
注意将STARTUP.A51中的IDATALEN改写为0,RamTest才能完成MCU掉电自检。
IDATALEN EQU 00H ; the length of IDATA memory in bytes.
---------------------------------------------------------------------*/
}SystemData;//系统数据结构(此时只是定义了一个新的数据类型SystemData)
//全局变量定义(全局结构)
SystemData SystemBuffers;//申请系统数据结构缓冲区
#define T2_20mS -20000 //MCU主频12MHz,12分频,T2_20mS=20MS
/*----------------------------------------------------------------------
系统函数
-----------------------------------------------------------------------*/
void MainInit(void);//系统初始化
void ClrWdt(void);//喂狗
void SystemInit(void);//系统初始化
void SystemSetup(void);//系统设置
void SystemIoInit(void);//系统接口初始化
void UserSetup(void);//用户运行环境设置
void TimeInit(void);//定时器定时参数初始化
/*-----------------------------------------
主程序初始化
-------------------------------------------*/
void MainInit(void)//系统初始化
{
SystemIoInit();//系统接口初始化
ClrWdt();//清除看门狗计数器
if (SystemBuffers.RamTest != 0x55aa) {//内存测试
SystemInit();//系统上电初始化
}
SystemSetup();//系统运行环境设置
UserSetup();//用户运行环境设置
}
void SystemInit(void)//系统初始化
{
SystemBuffers.RamTest = 0x55aa;//内存初始化
}
void SystemSetup(void)//系统设置
{
AUXR = 0x01;//关闭EMI
TimeInit();//定时器定时参数初始化
IP = 0x20;//中断优先级ET2
}
void UserSetup(void)//用户运行环境设置
{
/*--------------------------------------------
在此加入用户运行环境设置代码
----------------------------------------------*/
}
void SystemIoInit(void)
{
IE = 0x00;//关闭中断
P0 = 0xff;//P0口初始化
P1 = 0xfe;//P1口初始化,PWM=0
P2 = 0xff;//P2口初始化
P3 = 0xff;//P3口初始化
}
void TimeInit()
{
/*----------------------------------
定时器0定时参数设置
----------------------------------*/
TL0 = 0;
TH0 = 0;
// TR0 = 1;//启动定时器0
/*----------------------------------
定时器1定时参数设置
----------------------------------*/
TL1 = 0xfd;
TH1 = 0xfd;
PCON = 0x00;//SMOD_=0,GF0_=0;//清除疯狗标志
// TR1 = 1;//启动定时器1
/*----------------------------------
定时器2定时参数设置
----------------------------------*/
TIMEER2 = T2_20mS;//上电20mS后PWM开始工作
PWM = 0;//上电后无PWM信号
SystemBuffers.PwmCount = 700;//首次PWM脉宽为700uS
RCAP2 = 0 - SystemBuffers.PwmCount;//首次PWM脉宽为700uS
TR2 = 1;//启动定时器2(上电后20mS内PWM信号为低电平)
/*----------------------------------
定时器参数设置
----------------------------------*/
TMOD = 0x22;//定时方式(8位自动装载)
}
/*---------------------------------------------------------------------
外部INT0中断服务程序(PWM+10uS)
----------------------------------------------------------------------*/
void int0proc() interrupt IE0_VECTOR using 2
{
/*---------------------------------------------------------------------
用户只能改写全局变量SystemBuffers.PwmCount,不能改写静态变量PwmCount
----------------------------------------------------------------------*/
if (SystemBuffers.PwmCount <= 2290) //PWM高电平脉宽上界-10
SystemBuffers.PwmCount += 10;//递增未越界
else
SystemBuffers.PwmCount = 700;//递增越界翻到下界
}
/*---------------------------------------------------------------------
定时器T0中断服务程序
----------------------------------------------------------------------*/
void t0proc() interrupt TF0_VECTOR using 2
{
if (PCON & GF0_) {//中断是从主循环内跳入的才能喂狗
ClrWdt();//清除看门狗计数器
PCON &= ~GF0_;//清除疯狗标志
}
}
/*---------------------------------------------------------------------
外部INT1中断服务程序(PWM-10uS)
----------------------------------------------------------------------*/
void int1proc() interrupt IE1_VECTOR using 2
{
/*---------------------------------------------------------------------
用户只能改写全局变量SystemBuffers.PwmCount,不能改写静态变量PwmCount
----------------------------------------------------------------------*/
if (SystemBuffers.PwmCount > 700) //PWM高电平脉宽下界
SystemBuffers.PwmCount -= 10;//递减未越界
else
SystemBuffers.PwmCount = 2300;//递减越界翻到上界
}
/*------------------------------------
定时器T1中断服务程序
------------------------------------*/
void t1proc() interrupt TF1_VECTOR using 2
{
/*--------------------------------------------
在此加入用户代码(与串口复用T1)
----------------------------------------------*/
}
/*------------------------------------
串口SIO中断服务程序
------------------------------------*/
void sioproc() interrupt SIO_VECTOR using 2
{
if (RI) {//接收中断
RI = 0;
/*--------------------------------------------
在此加入用户串口接收代码
----------------------------------------------*/
}
if (TI) {//发送中断
TI = 0;
/*--------------------------------------------
在此加入用户串口发送代码
----------------------------------------------*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -