求89c52 8位双向流水灯程序,各种花样显示,急急急!

求89c52 8位双向流水灯程序,各种花样显示,急急急!,第1张

我自己写的LED花样闪烁程序,请参考。

/*----------------------------------------------------------

按键S2、S3为LED灯闪动花样侍册选择键(S2、S3选择顺序相反,可循环),

S4、S5为闪动速度选择键(按S4加速、S5减速),启动后默认按花样

1(单个灯从左到右循环)闪动。闪动间隔有50、100、200、400、

800ms可选。

-----------------------------------------------------------*/

#include <REGX52.H>

#include <intrins.h>

#include <stdlib.h>

#define uchar unsigned char

#define uint unsigned int

sbit s2=P3^4 //定义四个按键

sbit s3=P3^5

sbit s4=P3^6

sbit s5=P3^7

uchar mod,modnum,p1_val,speed,keyflag,num0,num,l_r,state

/*---------------------变量含义----------------------------

mod:闪动花样代码; modnum:共有几种闪动花样;

p1_val:用于赋初值; speed:标记闪动速度衫谈拦;

keyflag:花样按键按下标记; num0:计算延时几个50ms;

num:花样内其他计数用; l_r:标记闪动方向

state:标记花样变化状态 t0num:T0中断次数

----------------------------------------------------------*/

uchar code mod4[]={ //用于花样4

0x7e,0xbd,0xdb,0xe7}

/*-----------------------延时子函数-----------------------*/

void delayxms(uint x)

{

uint i,j

for(i=xi>0i--)

for(j=110j>0j--)

}

/*-----------------------按键子函数-----------------------*/

void keyscan()

{

if(s2==0) //检测按键S2

{

delayxms(10) //防抖延时

if(s2==0)

{

keyflag=1 //花样按键按下时,标记状态为1

mod++ //闪动花样标志+1

if(mod>modnum) //设置花样循环选择

mod=1

num0=0

}

while(!s2) //等待按键释放

}

if(s3==0) //检测按键S3

{

delayxms(10)

if(s3==0)

{

keyflag=1

mod-- //闪动花样标志-1

if(mod<1)

mod=modnum

num0=0

}

while(!s3)

}

if(s4==0) //检测按键S4

{

delayxms(10)

if(s4==0)

{

speed/=2 //提高闪动速度

if(speed<1)

speed=1

}

while(!s4)

}

if(s5==0) /或胡/检测按键S5

{

delayxms(10)

if(s5==0)

{

speed*=2 //降低闪动速度

if(speed>16)

speed=16

}

while(!s5)

}

}

/*-----------------------初始化函数-----------------------*/

void init()

{

modnum=6 //用于修改共有几种闪动花样

mod=1 //启动按花样1闪动

speed=16 //启动按最慢速度闪动

keyflag=1 //启动后默认标志为1

EA=1 //开总中断

ET0=1 //开T0中断

TMOD=0x01 //设置T0为16位定时器

TH0=(65536-50000)/256 //赋初值50ms

TL0=(65536-50000)%256

TR0=1 //启动T0

}

/*-------------------------主函数-------------------------*/

void main()

{

init()

while(1)

{

keyscan() //一直扫描按键

switch(mod) //根据花样标志值选择闪动花样

{

/*-----------------【1】循环左移流水灯--------------------*/

case 1:

if(keyflag) //当花样按键按下时重置P1口、

{ //花样按键标志状态

keyflag=0

P1=0xfe

}

if(num0>=speed) //延时到达选定的时间时,变化LED状态

{

num0=0 //清零延时计数值

P1=_crol_(P1,1) //循环左移

}

break

/*-----------------【2】循环右移流水灯--------------------*/

case 2:

if(keyflag)

{

keyflag=0

P1=0x7f

}

if(num0>=speed)

{

num0=0

P1=_cror_(P1,1) //循环右移

}

break

/*---------------【3】1357和2468交替闪烁------------------*/

case 3:

if(keyflag)

{

keyflag=0

P1=0xaa

}

if(num0>=speed)

{

num0=0

P1=~P1 //交替闪烁

}

break

/*-----------------【4】两边合拢再散开--------------------*/

case 4:

if(keyflag)

{

keyflag=0

num=0

l_r=0 //用于指示灯变化的方向

}

if(num0>=speed&&l_r==0)

{

num0=0

P1=mod4[num]

num++

if(num==3)

l_r=1

}

if(num0>=speed&&l_r==1)

{

num0=0

P1=mod4[num]

num--

if(num==0)

l_r=0

}

break

/*-------【5】逐个点亮,全亮后反向逐个熄灭,左右循环-------*/

case 5:

if(keyflag)

{

keyflag=0

p1_val=0xfe

num=0

l_r=0

}

if(state==0)

{

if(num0>=speed&&l_r==0) //从左到右逐个点亮

{

num0=0

P1=p1_val

p1_val<<=1

if(p1_val==0)

l_r=1

}

if(num0>=speed&&l_r==1) //全亮后从右到左逐个熄灭

{

num0=0

P1=p1_val

num++

switch(num)

{

case 1:

p1_val=0x80

break

case 2:

p1_val=0xc0

break

case 3:

p1_val=0xe0

break

case 4:

p1_val=0xf0

break

case 5:

p1_val=0xf8

break

case 6:

p1_val=0xfc

break

case 7:

p1_val=0xfe

break

case 8:

p1_val=0xff

break

}

if(p1_val==0xff)

{

state=1

l_r=0

p1_val=0x7f

num=0

}

}

}

else

{

if(num0>=speed&&l_r==0) //从右到左逐个点亮

{

num0=0

P1=p1_val

p1_val>>=1

if(p1_val==0)

l_r=1

}

if(num0>=speed&&l_r==1) //全亮后从左到右逐个熄灭

{

num0=0

P1=p1_val

num++

switch(num)

{

case 1:

p1_val=0x01

break

case 2:

p1_val=0x03

break

case 3:

p1_val=0x07

break

case 4:

p1_val=0x0f

break

case 5:

p1_val=0x1f

break

case 6:

p1_val=0x3f

break

case 7:

p1_val=0x7f

break

case 8:

p1_val=0xff

break

}

if(p1_val==0xff)

{

state=0

l_r=0

p1_val=0xfe

num=0

}

}

}

break

/*-----------------------T0中断函数-----------------------*/

void time0() interrupt 1 //延时50ms

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

num0++ //延时计数值

}

把定时器设置成50ms一次定时中断,作为时间基准,在定时中断里再每次对一个变量计数加加得到想要的0.5秒和2秒时间基准 define uint unsigned int //定义无符号整数 void delay(uint)//声明延时函数 void main(void){ uint iuchar tempwhile(1){ temp=0xFEfor(i=0i<8i++) //8个流水灯依次全部点亮 { P1=tempdelay(500...

用定时器实现流水灯从左到右双位循环,跳动频率为1秒。程序怎么编啊... —— 用定时器实现流水灯,跳动频率为1秒。用定时器定时50ms,采用中断皮族没方式,对定时中断计数,计数20次就是1秒。如下仿真图,P1口接8个LED灯。

有关于单片机的一段程序,是用定时器做流水灯的 —— 要用定时器 就得用定时器中断。。至于全亮的原因 是因为 delay1s 没有起到延时1s的作用 二十极其短的延时燃纳 导致流水灯太快 给人感觉是全亮的。。你可以改成 long a while(a<500000)(值大小自己调试)...

如何用定时器中断实现流水灯1秒定时流水? —— 可以中断50ms一次(不一定非要50ms),每次中断计数一次,等计数时间到1s,就执行一次流水动作

求助,用定时器控制流水灯循环 —— 将定时器中断时间设置为一秒一次。声明一个全局的变量temp 在初始化的时候赋初值,在中断服务函数中

用定时器控制16路流水灯循环单片机,且定时时间可调,谢谢! —— interrupt1{uchari//循环变量//重装定时器初值,50ms中断一次p++if(p>=20)//一秒钟改变一次状态{for(i=0i<8i++){P1=temptemp<<=1//左移一位,流水灯}p=0}}呵呵,这就是简单穗陪的后台任务处理思想 ...

51单片机定时器实现流水灯,并用按键外部中断控制改变流水灯的流向,这个... —— EA=1;//开总中断 EX0=1;//开外部中断0 IT0=1;//下降沿触发 while(1){ if(flag==0){ for(i=0i<8i++){ P0=0X01<<idelayms(500)} } if(flag==1){ for(i=0i<8i++){ P0=0X80...

51单片机用定时器,怎么编程流水灯一秒闪烁一次, —— 先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序 ...

plc怎么用计时器做3个流水灯程序 —— 计数器,定时器……用计数器,就数值1点亮一个,2点亮一个,3点亮一个,加完复位,加个循环;定时器,定时一秒,二秒,三秒,每个对应一个灯,加个循环


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

原文地址: http://outofmemory.cn/yw/12513482.html

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

发表评论

登录后才能评论

评论列表(0条)

保存