#include<reg52.h>
#include<intrins.h>
#define uintunsignedint
#define ucharunsignedchar
sbitk1=P1^0;//左循环按钮
sbitk2=P1^1;//右循环按钮
sbitk4=P1^2;//恢复暂停
sbitk3=P3^2;//暂停
voidinit();
voidshowLED();
voiddelay(uintxms);
uintdelayTime;
uintgoLeft=1;
uintgoRight=0;
uintsFlag=0;
voidmain()
{
init();
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(k1==0);
goLeft=1;
goRight=0;
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
while(k2==0);
goLeft=0;
goRight=1;
}
}
}
}
voiddelay(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
voidinit()
{
P0=0xfe;
TMOD=0x02;//T0工作模式2自动装填8位 200us
TH0=0x38;
TL0=0x38;
EA=1;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
}
voidshowLED()
{
if(goLeft==1)
P0=_crol_(P0,1);
if(goRight==1)
P0=_cror_(P0,1);
}
voidmoveDelay()interrupt1 //一次中断200us
{
if(delayTime==5000)
{
showLED();
delayTime=0;
}
else
delayTime++;
}
voidstopLED()interrupt0
{
while(1)
{
if(k4==0)
{
delay(10);
if(k4==0)
{
while(k4==0);
break;
}
}
}
}
② 如何用单片机做流水灯
因为电路用单片机控制,所以电路非常简洁。其电路原理图见下图,印制板图如下图所示。
电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口,我们这里只用到Pl口,共8个引脚。图中Cl、R9组成典型的上电复位(即在加电时单片机复位)电路,XTAL、C2、C3与AT89C2051片内振荡电路组成时钟振荡器。值得注意的是,C2、C3的容量不能与图中数值偏差太大,否则可能引起不起振或振荡不稳定。XTAL的频率可以在4-20MHz之间,不过,频率的变化会导致程序运行速度的变化,这样就需要调整延时子函数的参数。事实上,不调整参数亦可,只是此时延迟时间不再是1秒,其延迟时间会随着XTAL频率的降低而增加。
二、软件部分
本程序包含两个函数,一个是主函数,另一个是延时子函数。源程序如下(为了便于讲解,我们为每行程序加上了编号):
程序各行作用如下:
00行:把AT89C2051的头文件“AT89x051.H”包含进来。
01行:声明Delay()延时子函数,该函数有一个无符号整型参数k,同时函数前面的void表明函数不返回函数值。
02行:延时子函数的开始,同时声明两个无符号整型变量i和j。
不过请注意,这里没有象上期的程序一样,把表示函数开始的“{”单独成行,而是把下一行写在一起了。事实上,写C程序的时候,可以把多行写作一行,C编译器只要遇到分号就认为是一行语句的结束。
当然,我们不能因为C程序有这个特点,就随意把多行合作一行书写,实际书写C程序的时候,还是要养成良好的程序书写习惯,按照约定俗成的原则来书写。
03行:声明for()循环。这个循环的初始条件是i=0,终止条件是i<k,循环计数是每循环一次,用手计数的变量i加1。因此,这个循环的循环次数就是k次。这样,只要改变k的值(即改变Delay()延时子函数的参数k的值),就可以很容易地控制循环次数,从而获得不同的延时时间。
04行:声明嵌套在03循环中的一个新的for()循环,这个循环与上一个循环相似,其循环次数是120次。本循环与上一个循环嵌套后,使得总的循环次数达120×k次。
05行:第一个分号,表示L条空语句,占用一个机器时间,以实现延时的目的。后面的两个“}”中,第一个“}”是04行for()循环的结束标志,程序遇到它时,将自动返回04行,使用于循环计数的变量j加1,同时判断j是否小于120,如果否,则转入05行;第二个是03行for()循环的结束标志,程序遇到它则会返回03行
③ 高分:89C51单片机流水灯程序求步骤详解,看懂了就给分
uchar
code
display_P0[]={
0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,//P0口由低位向高位依次亮灯(前一位的灯灭)
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//P0口灯全灭
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,,//P0口灯全灭
0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,//P0口由高位向低位依次亮灯(前一位的灯灭),最后全灭
0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,//P0口由低位向高位依次亮灯(前一位的灯b不灭)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//P0口灯全亮
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//P0口灯全亮
0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,
//P0口灯由高位向低位依次灭(前一位不亮),最后仅剩最低位亮灯。
0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x7F,//P0口以两个亮灯为单位,由低位向高位逐位移动,最后移至最高位,仅剩最高位亮灯。
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
//P0口全灭
0xE7,0xDB,0xBD,0x7E,0xBD,0xDB,0xE7,0xFF,//P0口中间两位亮灯,然后两个亮灯分别向两端移动,当分别移至最高位和最低位时,再按原方法返回,返回至起始状态后全灭。
0xE7,0xC3,0x81,0x00,0x81,0xC3,0xE7,0xFF,//P0口中间两位亮灯,然后两个亮灯分别向两端扩散,当分别扩散至次高位和次低位时,再按原方法恢复,返回至起始状态后全灭。
0xAA,0x55,0x18,0xFF,0xF0,0x0F,0x00,0xFF,//差位两灭,先是最高位亮,然后最高位灭;再变成中间两位灭,其余的全亮;全灭→低四位亮→高四位亮→全灭。
0xFF,0x00,0x00,0xFF,0xFF
};//全灭→全亮→全亮→全灭→全灭
uchar
code
display_P2[]={
//P2口可参照P0口流水灯情况。基本相同。
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,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,
//
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,
0xFF,0x00,0x00,0xFF,0xFF
};
④ 单片机流水灯程序
程序如下:
#include <reg52.h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3。
让电子信息技术与单片机技术相融合,有效提高了单片机应用效果。作为计算机技术中的一个分支,单片机技术在电子产品领域的应用,丰富了电子产品的功能,也为智能化电子设备的开发和应用提供了新的出路,实现了智能化电子设备的创新与发展。
从二十世纪九十年代开始,单片机技术就已经发展起来,随着时代的进步与科技的发展,目前该技术的实践应用日渐成熟,单片机被广泛应用于各个领域。现如今,人们越来越重视单片机在智能电子技术方面的开发和应用,单片机的发展进入到新的时期。
无论是自动测量还是智能仪表的实践,都能看到单片机技术的身影。当前工业发展进程中,电子行业属于新兴产业,工业生产中人们将电子信息技术成功运用。
⑤ 跪求一个最简单的单片机流水灯程序!并且附上对该程序的解释 急急急
ORG
0000H
;从RAM内存地址为0000H处执行程序
AJMP
MAIN
;跳过中断地址区
ORG
0100H
;程序存储的起始地址
MAIN:
MOV
A,#11111110B
;给累加器A赋值
MAIN1:
MOV
P0,A
;P0=A,只有一个灯亮
ACALL
DELAY
;调用延时程序
RL
A
;累加器的各位左移
AJMP
MAIN1
;返回到MAIN1,循环
DELAY:
MOV
R7,#10H
;延时程序
DELAY0:
MOV
R6,#7FH
DELAY1:
MOV
R5,#7FH
DELAY2:
DJNZ
R5,DELAY2
DJNZ
R6,DELAY1
DJNZ
R7,DELAY0
RET
;延时返回
END
;程序结束
调用延时程序是因为,单片机运算速度很快,如果没有延时,一个循环的时间很短,小灯亮的时间很短,人眼根本看不到流水灯的现象。大家可以去试试,如果不调用延时,因为视觉延迟,人眼看到的所有小灯都是亮的。不过亮度较低。
应该还算清楚吧。
⑥ 51单片机流水灯程序
程序如下:
#include <reg52.h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
sbit led6 = P2^5;
sbit led7 = P2^6;
sbit led8 = P2^7;
void main()
{
int i,j;
//点亮第一个灯
led1 = 1;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//延时1秒
for(i = 0;i < 110; ++i)
{
for(j = 0; j < 1000; ++j)
{
;//什么也不做
}
}
//点亮第二个灯
led1 = 0;
led2 = 1;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
//点亮剩余的灯
//省略……
while(1);
}
流水灯几点说明:
void:因为该延时函数不需要返回值,所以写为void
delay1s:该函数的函数名,命名需要符合C语言的标识符命名规则。
(): 不需要传入参数,所以括号中为空
至此我们可以把流水灯程序写为以下形式:
⑦ 一个花样流水灯单片机程序(要求1,3,5,7灯亮,2,4,6,8灯亮然后全灭)
先把P1口全部接低电平。
ORG 0000H。
AJMP START。
ORG 0040H。
AA:MOV P1,#55H。
ACALL DELAY。
MOV P1,#0AAH。
ACALL DELAY。
MOV P1,#00H。
ACALL DELAY。
AJMP AA。
DELAY:MOV R5,#256。
LOOP2:MOV R4,#256。
LOOP1:NOP。
NOP。
DJNZ R4,LOOP1。
DJNZ R5,LOOP2。
RET。
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。
在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
⑧ 51单片机中如何用汇编语言编写流水灯
流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:
ORG 0000H ;复位启动
AJMP START ;
ORG 001BH ;T1中断
AJMP T1INT ;
;定义变量========================
YSJS EQU 30H;延时计数器
LED EQU 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 ;汇编程序结束
(8)流水灯单片机程序扩展阅读:
实现流水灯的三个方法:
第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。
第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。
第三种,库函数实现流水灯。利用左移函数进行。
⑨ 用c语言编写单片机流水灯程序,(8个发光二极管从左至右循环点亮)
#include<reg51.h>
voiddelay(void)
{
unsignedinti,j;
for(i=0;i<200;i++)
for(j=0;j<1000;j++)
;
}
voidmain(void)
{
while(1)
{
P3=0xfe;//第一个灯亮
delay();//延时
P3=0xfd;//第二个灯亮
delay();
P3=0xfb;//第三个灯亮
delay();
P3=0xf7;//第四个灯亮
delay();
P3=0xef;//第五个灯亮
delay();
P3=0xdf;//第六个灯亮
delay();
P3=0xbf;//第七个灯亮
delay();
P3=0x7f;//第八个灯亮
delay();
}
}
(9)流水灯单片机程序扩展阅读
单片机C语言16种方式流水灯
voidmain()
{
while(1)
{
P1=0xfe;//点亮第一个发光管
Delay(5000);
P1=0xfd;//点亮第二个发光管
Delay(5000);
P1=0xfb;
Delay(5000);
P1=0xf7;
Delay(5000);
P1=0xef;
Delay(5000);
P1=0xdf;
Delay(5000);
P1=0xbf;
Delay(5000);
P1=0x7f;//点亮第八个发光管
}
}
⑩ 单片机流水灯c程序
经过仿真,程序没有毛病,可以实现流水灯的效果。
keil软件,也有时添乱,多实验几次,即可。
只是太快,可以加大延时的时间。
#include<reg52.h>
#include<intrins.h>
unsignedchara;
voidmain()
{
inti,j;
a=0xfe;
while(1){
a=_crol_(a,1);
P0=a;
for(i=250;i>0;i--)
for(j=1000;j>0;j--);//加一行
}
}