1. 用AT89C51单片机做循环彩灯实验
我用的是每50msT1溢出中断一次#include<reg52.h>#include<intrins.h>#define LedPort P1#define uchar unsigned char#define uint unsigned intsbit led=P1^0;uchar temp1=0xfe,temp2=0xbf;uchar flag,timeNum;void Init(){ TMOD=0x01; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET1=1; TR1=1;}void main(){ Init(); while(1) { }}void timer1() interrupt 3{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; timeNum++; if(timeNum==10) { timeNum=0; if(flag<8) { LedPort=temp1; temp1=_crol_(temp1,1); } else if(flag>=8&&flag<15) { LedPort=temp2; temp2=_cror_(temp2,1); } else if(flag==15) { LedPort=0; } else if(flag==16) { LedPort=0xff; } flag++; if(flag==17) flag=0; }}
2. 这是个单片机控制循环彩灯程序,哪位高手具体解释下这个程序,实现的彩灯花样有哪几种
DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCH DB 0F8H,0F0H,0E0H,0C0H,80H,00H,0FFH,00H,0FEH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH DB 0EFH,0F7H,0FBH,0FDH,0FEH,00H,0FFH,00H 这个是彩灯循环花样 其中把十六进制数换成二进制的 是一的位彩灯就亮。比如第一个01H换成二进制就是00000001,所以是第一个灯亮,依此可推出彩灯循环花样
3. 51单片机循环彩灯12个彩灯依次亮
跑马灯IC 或直接成品的单片。
4. 基于51单片机的循环彩灯控制设计
老兄,东西不复杂的,自己思考,别碰到1+1的问题也要来问。要给你画流程,没人有那么多时间的,
硬件:51用p1口接电阻驱动三级管,用三极管驱动二极管动作。
软件:网上很多现成的资料,自己去整理。
;************;
;小灯控制程序;
;************;
;
;************;
;中断入口程序;
;************;
;
ORG 0000H ;程序执行开始地址
LJMP START ;跳至START执行
ORG 0003H ;外中断0中断入口地址
RETI ;中断返回(不开中断)
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回(不开中断)
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
;
;************;
; 初始化程序 ;
;************;
;
CLEAR: MOV 20H,#00H ;20H单元内存清0(闪烁标志清0)
SETB 00H ;20H.0位置1(上电时自动执行闪烁功能1)
RET ;子程序返回
;
;************;
; 主 程 序 ;
;************;
;
START:ACALL CLEAR ;调用初始化子程序
MAIN: LCALL KEYWORK ;调用键扫描子程序
JB 00H,FUN0 ;20H.0位为1时执行FUN0
JB 01H,FUN1 ;20H.1位为1时执行FUN1
JB 02H,FUN2 ;20H.2位为1时执行FUN2
JB 03H,MAIN ;备用
AJMP MAIN ;返回主程序MAIN
;
;************;
; 功能程序 ;
;************;
;第1种闪烁功能程序
FUN0: MOV A,#0FEH ;累加器赋初值
FUN00:MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
JNB ACC.7,MAIN ;累加器最高位为0时转MAIN
RL A ;累加器A中数据循环左移1位
AJMP FUN00 ;转FUN00循环
;
;第2种闪烁功能程序
FUN1:MOV A,#0FEH ;累加器赋初值
FUN11:MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
JZ MAIN ;A为0转MAIN
RL A ;累加器A中数据循环左移1位
ANL A,P1 ;A同P1口值相与
AJMP FUN11 ;转FUN11循环
;
; 第3种闪烁功能程序
FUN2:MOV A,#0AAH ;累加器赋初值
MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
CPL A ;A中各位取反
MOV P1,A ;累加器值送至P1口
LCALL DL05S ;延时
AJMP MAIN ;转MAIN
;************;
; 扫键程序 ;
;************;
;
KEYWORK:MOV P3,#0FFH ;置P3口为输入状态
JNB P3.0,KEY0 ;读P3.0口,若为0转KEY0
JNB P3.1,KEY1 ;读P3.1口,若为0转KEY1
JNB P3.2,KEY2 ;读P3.2口,若为0转KEY2
JNB P3.3,KEY3 ;读P3.3口,若为0转KEY3
RET ;子程序返回
;
;闪烁功能0键处理程序
KEY0:LCALL DL10MS ;延时10毫秒消抖
JB P3.0,OUT0 ;P3.0为1,子程序返回(干扰)
SETB 00H ;20H.0位置1(执行闪烁功能1标志)
CLR 01H ;20H.1位清0
CLR 02H ;20H.2位清0
CLR 03H ;20H.3位清0
OUT0:RET ;子程序返回
;
; 闪烁功能1键处理程序
KEY1:LCALL DL10MS
JB P3.1,OUT1
SETB 01H ;20H.1位置1(执行闪烁功能2标志)
CLR 00H
CLR 02H
CLR 03H
OUT1:RET
;
;闪烁功能2键处理程序
KEY2:LCALL DL10MS
JB P3.2,OUT2
SETB 02H ;20H.2位置1(执行闪烁功能3标志)
CLR 01H
CLR 00H
CLR 03H
OUT2:RET
;
;闪烁功能(备用)键处理程序
KEY3:LCALL DL10MS
JB P3.3,OUT3
SETB 03H ;20H.3位置1(执行备用闪烁功能标志)
CLR 01H
CLR 02H
CLR 00H
OUT3:RET
;
;************;
; 延时程序 ;
;************;
;0.5毫秒延时子程序,执行一次时间为513微秒
DL512:MOV R2,#0FFH
LOOP1: DJNZ R2,LOOP1
RET
;
;10毫秒延时子程序(调用20次0.5毫秒延时子程序)
DL10MS:MOV R3,#14H
LOOP2: LCALL DL512
DJNZ R3,LOOP2
RET
;
;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为15×25毫秒)
DL05S:MOV R4,#0FH
LOOP3: LCALL DL25MS
DJNZ R4,LOOP3
RET
;
;25毫秒延时子程序,用调用扫键子程序延时,可快速读出功能按键值
DL25MS:MOV R5,#0FFH
LOOP4:LCALL KEYWORK
DJNZ R5,LOOP4
RET
END ;程序结束
5. 单片机彩灯循环控制程序(汇编程序)
既然有人答过C语言的,我就写个汇编的吧。
有点长,放在我的网络空间了:
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/5adeb99112822680a877a415.html
6. 单片机彩灯循环控制程序
ORG 0000H
LJMP MAIN
ORG 4000H
MAIN: MOV A,#0F8H ;用P1低六位控制灯
MOV P1,A
CALL DELAY
CLR A ;取反
MOV P1,A ;点亮下三个,灭上三个
CALL DELAY
LJMP MAIN
DELAY: .......
自己添上吧,很简单
.......
END
7. 8051单片机,用P0口控制8个LED实现循环彩灯。
跑马灯。网上一大把。
我就解释下间隔一秒的那个,时间常数。
看你用的定时器方式。一般用方式1。若频率是24mhz,机器周期为0.5us。所以计数次数为1s/0.5us=200000次超过了范围。所以用循环。可以50000循环4次或其他次数。算出技术初值。
8. 单片机程序设计 循环彩灯
我用的是每50msT1溢出中断一次
#include<reg52.h>
#include<intrins.h>
#define LedPort P1
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0;
uchar temp1=0xfe,temp2=0xbf;
uchar flag,timeNum;
void Init()
{
TMOD=0x01;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void main()
{
Init();
while(1)
{
}
}
void timer1() interrupt 3
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
timeNum++;
if(timeNum==10)
{
timeNum=0;
if(flag<8)
{
LedPort=temp1;
temp1=_crol_(temp1,1);
}
else if(flag>=8&&flag<15)
{
LedPort=temp2;
temp2=_cror_(temp2,1);
}
else if(flag==15)
{
LedPort=0;
}
else if(flag==16)
{
LedPort=0xff;
}
flag++;
if(flag==17)
flag=0;
}
}也可以用编码表的方式,把灯亮灭的情况放在数组里,中断里再用
9. 求单片机彩灯循环控制程序
ORG0000H
AJMPMAIN
ORG0100H
MAIN:JBP2.0,m1
JBP2.1,m2
JBP2.2,m3
JBP2.3,m4
JBP2.4,m5
JBP2.5,m6
JBP2.6,m7
JBP2.7,m8
SJMPMAIN
m1:MOVR1,#02H;四亮四闪
LOOP:MOVP1,#00H
XRLA,#0AAH
MOVP1,A
CALLDELAY
DJNZR1,LOOP
SJMPMAIN
m2:MOVR1,#08H;向右闪烁
MOVA,#0FEH
LOOP1:MOVP1,A
CALLDELAY
RLA
DJNZR1,LOOP1
SJMPMAIN
m3:MOVR1,#02H;整体闪烁
LOOP2:MOVP1,#00H
CALLDELAY
MOVP1,#0FFH
CALLDELAY
DJNZR1,LOOP2
SJMPMAIN
m4:MOVR1,#08H;奇数向右闪烁
MOVA,#0AAH
LOOP3:MOVP1,A
RRA
CALLDELAY
DJNZR1,LOOP3
SJMPMAIN
m5:MOVR1,#08H;两边中间
LOOP4:MOVP1,#3CH
CALLDELAY
MOVP1,#0C3H
CALLDELAY
;MOVP1,#7EH
;CALLDELAY
;MOVP1,#0BDH
;CALLDELAY
;MOVP1,#0DBH
;CALLDELAY
;MOVP1,#0E7H
;CALLDELAY
DJNZR1,LOOP4
SJMPMAIN
m6:MOVR1,#04H
LOOP5:MOVP1,#0F0H;亮一半灭一半
CALLDELAY
MOVP1,#0FH
CALLDELAY
DJNZR1,LOOP5
JMPMAIN
m7:MOVR1,#02H;中间往两边灭
LOOP6:MOVP1,#00H
CALLDELAY
MOVP1,#18H
CALLDELAY
MOVP1,#3CH
CALLDELAY
MOVP1,#7EH
CALLDELAY
MOVP1,#0FFH
CALLDELAY
DJNZR1,LOOP6
LJMPMAIN
m8:MOVR1,#01H;双灯循环
LOOP7:MOVP1,#3FH
CALLDELAY
MOVP1,#0FCH
CALLDELAY
MOVP1,#0CFH
CALLDELAY
MOVP1,#0F3H
CALLDELAY
DJNZR1,LOOP7
JMPMAIN
DELAY:MOVR5,#10
DEL1:MOVR7,#200
DEL:MOVR6,#123
NOP
NOP
DJNZR6,$
DJNZR7,DEL
DJNZR5,DEL1
RET
就是没有数码管显示!一共八种模式!
10. 求用单片机制作的循环彩灯原理图及程序
不用154这么麻烦吧,直接把16个灯分别串1K电阻 从P1+P2口就接到行了
#include"reg52.h"
void delay(unsigned int m)
{
unsigned int j=0;
while(m--)for(j=0;j<125;j++){;}
}
void mian(void)
{
while(1)
{
P1=0x01;delay(500);
P1=0x02; delay(500);
P1=0x04; delay(500);
P1=0x08; delay(500);
P1=0x10; delay(500);
P1=0x20; delay(500);
P1=0x40; delay(500);
P1=0x80; delay(500);
P1=0x00;
P2=0x01;delay(500);
P2=0x02; delay(500);
P2=0x04; delay(500);
P2=0x08; delay(500);
P2=0x10; delay(500);
P2=0x20; delay(500);
P2=0x40; delay(500);
P2=0x80; delay(500);
P2=0x00;
}
}