求16个流水灯程序,有模式还可以调节快慢的,急求,谢谢。

求16个流水灯程序,有模式还可以调节快慢的,急求,谢谢。,第1张

《基于8051+Proteus仿真》案例

第01 篇基础程序设计

01    闪烁的LED

/*    名称:闪烁的LED

说明:LED按设定的时间间隔闪烁

*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit LED=P1^0

//延孝友时

void DelayMS(uint x)

{

uchari

while(x--)

{

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

}

}

//主程序

void main()

{

while(1)

{

LED=~LED

DelayMS(150)

}

}

02  从左到右的流水灯

/*    名称:从左到右的流水灯

说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果

*/

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

//延时

void DelayMS(uint x)

{

uchari

while(x--)

{

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

}

}

//主程序

void main()

{

P0=0xfe

while(1)

{

P0=_crol_(P0,1)//P0的值向左循环移动

DelayMS(150)

}

}

03  8只LED左右来回点亮

/*    名称:8只LED左右来回点亮

说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果

*/

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

//延时

void DelayMS(uint x)

{

uchari

while(x--)

{

for(i=0i<薯帆120i++)

}

}

//主程序

void main()

{

uchari

P2=0x01

while(1)

{

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

{

P2=_crol_(P2,1)//P2的值向左循环移动

DelayMS(150)

}

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

{

P2=_cror_(P2,1)//P2的值向右循环移动

DelayMS(150)

}

}

}

04  花样流水灯

/*    名称:巧手槐花样流水灯

说明:16只LED分两组按预设的多种花样变换显示

*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar code Pattern_P0[]=

{

0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,

0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,

0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,

0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,

0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,

0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff

}

uchar code Pattern_P2[]=

{

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,

0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,

0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,

0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,

0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,

0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff

}

//延时

void DelayMS(uint x)

{

uchari

while(x--)

{

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

}

}

//主程序

void main()

{

uchari

while(1)

{     //从数组中读取数据送至P0和P2口显示

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

{

P0=Pattern_P0[i]

P2=Pattern_P2[i]

DelayMS(100)

}

}

}

05  LED模拟交通灯

/*    名称:LED模拟交通灯

说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。

*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0   //东西向灯

sbit YELLOW_A=P0^1

sbit GREEN_A=P0^2

sbit RED_B=P0^3   //南北向灯

sbit YELLOW_B=P0^4

sbit GREEN_B=P0^5

uchar Flash_Count=0,Operation_Type=1//闪烁次数, *** 作类型变量

//延时

void DelayMS(uint x)

{

uchari

while(x--)for(i=0i<120i++)

}

//交通灯切换

void Traffic_Light()

{

switch(Operation_Type)

{

case1:     //东西向绿灯与南北向红灯亮

RED_A=1YELLOW_A=1GREEN_A=0

RED_B=0YELLOW_B=1GREEN_B=1

DelayMS(2000)

Operation_Type=2

break

case2:     //东西向黄灯闪烁,绿灯关闭

DelayMS(300)

YELLOW_A=~YELLOW_AGREEN_A=1

if(++Flash_Count!=10)return//闪烁5次

Flash_Count=0

Operation_Type=3

break

case3:     //东西向红灯,南北向绿灯亮

RED_A=0YELLOW_A=1GREEN_A=1

RED_B=1YELLOW_B=1GREEN_B=0

DelayMS(2000)

Operation_Type=4

break

case4:     //南北向黄灯闪烁5次

DelayMS(300)

YELLOW_B=~YELLOW_BGREEN_B=1

if(++Flash_Count!=10)return

Flash_Count=0

Operation_Type=1

}

}

//主程序

void main()

{

while(1)Traffic_Light()

}

06  单只数码管循环显示0~9

/*    名称:单只数码管循环显示0~9

说明:主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示

*/

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}

//延时

void DelayMS(uint x)

{

uchart

while(x--)for(t=0t<120t++)

}

//主程序

void main()

{

uchari=0

P0=0x00

while(1)

{/* for(i<11i++){ P0=~DSY_CODE[i]DelayMS(300)}  //注:另一方案 */

P0=~DSY_CODE[i]

i=(i+1)%10

DelayMS(300)

}

}

07  8只数码管滚动显示单个数字

/*    名称:8只数码管滚动显示单个数字

说明:数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管

*/

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

//延时

void DelayMS(uint x)

{

uchart

while(x--)for(t=0t<120t++)

}

//主程序

void main()

{

uchari,wei=0x80

while(1)

{

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

{

P2=0xff   //关闭显示

wei=_crol_(wei,1)

P0=DSY_CODE[i]  //发送数字段码

P2=wei           //发送位码

DelayMS(300)

}

}

}

08  8只数码管动态显示多个不同字符

电路如上图

/*    名称:8只数码管动态显示多个不同字符

说明:数码管动态扫描显示0~7。

*/

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

//延时

void DelayMS(uint x)

{

uchart

while(x--)for(t=0t<120t++)

}

//主程序

void main()

{

uchari,wei=0x80

while(1)

{

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

{

P2=0xff

P0=DSY_CODE[i]  //发送段码

wei=_crol_(wei,1)

P2=wei           //发送位码

DelayMS(2)

}

}

}

09  8只数码管闪烁显示数字串

电路如上图

/*    名称:8只数码管闪烁显示数字串

说明:数码管闪烁显示由0~7构成的一串数字

  本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。

*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

//段码表

uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

//位码表

uchar codeDSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}

//延时

void DelayMS(uint x)

{

uchart

while(x--)for(t=0t<120t++)

}

//主程序

void main()

{

uchari,j

while(1)

{

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

{

for(j=0j<8j++)

{

P0=0xff

P0=DSY_CODE[j]  //发送段码

P2=DSY_IDX[j]    //发送位码

DelayMS(2)

 }

}

P2=0x00        //关闭所有数码管并延时

DelayMS(1000)

}

}

10  8只数码管滚动显示数字串

电路如上图

/*    名称:8只数码管滚动显示数字串

说明:数码管向左滚动显示3个字符构成的数字串

*/

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

//段码表

uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}

//下面数组看作环形队列,显示从某个数开始的8个数(10表示黑屏)

uchar Num[]={10,10,10,10,10,10,10,10,2,9,8}

//延时

void DelayMS(uint x)

{

uchart

while(x--)for(t=0t<120t++)

}

//主程序

void main()

{

uchari,j,k=0,m=0x80

while(1)

{     //刷新若干次,保持一段时间的稳定显示

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

{

for(j=0j<8j++)

{     //发送段码,采用环形取法,从第k个开始取第j个

P0=0xff

P0=DSY_CODE[Num[(k+j)%11]]

m=_crol_(m,1)

P2=m      //发送位码

DelayMS(2)

 }

}

k=(k+1)%11  //环形队列首支针k递增,Num下标范围0~10,故对11取余

}

}

11  K1-K4 控制LED移位

/*    名称:K1-K4 控制LED移位

说明:按下K1时,P0口LED上移一位;

  按下K2时,P0口LED下移一位;

  按下K3时,P2口LED上移一位;

  按下K4时,P2口LED下移一位;

*/

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

//延时

void DelayMS(uint x)

{

uchari

while(x--)for(i=0i<120i++)

}

//根据P1口的按键移动LED

void Move_LED()

{

if     ((P1&0x10)==0) P0=_cror_(P0,1)  //K1

elseif((P1&0x20)==0) P0=_crol_(P0,1)     //K2

elseif((P1&0x40)==0) P2=_cror_(P2,1) //K3

elseif((P1&0x80)==0) P2=_crol_(P2,1)     //K4

}

//主程序

void main()

{

ucharRecent_Key//最近按键

P0=0xfe

P2=0xfe

P1=0xff

Recent_Key=0xff

while(1)

{

if(Recent_Key!=P1)

{

Recent_Key=P1      //保存最近按键

Move_LED()

DelayMS(10)

}

}

}

就下面的程序

----- 延时子程序 -----

DELAY: MOV R0,#255 延时一扰姿段时间

D1: MOV R1,#20

DJNZ R1,$

DJNZ R0,D1

RET 子程序返回

END 程序结束

来说,想要让流水灯变慢点的话,就增加延告含时。这里将第二行指令D1: MOV R1,#20中的20改大,但是要小袜李笑于256.比如D1: MOV R1,#200

如果想要流水灯快点的话,就是要减少延时时间。这里将第二行指令D1: MOV R1,#20中的20改小,但是一定要大于等于零。比如D1: MOV R1,#2

//用两个按键控制16个流水灯的流速 要求共8个流动速度

#include<reg52.h>

void delay(unsigned char k) //延时函数

{

unsigned char i,j //定义两个变量,用于空循环

k=k*8

for(i=0i<ki++)

  for(j=0j<255j++)

 

}

unsigned char flag

void main()

{

unsigned char i

flag=1

EA=1  //开放总中断

 EX0=1 //允许使用外中断

 IT0=1 //选择负跳变来迹贺触发外中断

 EX1=1 //允许使用外中断

 IT1=1 //选择负跳变拆州谨来触发外中断

while(1)   //用于反复循环

{

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

  {

 P1=~(1<<i)    

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

 //while(flag!=1)

}

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

  {

 P2=~(1<<i)    

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

 //while(flag!=1)

}

  i=0

  //

}

}

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

函数功能:外中断T0的中断服务程序

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

void int0(void) interrupt 0 using 0 //用于减小流水灯旅基速度

{

if(flag<9)

  flag++

}

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

函数功能:外中断T0的中断服务程序

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

void int1(void) interrupt 2 using 0 //用于增加流水灯速度

{

if(flag>1)

  flag--

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存