① 单片机多级外部中断控制,请问如何加入流水灯,现在在进行课程设计,迫切需要实现的方法。
功能:先保持全灭一段时间,然后顺序点亮8个灯,全亮后再保持一段时间,然后从从头开始
SS2:
MOV A,#0FFH ;全部熄灭
MOV P1,A ;送显示
ACALL DELAY1S ;延时一段时间,保持全灭1S
SS1:
RL A ;循环左移1位
CLR ACC.0 ;将最低位置0,点亮1个等
MOV P1,A ;送显示
ACALL DELAY100ms ;延时一段时间,感觉上100ms比较合适,根据情况自己调整一下
JNZ SS1 ;A不等于0,说明还有灯未点亮,循环继续下一个
ACALL DELAY1S ;A=0,保持全部点亮1S钟
JMP SS2 ;再次开始
延时子程序我就不写了,你应该会的。
建议:牵涉到延时,最好用定时中断实现,实际运用中ms级的延时一般都会使用中断实现,否则CPU的资源就浪费了。如果是作业就算了,如果你想学些东西最好用中断的方式再尝试一下。
② 单片机C语言编程:控制流水灯
#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;
}
}
}
}
③ 单片机汇编语言流水灯,定时器中断控制,(500ms)延时
单片机汇编语言流水灯,用定时器中断控制,可以初始化设置定时器时间(如50mS注定时器最大定时时间到不了500mS,需要加计数存储,中断10就是500mS),有多种方式实现如作一个流水状态表,定时读取写入IO端口 表加一,,或者用左移太移等方式都可以实现在,网上有很多这种实例。
④ 51单片机按键中断控制流水灯
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
ucharled,time=0;
sbitkey=P1^0;
voidt0isr()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
led=_crol_(led,1);
P0=led;
time++;
if(time>=200)TR0=0;
}
main()
{
ucharkeyval=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
while(1)
{
if(key==0)
{
while(key==0);
keyval++;
keyval%=3;
}
switch(keyval)
{
case0:led=0xff;P0=led;break;
case1:TR0=1;led=0xfe;break;
case2:TR0=0;break;
default:break;
}
}
}
⑤ 单片机外部中断做流水灯
单片机控制led灯亮和灭,led灯初始状态从左到右两个灯间隔一个灯循环亮灭,然后从右到左循环亮灭,,当按下按键,led灯全亮,然后全灭。然后再恢复循环。
二、实验过程
(一)实验项目的方案分析
1.设计原理
STC12C5A60S2单片机内部包括微处理器、存储器(存放程序指令或数据的ROM、RAM等)、输入/输出口(I/O口)及其他功能部件如定时/计数器、中断系统等。它们通过地址总线、数据总线和控制总线连接起来。
本实验充分利用了8051芯片的I/O引脚。系统已采用STC12C5A60S2系列单片机为中心器件来设计数码管显示系统,实现数码管循环显示。
2.器件配置清单
表1器件配置表
名称
型号
数值
数量
面包板
MB-102
165*55*
(二)实验项目的硬件电路设计
通过Proteus仿真电路软件搭建电路
(三)实验项目的程序设计
1、C51程序编写
2、keil软件调试截图
通过Keil软件进行C51控制程序的编写,通过不断调试修改,最终的调试好的Keil
调试无措的Keil程序
(四)实验项目的虚拟仿真
打开Keil C软件将上面程序输入,调试无误后编译输出".hex"文件,打开Proteus软件,将之前编译好的".hex"文件加入到芯片中,开始运行仿真。
(五)实验项目的实际验证电路及验证结果
将单片机C51程序编译无误后,生成HEX文件,通过STC-ISP下载到单片机中,下载的软件界面搭建的实际
⑥ 请教单片机利用中断方式实现流水灯的问题
1.主程序中的for(i=0;i<100;i++);起到短延时的作用,因为send函数并不是执行完就发送完成了,还需要等待iic发送数据
2.send函数中的clk=1;
clk=0;
是输出了一个跳变,是时钟线
3.ledp是发送指示灯的开关,在send函数前打开,在send之后关上
⑦ 汇编语言 51单片机,外部中断控制流水灯
ORG 0000H ; 试试这个 流水灯的编码随便改
LJMP MAIN
ORG 0003H
LJMP LINT0
ORG 000BH
LJMP LT0ZD
ORG 0030H
MAIN: MOV SP, #60H
MOV TMOD, #00H
MOV IE, #81H
MOV TL0, #(8192-2500)MOD 32
MOV TH0, #(8192-2500)/32
SETB TR0
MOV R5, #20
LOOP: MOV R3, #48
CJNE R3, #0, $
LJMP LOOP
LINT0: CPL ET0
RETI
LT0ZD: PUSH PSW ; T0 中断
PUSH ACC
MOV TL0, #(8192-2500)MOD 32
MOV TH0, #(8192-2500)/32
DJNZ R5, LT0Z2
MOV R5, #30 ; 可以调整速度
MOV A, R3
LCALL LSDIN
MOV P1, A
DEC R3
LT0Z2: POP ACC
POP PSW
RETI
LSDIN: MOVC A,@A+PC
RET
LSDBM: DB 11111110B,11111101B,11111011B,11110111B ; 流水灯的编码1
DB 11101111B,11011111B,10111111B,01111111B
DB 01111111B,10111111B,11011111B,11101111B
DB 11110111B,11111011B,11111101B,11111110B
DB 11111100B,11111001B,11110011B,11100111B ; 流水灯的编码2
DB 11001111B,10011111B,00111111B,01111110B
DB 01111110B,00111111B,10011111B,11001111B
DB 11100111B,11110011B,11111001B,11111100B
DB 11111000B,11110001B,11100011B,11000111B ; 流水灯的编码3
DB 10001111B,00011111B,00111110B,01111100B
DB 01111100B,00111110B,00011111B,10001111B
DB 11000111B,11100011B,11110001B,11111000B
END