实验原理及内容:
【实验要求】
利用定时器的方式生成PWM,通过两个按键控制占空比,这两个按键由定时器中断实现,按下按键1,占空比变大,按下按键2,占空比变小。
1.新建一个文件夹,以名字拼音命名,将工程放到文件夹内。
2.画出仿真图,做出仿真效果。
【实验原理】
1.对IO口进行相应的硬件连接,通过判断相应的IO口电平是否被拉高来确定按键是否被按下,当按键按下时根据按键的按键执行相应的程序。
2.原理图
3.程序设计思路
(1)硬件部分原理
按键一端接地,一端接入IO口,当IO口无输入时默认为低电平,按键按下后IO口电平被拉高,其相应寄存器位会变1,通过判断相应位是否为1来确定按键是否被按下。PWM的输出端接另一IO口。
(2)软件部分原理
①首先定义两个按键的位置分别为P2.0、P2.1通过这两个按键来调节占空比,通过定时器T0来生成PWM信号,PWM的输出接P1.0,另外定义一个变量temp来存储占空比。
②设置定时器T0为模式1,16位定时器,设置定时器的初值为0xFF,以实现最大的计数范围,启动定时器。
③判断按键1是否按下,如果按下了则占空比temp增加,每按下一次按键1,按键1都会在原来的基础上增加10%,即通过temp+=10来实现,如果占空比增加到了100%,就让它保持在100%;判断按键2是否按下,如果按下了则占空比temp减小,每按下一次按键2,按键2都会在原来的基础上减小10%,即通过temp-=10来实现,如果占空比减到了0%,就让它保持在0。
④最后通过占空比的值与T0的值来控制PWM输出引脚的状态,当定时器T0的值小于占空比的值,那么PWM就输出高电平,否则输出低电平。
主程序流程
步骤1)未按下按键时,输出占空比为50%的PWM
步骤2)判断按键1是否按下,若按键1按下,则占空比增加10% ,占空比大于100,保持在100。
步骤3)判断按键2是否按下,若按键2按下,则占空比减小10% ,占空比减到0,则保持在0。
【实验内容与步骤】
一、程序注释
```
#include <reg51.h>
sbit PWM_OUT=P1^0; // 定义PWM输出引脚为P1.0
sbit key1=P2^0; //定义按键1引脚为P2.0
sbit key2=P2^1; /定义按键2引脚为P2.1
unsigned int temp=50; // 初始占空比为50%
void delay(unsigned int ms)// 延时函数
{
unsigned int i, j;
for(i=0;i<ms;i++)
{
for(j=0;j<1000;j++)
{
}
}
}
void main()
{
TMOD=0x01; //设置定时器T0为模式1,16位定时器
TH0=0xFF; //设置定时器初值
TL0=0xFF;
TR0=1; //启动定时器
while(1)
{
if(key1==0) //检测按键1是否按下
{
delay(10); //延时消除抖动
temp+=10; //每按一次按键占空比增加10
if(temp>100) //若占空比大于100
{
temp=100; //占空比保持在100
}
}
if(key2==0) //检测按键2是否按下
{
delay(10); //延时一段时间,用于消除按键抖动
temp-=10; //每按一次按键占空比减小10
if(temp<0) //若占空比等于100
{
temp=0; //占空比保持在0
}
}
if(TH0<temp)//生成PWM信号
{
PWM_OUT=1;
}
else
{
PWM_OUT=0;
}
}
}
```
二、仿真和现象分析
初始状态
按下按键1增加占空比
按下按键2减小占空比
占空比增加到100
占空比减小到0