前段时间写了一个使用51单片机对SG90玩具舵机的连续旋转控制程序。今天突发奇想,将该程序稍作调整,改为呼吸灯控制程序,分享一下,大家可以根据这个程序再做改动,使其更加完善。
呼吸灯的PWM输出引脚为51单片机的P0.0引脚,接发光二极管正极。
单片机源程序如下:
- // 呼吸灯程序,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, 下载次数: 63)
|