A. 单片机左右来回流水灯程序,两个两个的灯亮能用keil生成.hex文件。
自己现成想的汇编的要不要啊哈哈
MOV A,#0011111
LOOP:
MOV P0,A
CALL DELAY
RR A
JMP LOOP
DELAY: ;延时程序
MOV R3,#20
D1:MOV R4,#20
D2:R5,#248
DJNZ R5,$
DJNZ R4,D2
DJNZ R2,D1
RET
这只是2个灯右移程序,如果达到你想要的效果还有计数8次然后进入计数左移动8次,懂基本原理什么都好办哎!纠结!!!!!!!!!
B. 51单片机左右循环移动的流水灯功能,求解答每一句具体含义!
#include<reg52.h>//头文件包含,包括51硬件寄存器的宏定义,延时函数等
#define uchar unsigned char//宏定义,uchar被定义成unsigned char的简写
#define uint unsigned int//同上,uint被定义成unsigned int 的简写
#define DataPort P0//dataport(数据端口)被定为成P0口
sbit P21=P2^0;sbit是设置端口的某一位为一个变量,这样就可以直接对变量进行操作(等价于对端口该位的操作),如sbit led1=P1^1;如果P1^1接的是led的话,led1=1;就可以使led灯点亮了!
uchar code ScanCode[ ]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
code表示让单片机把这个定义的ScanCode的值存在ROM(程序存储区)
定义一个无符号的字符型变量数组ScanCode,其值存放在程序存储区,写入之后不可更改
void DelayMs(uint n)//毫秒延时函数,通过设置循环次数,来设定时间
{
uchar j;
while(n--)//直到n减为0退出循环
{
for(j=0;j<113;j++);空循环114次,即延时114个指令周期
}
}
void main(void)主函数
{
uchar i;
P21=1;p2口第1位引脚置高电平
while(1)无限循环
{
for(i=0;i<8;i++)以下大括号中两句代码循环8次,即将ScanCode数组中8字节数据依次送到p0口
{
DataPort=ScanCode[i];向数据口(即p0口)送数据,数据为ScanCode数组中第i个元素
DelayMs(500);延时500毫秒
}
for(i=0;i<8;i++)同上,将scancode数字的8字节数据按相反顺序再送一次
{
DataPort=ScanCode[7-i];
DelayMs(500);
}
}
}
C. 关于流水灯左移和右移的程序问题
LED灯右移到最右边后向左移时是这样的:右移一位→第二个延时程序→第一个延时程序→右移右移一位→第二个延时程序→第一个延时程序,这样不断循环,循环到最左边,就开始了右移的程序。
这样左移的延迟大一点的!
D. 如何实现51单片机的按键k1按下,LED流水灯向右移动,按键k2被按下,LED流水灯向左移动
51单片机实现方法:
按键控制标志位flag取反。
然后把下面的代码放到循环里:
U8 temp0 = 1。
U8 temp1 = 0x80。
U8 i = 0。
if(flag == 1)。
{。
for(i=0;i<8;i++)。
{。
P1=temp0<<i。
}。
}。
else。
{。
for(i=0;i<8;i++)。
{。
P1=temp1>>i。
}。
}。
}。
对控制LED口的寄存器进行位操作,按k1左移,按K2就是右移了。
51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。
51单片机的特点:
同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51,PHILIPS,和WINBOND等,我们常说的已经停产的89C51指的是ATMEL公司的AT89C51单片机。
同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取代了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。
E. 单片机流水灯设计,使八个led灯右移
#include <AT89X52.h> //调用51单片机的头文件
void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
unsigned int a; //定义一个int型变量,做延时用
P0=0;
while(1) //死循环,单片机初始化后,将一直运行这个死循环
{
for(a=0;a<20000;a++); //延时若干时间,具体时长暂不理会
if(P0==0)
P0=0x01;
else
P0=P0<<1; //将PO左移
}
}
F. 怎么控制51系列单片机流水灯先左移再右移最好有分析
#include<reg52.h>
#include <intrins.h> 头文件
#define uchar unsigned char 宏定义
uchar a,b;
uchar b=1;
uchar a=0xfe; 变量定义和初始化
void main() 主函数
{
EA=1;IT1=1;ET0=1;中断允许设置
TH0=-5000/256;
TL0=-5000%256; 赋值
TMOD=0x01;
TR0=1; 启动
while(1); 等待中断产生
}
void timer0(void) interrupt 1 using 1 中断函数
{
TH0=-5000/256;
TL0=-5000%256; 重新赋值
b=b+1; 计算时间
if(b==40) 0.5秒时间到
{
b=0; 清0
P1=a; P1口赋值 0XFE 二进制11111110 也就是第一盏亮其他灭
a=_crol_(a,1); 库函数实现循环
P1=a; 把循环后的值重新付给P1口
}
}
以上只是单方向的循环 还缺少延时函数 加在赋值后面
双向循环 可以用左移右移指令
赋值 P1口 A=A<<1 循环左移一位 A=A>>1 循环右移一位
G. 请问52单片机中流水灯实现左移,全亮,右移,两边向中间亮要怎么写程序啊,最好有-crol-的程序,谢谢啦
;左移
LOOP1:
MOV R7,#8
MOV A ,#01
RL A
MOV P1,A
CALL DELAY
DJNZ R7,LOOP1
;全亮
MOV P1,#0FFH
CALL DELAY
;右移
LOOP2:
MOV R7,#8
MOV A ,#01
RR A
MOV P1,A
CALL DELAY
DJNZ R7,LOOP2
;不想写了
H. 51单片机的c语言 左移右移怎么用想用来控制流水灯,请帮忙写个完整的c程序,参考下,端口随意
# include "reg51.h" // 包含头文件
#define uchar unsigned char
void delay02s(void) // 延时0.2s子程序
{
unsigned char i,j,k;
for ( i=2;i>0;i-- )
for (j=200;j>0;j-- )
for (k=250;k>0;k-- );
}
void main (void) // 主函数
{
uchar i,j;
while (1) // 死循环
{
j=0x01; // j初始化为0x01,左移初始值
for(i=0;i<8;i++) // for循环语句,完成8个循环
{
P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出
delay02s( ); // 延时0.2s
j= j<<1; // 左移1位
}
j=0x80; // 设置右移初始值j为0x80
for (i=0;i<8;i++)
{
P1= ~ j;
delay02s( );
j= j>>1; // 右移1位
}
}
}