标题:
呼吸灯程序,51单片机模拟PWM输出
[打印本页]
作者:
332405177
时间:
2018-8-17 01:02
标题:
呼吸灯程序,51单片机模拟PWM输出
前段时间写了一个使用51单片机对SG90玩具舵机的连续旋转控制程序。今天突发奇想,将该程序稍作调整,改为呼吸灯控制程序,分享一下,大家可以根据这个程序再做改动,使其更加完善。
呼吸灯的PWM输出引脚为51单片机的P0.0引脚,接发光二极管正极。
QQ图片20180817005009.jpg
(2.71 MB, 下载次数: 40)
下载附件
2018-8-17 01:01 上传
单片机源程序如下:
// 呼吸灯程序,51单片机模拟PWM输出
// 使用单片机STC89C51
// 晶振:11.0592M
// 编译环境 Keil uVision2
////////////////////////////////////////////////
#include <reg52.h>
#define uint unsigned int
uint count,i,j;
sbit pwm=P0^0 ; //信号输出引脚P00
void pwm100us(uint); //20ms周期pwm模型函数,函数变量是0.1ms高电平的整数倍
void delay100ms();
////////////////////////////////////////////////
void main()
{
EA=1; //打开总中断
TMOD=0x10; //定时器工作方式寄存器初始化TMOD=0001 0000B(T1为16位计时模式)
while(1)
{
i=0;
j=199;
for(i=0;i<199;i++) //占空比从100%递减至0
{
pwm100us(i);
}
pwm=1;
delay100ms();
for(j=199;j>0;j--) //占空比从100%递减至0
{
pwm100us(j);
}
pwm=0;
delay100ms();
}
}
//////////////////////////////////////////////
void pwm100us(uint x)
{ uint y;
pwm=1; //输出信号高电平
while(count<x) //下面是单次100us的计时,利用循环函数产生100*x us的高电平
{
TF1=0; //初始化定时器1溢出标记位
TH1=0xff; //初始化定时器1高位寄存器
TL1=0xa4; //初始化定时器1低位寄存器
TR1=1; //定时器1开始计时
while(TF1==0); //等待定时器1溢出
count++;
}
count=0;
y=(200-x); //给出y与x的关系
pwm=0; //输出信号低电平
while(count<y)
{
TF1=0;
TH1=0xff;
TL1=0xa4;
TR1=1;
while(TF1==0);
count++;
}
count=0;
}
/////////////////////////////////////////////
void delay100ms()
{
unsigned char a,b;
for(b=221;b>0;b--)
for(a=207;a>0;a--);
}
复制代码
所有资料51hei提供下载:
呼吸灯hex文件和C程序.zip
(1.36 KB, 下载次数: 64)
2018-8-17 00:59 上传
点击文件名下载附件
呼吸灯hex文件和C程序.zip
下载积分: 黑币 -5
作者:
1277290131
时间:
2019-9-9 18:54
能发一下仿真图吗?谢谢。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1