前段時間寫了一個使用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
|