求个51单片机 汇编语言设计的LED跑马灯的程序

LED跑马灯的程序设计 不要弄复杂了 最简单的

要求:每次点亮一盏灯,间隔0.5S

用定时器0来计时,溢出时间为10ms

主程序中用查询或中断方式

单片机复位后,所有LED灯全亮,持续2s 再跑马灯

请给出如何利用单片机实现所要求的功能,主程序的构架,是否使用中断,程序分哪写模块,如何设计程序的全局变量,其数据结构怎样设计,主程序与中断通过哪些全局变量进行信息传递

分别写出主程序、各模块程序的设计思路,完成的功能,结合流程图对程序进行说明

如果觉得上述问题描述太过繁琐,请简单给出各个模块的表述..

要求程序编译通过并且能下载到单片机,并且演示正确

分不多 我只有30分 全给了 希望牛人帮帮忙..
希望会的人能真正自己编个 不要在网上搜..不符合要求的..

给个你参考
*******
/* 实验目的:初步了解单片机I/O口的工作原理,进一步掌握51单片机的汇编指令。
* 实验内容:用汇编指令对单片机I/O口进行编程,控制8个发光二极管的流水亮灭。
*/
/* 程序详细功能介绍:
*做单一灯的左移右移,八个发光二极管L0-L7分别接在单片机的P0.0-P0.7接口上,
*输出“0”时,发光二极管亮,开始时P0.0→P0.1→P0.2→P0.3→┅→P0.7→P0.6→┅→P0.0亮,重复循环。
*/
ORG 0000H
LJMP START
ORG 0030H
START:
MOV R2,#8 ;左移次数
MOV A,#0FEH ;A的初始值,即 P0.0的L0 点亮
SETB C
LOOP: MOV P0,A
LCALL DELAY
RLC A ;左移流水灯(带进位的左移),即亮点向P0口的高位移动
DJNZ R2,LOOP

MOV R2,#8 ;右移次数
LOOP1: RRC A ;右移流水灯
MOV P0,A
LCALL DELAY
DJNZ R2,LOOP1
LJMP START

DELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间,从而改变流水灯移动速度
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-04-11
C语言程序如下,已经经过了仿真,符合要求.
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar t1 = 0;
//-------------------------------
void TIME0()interrupt 1
{
TH0 = 0xD8; //初值.
TL0 = 0xF0; //10ms @ 12MHz
t1++;
}
//-------------------------------
void main() //主函数.
{
uchar i, aaa = 0xfe;
TMOD = 0x01; //定时器0
TH0 = 0xD8; //初值.
TL0 = 0xF0; //10ms @ 12MHz
TR0 = 1;
ET0 = 1;
EA = 1;
P0 = 0x00; //全亮.
while (t1 != 200); //等待2000ms
t1 = 0;
aaa = 0xfe;
P0 = aaa; //P1.0发光.
while (1) {
for (i = 0; i < 7; i++) {
while (t1 != 50); //等待500ms
t1 = 0;
aaa = _crol_(aaa, 1);//左移一位.
P0 = aaa;
} //左移位7次,P0.7发光.
for (i = 0; i < 7; i++) {
while (t1 != 50); //等待500ms
t1 = 0;
aaa = _cror_(aaa, 1);//右移一位.
P0 = aaa;
} //右移位7次,P0.0发光.
}
}本回答被提问者和网友采纳
第2个回答  2010-01-12
这活我接了
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 跑马灯 ;
;2010.1.12 ball ;
;P0口为流水灯,低电平点亮 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H ;起始地址
LJMP MAIN ;转入主函数
ORG 000BH ;定时中断0入口地址
LJMP PE ;转入中断程序

ORG 0100H ;主程序入口
MAIN: ;
MOV TMOD,#01H ;设置定时中断0的工作方式
MOV TL0,#0EFH ;添加初值
MOV TH0,#0D8H ;
SETB EA ;开总中断
SETB ET0 ;开定时中断
SETB TR0 ;开始计时
MOV P0,#00H ;点亮所有灯
MOV R0,#0C8H ;设定定时次数,两百次10ms*200=2s
QUAN: ;
MOV A,R0 ;
JNZ QUAN ;

MOV A,#0FEH ;
PAOMA: ;点亮第一个灯
MOV P0,A ;
MOV R0,#32H ;设定定时次数50次。10ms*50=0.5s
HJ:
CJNE R0,#00H,HJ ;定时器重复50次,延时0.5秒
RL A ;循环左移进行跑马灯
LJMP PAOMA ;

PE: ;定时器
MOV TL0,#0EFH ;
MOV TH0,#0D8H ;
DEC R0 ;用R0决定定时次数
RETI ;
END ;over

利用定时器10ms的定时
200次循环定时器=2s延时
100次循环定时器=0.5s延时
利用循环左移实现跑马灯
第3个回答  2010-01-19
用c还是汇编写?
相似回答