
你的程序不是很合理,定时器的值错误,定时器,中断都配置了,但是没用到,可能对这些还不是很了解,给你个程序,是流水灯的,很短,自己去研究下,不明白的地方去查资料,不知道怎么查的话联系我也可以,祝成功。
#include "reg52h"
#include "intrinsh"
#define uchar unsigned char
#define uint unsigned int
void delay(uint x)
{
uint a,b;
for(a = x; a > 0; a--)
for(b = 110; b > 0;b--);
}
void main()
{
uchar led = 1;
while(1)
{
P2 = led;
led = _crol_(led, 1);
delay(200);
}
}
51单片机用汇编语言编写流水灯程序,就是控制多个LED ,使其在特定时间间隔内,只有一个LED 发光,其他熄灭,用这种方式顺序移动点亮LED的位置,就形成了流水灯的效果。以下是程序:
;假设晶振12MHZ,P1控制8个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 ;50mS2=100mS
MOV P1,LED ;
MOV A,LED ;
RL A ;累加器A的值循环左移1位
MOV LED,A ;
MOV YSJS,#0 ;
;
QT1: POP ACC ;恢复现场
POP PSW ;
RETI ;返回主程序
END ;汇编程序结束
#include<reg52h>
#include<intrinsh>
#define unit unsigned int
#define uchar unsigned char
void delay(unit z)
{
unit x, y;
for(x = 100; x > 0; x--) for(y = z; y > 0; y--);
}
void main()
{
uchar temp, i;
temp = 0xfe;
while(1) {
for (i = 0; i < 8; i++) {
P1 = temp; delay(300); temp = _crol_(temp, 1);
}
temp <<= 1;
if(temp == 0) temp = 0xfe;
}
}
试试看。
#include<reg51h>
#include<intrinsh>
#define
uchar
unsigned
char
sbit
button=P1^0;
uchar
press=0;
void
Delay(uchar
z)
{
uchar
x,y;
for(x=z;x>0;x--)
for(y=255;y>0;y--);
}
void
Led_Continue()
{
P2=0xfe;
while(press==0|press==2)
{
P2=_crol_(P2,1);
Delay(255);
}
}
void
Led_Stop()
{
P2=0xff;
}
void
Keyscan()
{
if(button==0)
{
Delay(20);
if(button==0)
{
press+=1;
if(press==1)
{
Led_Stop();
}
if(press==2)
{
press=0;
}
}
}
}
void
main()
{
while(1)
{
Keyscan();
Led_Continue();
}
}
试试这个,在mian中要一直去扫描,否则就扫描一次不能达到目的。
然后你问用中断怎么完成,告诉你中断更简单,定时器用作延时用,键盘只需要写当这个按键按下时
TRx=~TRx
就是每一次按下,定时器开关都和上一次状态不一样,这样每按一次都会停止、开始、停止、开始
希望我的回答能帮助到你。
程序如下:
#include <reg52h>
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3。
让电子信息技术与单片机技术相融合,有效提高了单片机应用效果。作为计算机技术中的一个分支,单片机技术在电子产品领域的应用,丰富了电子产品的功能,也为智能化电子设备的开发和应用提供了新的出路,实现了智能化电子设备的创新与发展。
从二十世纪九十年代开始,单片机技术就已经发展起来,随着时代的进步与科技的发展,目前该技术的实践应用日渐成熟,单片机被广泛应用于各个领域。现如今,人们越来越重视单片机在智能电子技术方面的开发和应用,单片机的发展进入到新的时期。
无论是自动测量还是智能仪表的实践,都能看到单片机技术的身影。当前工业发展进程中,电子行业属于新兴产业,工业生产中人们将电子信息技术成功运用。
#include<reg52h>
#include<intrinsh>
#define uchar unsigned char
#define uint unsigned int
void delay(uint z);
main()
{
uchar aa;
while(1)
{
aa=0xfe;
P1=aa;
delay(100);
while(1)
{
aa=_crol_(aa,1);
P1=aa;
delay(100);
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
直接轮流输出0x80
0x20 0x08 0x02即可
假设LED接P1口 高电平灯亮
程序语句如下:
P1=0x02;
delayms(200);
P1=0x08;
delayms(200);
P1=0x20;
delayms(200);
P1=0x80;
delayms(200);
以上就是关于51单片机流水灯的程序错误求修改全部的内容,包括:51单片机流水灯的程序错误求修改、c51单片机中如何用汇编语言编写流水灯、51单片机流水灯,第一轮每次亮一个灯流水,第二轮每次亮两个灯流水.....然后整个过程循环等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)