标题:
基于51单片机的可调PWM波程序
[打印本页]
作者:
森眸暖光
时间:
2017-11-14 18:38
标题:
基于51单片机的可调PWM波程序
#include<reg52.h>
#define uint unsigned int
uint pp;
char num=2,dis;
sbit pwm=P1^0;
sbit s2=P3^4;
sbit s3=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void keyscan()
{
if(s2==0)
{
while(!s2);
num++;
if(num==11)
num=10;
dis=num;
}
if(s3==0)
{
while(!s3);
num--;
if(num==-1)
num=0;
dis=num;
}
}
void display(a)
{
dula=0;
P0=table[a];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
}
void main()
{
TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
TR0=1; //打开定时器
TH0=0Xff; //定时器设置,每隔100微秒发起一次中断。
TL0=0Xa4;
ET0=1; //开定时器0中断
EA=1; //开总中断
while(1)
{
keyscan();
if((num!=0)&&(num!=10)) //对于占空比为0和100%这两种极端情况,最好分离出,单独考虑
{
if(pp<=num)
pwm=1;
else
pwm=0;
}
else if(num==0) //当占空比为0
pwm=0;
else
pwm=1;
if(pp==10) //当占空比为100%
pp=0;
display(num);//显示num当前值,占空比为num/10。
}
}
void time0() interrupt 1
{ TH0=0Xff;
TL0=0Xa4;
pp++;
}
作者:
Strongest丶星空
时间:
2019-4-15 19:13
求程序详解
作者:
虾兵0蟹将
时间:
2020-3-2 22:17
本人初学者,只是个人理解,如有错误请指正
/*-----------------------------------------------
PWM程序
------------------------------------------------*/
#include<reg52.h>
#define uint unsigned int //声明uint为unsigned int类型
uint pp; //中断标号
char num=2,dis; //用于显示PWM的值
sbit pwm=P1^0; //输出端
sbit s2=P3^4; //PWM加
sbit s3=P3^5; //PWM减
sbit dula=P2^6; //段码
sbit wela=P2^7; //位码
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //显示数组
void keyscan() //键盘扫描函数
{
if(s2==0) //s2是否按下
{
while(!s2); //如果s2不为真则等待(s2是否松开)
num++; //num自加1
if(num==11) //如果num等于11(占空比超过100%),则num为10(100%)
num=10;
dis=num;
}
if(s3==0)
{
while(!s3);
num--;
if(num==-1)
num=0;
dis=num;
}
}
void display(a) //显示函数
{
dula=0; //段锁存关闭
P0=table[a]; //显示PWM
dula=1; //段锁存打开
dula=0; //段锁存关闭
wela=0; //位锁存关闭
P0=0xfe; //第一个数码管显示
wela=1; //位锁存打开
wela=0; //位锁存关闭
}
void main()
{
TMOD=0x01; //模式设置,00000001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。
TR0=1; //打开定时器
TH0=0Xff; //定时器设置,每隔100微秒发起一次中断。(设定定时器初始值。高8位,低8位)
TL0=0Xa4;
ET0=1; //开定时器0中断
EA=1; //开总中断
while(1)
{
keyscan(); //开始按键扫描
if((num!=0)&&(num!=10)) //如果占空比在0%到100%之间
{
if(pp<=num) //判断每100ms后与设定的占空比比较
pwm=1; //如果没有达到设定占空比就输出1
else
pwm=0; //达到设定的占空比就输出0
}
else if(num==0) //不在范围内,判断是否占空比为0
pwm=0; //输出为0
else
pwm=1; //输出为1
if(pp==10) //当过了10个100ms后,也就是占空比为100%
pp=0; //周期结束
display(num);//显示num当前值,占空比为num/10。
}
}
void time0() interrupt 1 //中断函数
{ TH0=0Xff; //重新定义中断初始值
TL0=0Xa4;
pp++; //第n+1个100ms
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1