求52单片机流水灯程序

求52单片机流水灯程序,第1张

//单片机流水灯程序,是学习单片机的最简单的程序。

//流水灯

#include <REG51.h> //51头文件

#define DY_PORT P1 //设置LED连接的I/O组

#define DY_SPEED  100 //设置每一个明亮级的停留时间(竖洞值域:0~65535)

void delay (unsigned int a){ // 1ms延时程序

unsigned int i

while( --a != 0){

for(i = 0i <600i++)

}    

}

void main(void){

unsigned int i

unsigned int temp

while(1){

temp=0x01

for(i=0i<8i++){ //8个流水灯逐个闪动

DY_PORT=~temp

delay(DY_SPEED)  //调用延时函数稿蠢

temp<<=1

}

temp=0x80

for(i=0i<8i++){ //8个流水灯反向逐个闪动

DY_PORT=~temp

delay(DY_SPEED)  //调用延时函数

temp>>=1

}

temp=0xFE

for(i=0i<8i++){ //8个流水灯依次全部点亮

DY_PORT=temp

delay(DY_SPEED)  //调用延时函数

temp<<=1

}

temp=0x7F

for(i=0i<8i++){ //8个流水灯依次反向键纤陪全部点亮

DY_PORT=temp

delay(DY_SPEED)  //调用延时函数

temp>>=1

}

}

}

最好用PWM,通过调节占空比来实现,我这里有现成的一个程序发给你!#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED = P1^2 //定义LED灯,通过LED显示调光效果

unsigned char CYCLE //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms

unsigned char PWM_ON //定义高电平时间

/******************************************************************/

/*延时函数*/

/******************************************************************/

void delay(unsigned int cnt)

{

while(--cnt)

}

/******************************************************************/

/*主函数 */

/******************************************************************/

main()

{

bit FlagTMOD |=0x01 //定时器设置宏没 0.1ms in 12M crystal

TH0=(65536-100)/256

TL0=(65536-100)%256 //定时0.1mS

IE= 0x82//打开中断

TR0=1CYCLE = 10 // 时间可以调整 这个是10调整 8位PWM就是256步

while(!Flag)

{

delay(20000) //延时时间,从一个磨绝判亮度到下一个亮度的间隔时间,速度快就能看到连续效果

PWM_ON++ //这个使用较长延时,以便能看清楚变化过程

if(PWM_ON == CYCLE)

{//这个里可以添加其他程序 如到最亮时候控制设备

Flag=1

}

} while(Flag) //亮度递减 同上,是个相反的过程

{

delay(20000)

PWM_ON--

if(PWM_ON == 0)

{

Flag=0

}

}

}

/******************************************************************/

/*定时器中断函数 */

/******************************************************************/

void tim(void) interrupt 1 using 1

{

static unsigned char count

TH0=(65536-100)/256

TL0=(65536-100)%256//定时0.1mS if (count==PWM_ON)

{

LED = 1 //灯灭

}

count++

if(count == CYCLE)

{

count=0

if(PWM_ON!=0)//如果左右时间是0 保持原瞎改来状态

LED = 0 //灯亮}}有什么不明白的可以问我!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12552345.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存