单片机流水灯C语言程序(8个灯,依次点亮每个灯,延时500MS)
单片机流水灯C语言程序的源代码如下:
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i8;i++) //8个流水灯逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp=1;
}
temp=0x80;
for(i=0;i8;i++) //8个流水灯反向逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp=1;
}
temp=0xFE;
for(i=0;i8;i++) //8个流水灯依次全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp=1;
}
temp=0x7F;
for(i=0;i8;i++) //8个流水灯依次反向全部点亮
{
P1=temp;
delay(100); //调用延时函数
temp=1;
}
void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt255;bt++);
}
扩展资料
51单片机流水灯的源代码如下
#includereg51.h
#includeintrins.h
void delay(int a)
{
int i;
while(a--)for(i=0;i110;i++);
}
main()
{
int i;
while(1)
{
P0=0xfe;
for(i=0;i8;i++)
{
P0=_crol_(P0,1);
delay(500);
}
}
}

51单片机从中间到两边逐个点亮再从两边到中间逐个点亮程序?
这个流水灯程序最好用数组定义8个状态的灯,这样用for循环就可以实现了。简洁明了,易读性强,也容易理解。
#includereg51.h
#define uchar unsigned char
code uchar ledtab[10]=
{
0xff,0xe7,0xc3,0x81,0x00, //中间开始逐渐点亮
0xff,0x7e,0x3c,0x18,0x00 //两边开始逐渐点亮
}
void delay(int ms)
{
uchar i;
while(ms--)for(i=0;i120;i++);
}
main()
{
uchar i;
while(1)
{
for(i=0;i10;i++)P1=ledtab[i];
delay(1000);
}
}
51单片机流水灯从两边向中间亮代码
#include reg52.h
#define uchar unsigned char
#define uint unsigned int
uchar TS_Count,TM_Count,TH_Count,count_N;
sbit LED_H=P3^0;
sbit LED_M=P3^1;
sbit LED_S=P3^2;
void DelayMS(uint x) //延时函数
{
uchar t;
while(x--)
{
for(t=120;t0;t--);
}
}
void dis_time(uchar H_t,uchar M_t,uchar S_t)
{ uchar i;
uchar code DSY_CODE[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,
}; //定义数码管显示0~9的控制码
uchar code PS_CODE[]={0x01,0x02,0x04,0x08,0x010,0x20,0x40,0x80}; //这是数码管第n位的控制码
//以下几行是给每一个要显示的数码管赋值
uchar dis_bit[8];
dis_bit[0]=H_t/10%10; //千位
dis_bit[1]=H_t%10; //百位
dis_bit[2]=10; //十位
dis_bit[3]=M_t/10%10;
dis_bit[4]=M_t%10; //千位
dis_bit[5]=10; //百位
dis_bit[6]=S_t/10%10; //十位
dis_bit[7]=S_t%10;
for(i=0;i8;i++)
{
P2=PS_CODE[i]; //第i个数码管的位控制字
P0=DSY_CODE[dis_bit[i]]; //第i个数码管的段码控制字
DelayMS(5); //延时5毫秒。
}
}
void disp_mode(uchar mode_1) //这个函数控制三个LED灯
{
switch(mode_1)
{ case 0: //模式0,全灭
LED_H=1;
LED_M=1;
LED_S=1;
TR0 = 1;
break;
case 1: //模式1,LED_S亮
LED_H=1;
LED_M=1;
LED_S=0;
TR0 = 0;
break;
case 2: //模式2,LED_M亮
LED_H=1;
LED_M=0;
LED_S=1;
TR0 = 0;
break;
case 3: //模式3,LED_H亮
LED_H=0;
LED_M=1;
LED_S=1;
TR0 = 0;
break;
}
}
uchar Key_code() //这个函数检测按键
{
uchar Key_NO;
if(P1==0xfe) //P1.0按键返回键值0
{Key_NO=0;}
if(P1==0xfd) //P1.1按键返回键值1
{Key_NO=1;}
if(P1==0xfb) //P1.2按键返回键值2
{Key_NO=2;}
while(P1!=0xff); //等待按键释放,源程序有点错误需要加分号;
return Key_NO;
}
void main()
{uchar y=-1;
uchar mode_N=0;
TMOD=0X00; //定义定时器工作在模式0,13位定时器模式
TH0=(8192-5000)/32; //赋初值
TL0=(8192-5000)%32;
IE=0X82; //开启定时器中断和总中断
TR0=1; //启动定时器
while(1)
{
if(P1!=0xff) //等待按键,如果有按键按下,获取键值
y=Key_code(); //获取键值
switch(y)
{
case 0: //第一个按键按下
mode_N++; //模式控制变量加1
if( mode_N3) mode_N=0;
break;
case 1: //第二个按键按下控制数据加
switch( mode_N)
{
case 1:if(TS_Count59) TS_Count++;
break;
case 2:if(TM_Count59) TM_Count++;
break;
case 3:if(TH_Count23) TH_Count++;
break;
}
break;
case 2: //第三个按键按下,控制数据减
switch( mode_N)
{
case 1:if(TS_Count0) TS_Count--;
break;
case 2:if(TM_Count0) TM_Count--;
break;
case 3:if(TH_Count0) TH_Count--;
break;
}
break;
}
y=-1;
disp_mode(mode_N);
dis_time(TS_Count,TM_Count,TH_Count);
//dis_time(25,26,27);
}
}
void LED_Flash()interrupt 1 //中断服务程序,定时用。
{
TH0=(8192-5000)/32;
TL0=(8192-5000)%32;
if(++count_N5)
{if(++TS_Count==60)
{
TS_Count = 0;
if(++TM_Count==60)
{
TM_Count = 0;
if(++TH_Count==24) TH_Count = 0;
}
}
count_N=0;
}
}
51单片机八个灯的流水灯代码
51单片机八个灯的流水灯代码:
1、用精确定时的方法,设置流水灯运行时的时间间隔,延时时间为500MS。
2、#include "reg51.h"首先写出单片机的头函数。
3、#include "intrins.h"输入位移函数。
4、unsigned int count=0,led;定义函数。
5、输入主函数,定义单片机的端口,写入延时函数。
编辑推荐
对于刚接触单片机的学习者,似乎都很迷茫,C语言、汇编语言、电路、开发板,不知道从哪儿开始学起。其实在学习单片机原理与应用系统开发时,只有在学习一些理论知识的基础上,多阅读单片机应用系统开发案例,注重单片机应用系统开发实践训练,才能透彻地理解和掌握单片机结构与原理,才能更快更好地掌握单片机应用知识和单片机应用系统开发技能。
51单片机中如何用汇编语言编写流水灯
流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:
ORG 0000H;复位启动
AJMP START;
ORG 001BH;T1中断
AJMP T1INT;
;定义变量========================
YSJSEQU 30H;延时计数器
LEDEQU 31H;LED控制缓冲器
;主程序==========================
START:MOV LED,#0FEH;初始化数据
MOV YSJS,#0;
MOV TMOD,#10H;定时器1工作于方式1,16位定时器
MOV TL1,#0B0H;设置定时初值
MOV TH1,#3CH;定时时间=50mS
SETB ET1;使能定时器1中断
SETB TR1;启动定时器1
SETB EA;开总中断
MOV P1,LED;初始化流水灯
LOOP:JMP LOOP;循环等待中断
T1INT:PUSH PSW;定时器1中断程序
PUSH ACC;保护现场
MOV TH1,#3CH;定时时间=50mS
MOV TL1,#0B0H;
INC YSJS;
PUSH ACC;保护ACC
MOV A,YSJI;
CJNE A,#2,QT1;50mS*2=100mS
MOV P1,LED;
MOV A,LED;
RL A;累加器A的值循环左移1位
MOV LED,A;
MOV YSJS,#0;
QT1:POP ACC;恢复现场
POP PSW;
RETI;返回主程序
END;汇编程序结束
扩展资料:
实现流水灯的三个方法:
第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。
第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。
第三种,库函数实现流水灯。利用左移函数进行。