基于51单片机的红绿灯设计 基于89C51单片机的交通灯设计报告
可能不是很符合你的要求,看一看能不能用。
功能:红灯10秒,黄灯2秒。 照着你的要求改一改。
看不清的话,留下邮箱,发给你。
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^1;
sbit wela=P2^2;
sbit p1_0=P1^0;
uchar code dat[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uchar code tem[]={0x01,0x02,0x04,0x08,0x10,0x20};
uint i;
uchar num,st;
void delay(uint);
void init();
void main()
{
init();
dula=1;
P0=0xc0;
dula=0;
while(1)
{
if(i==1000)
{
i=0;
num++;
if(st==0)
{
if(num==10)
{
num=0;
st=1;
P2=0x40;
}
}
if(st==1)
{
if(num==2)
{
num=0;
st=2;
P2=0x30;
}
}
if(st==2)
{
if(num==10)
{
num=0;
st=3;
P2=0x40;
}
}
if(st==3)
{
if(num==2)
{
num=0;
st=0;
P2=0x88;
}
}
dula=1;
P0=dat[num];
dula=0;
delay(5);
}
}
}
//程序初始化
void init()
{
EA=1;//开总中断允许
EX0=1;//外部中断0允许
IT0=0;//外部中断0为低电平触发方式
TMOD=0X01;//设定T0为16位定时器
ET0=1;//定时器T0中断允许
TR0=1;//启动定时器T0
TH0=0XFC;
TL0=0X66;
i=0;
num=0;
st=0;
p1_0=1;
wela=1;
P0=0x01;
wela=0;
P0=0xff;
P2=0x88;
}
//延时约为Z毫秒
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=113;y>0;y--);
}
//外部中断0
void int0() interrupt 0
{
P2=0x28;
st=0;
i=0;
num=0;
dula=1;
P0=0xc0;
dula=0;
delay(10);
P2=0x88;
}
//定时器T0精确1ms
void timer0() interrupt 1
{
TH0=0XFC;
TL0=0X66;
i++;
}
我这里有一个用HOLTEK单片机汇编写的,利用查表程序完成,你可以参考一下.
include HT48R10A-1.inc;
;-------------------------------------
data .section 'data' ;资料段
COUNT1 db ? ;延时变数1
count2 db ? ;延时变数2
count3 db ? ;延时变数3
flash db ? ;LED闪烁控制暂存器
rglight db ? ;LED控制暂存器
;---------------------------------------
code .section at 0 'code' ;程序段
org 0H ;程式初始入口地址
jmp start ;
start : ; 程序开始
mov a, 0h
mov pac, a ;设PA为输出口
mov pa,a ;PA清零
;*********************************
loop: ;LED灯循环
mov a, 0 ;
mov tblp, a ;表格指标初始化
tabrdl rglight ;读取最后一页表格内容放入LED控制寄存器
mov a,rglight ;
mov pa, a ;把LED寄存器的内容输出到PA
call delay1 ;调用延时子程序DELAY1
inc tblp ;递增表格内容
mov a, 6 ;
mov flash, a ;设LED闪烁控制寄存器的内容为6次
; ;;;;;;;;;;;;;
flashlamp: ;LED闪烁循环?
tabrdl rglight ;读取最后一页表格内容放入LED控制寄存?
mov a,rglight ;
mov pa,a ;将LED寄存器的内容输出到PA
call delays ;
inc tblp ;递增表格指标
sdz flash ;检LED闪烁是否结束
jmp flashlamp ;闪烁没有结束,跳至LED闪烁循环
tabrdl rglight ;读取最后一页表格内容,放入LED控制寄存器
mov a,rglight ;?
mov pa,a ;将LED寄存器的内容输出到PA
call delaym ;呼叫延时子程序
inc tblp ;递增表格指标
;----------------
tabrdl rglight ;读取最后一页表格内容,放入LED控制寄存器
mov a, rglight
mov pa, a ;将LED寄存器的内容输出到PA
call delay1 ;呼叫延时子程序
inc tblp ;递增表格指标
mov a, 6 ;设LED闪烁次数
mov flash,a ;将闪烁次数放入LED闪烁控制寄存器
flash2: ;LED闪烁循环次数
tabrdl rglight ;读取最后一页表格内容,放入LED控制寄存器
mov a,rglight ;?
mov pa,a ;将LED寄存器的内容输出到PA
call delays ;调用延时子程序
inc tblp ;递增表格指标
sdz flash ;检查LED闪烁是否结束
jmp flash2 ;闪烁没有结束,中央电视台跳至LED闪烁循环2
tabrdl rglight ;读取最后一页表格内容,放入LED控制寄存器
mov a,rglight ;?
mov pa,a ;将LED寄存器的内容输出到PA
call delaym ;呼叫延时子程序DELAYM
jmp loop ;?
;======================== ;?
delay1 proc ; 延时子程序DELAY1
mov a,0fh ;?
mov count1,a ;?
mov count2,a ;?
mov count3,a ;?
d1: ;?
sdz count2
jmp d1 ;?
sdz count2
jmp d1
sdz count1
jmp d1
ret
delay1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;
delaym proc ;延时子程序DELAYM
mov a, 07h
mov count1 ,a
mov a, 0ffh
mov count2, a
mov count3,a
d2: sdz count3
jmp d2
sdz count2
jmp d2
sdz count1
jmp d2
ret
delaym endp
;------------------------
delays proc ;延时子程序DELAYS
mov a, 0ffh
mov count1, a
mov count2, a
d3: sdz count2
jmp d3
sdz count1
jmp d3
delays endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
org 300h ;led表格
dc 0ebh, 0fbh, 0ebh, 0fbh, 0ebh, 0fbh, 0ebh, 0dbh
dc 0beh, 0bfh, 0beh, 0bfh, 0beh, 0bfh, 0beh, 0bdh
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
end
MOV DPTR ,#0B00H ;选中8155的命令寄存器,P2.2接CE端,p2.1接I/O
MOV A,#01H ;命令寄存器设为01H=000000001B D0=1A口输出,D1=0B口输入
MOVX @DPTR,A
LOOP :MOV DPTR,#0B01H
LED0:MOV A,#0FFH ;第一组灯点亮
MOVX @DPTR,A
MOV R4,#09H
LOOP0:ACALL DELAY
DJNZ R4,LOOP0
MOV A,#11011110B
MOVX @DPTR,A
ACALL DELAY
ACALL DELAY
ACALL DELAY
LED1:ACALL DELAY ;第二组灯点亮
MOV A,#11101101B
MOVX @DPTR,A
ACALL DELAY
MOV A,#0FFH
MOVX @DPTR,A
ACALL DELAY
MOV A,#11101101B
MOVX @DPTR,A
ACALL DELAY
MOV A,#0FFH
MOVX @DPTR,A
ACALL DELAY
MOV A,#11101101B
MOVX @DPTR,A
ACALL DELAY
LED2:MOV R5,#09H ;第三组灯点亮
LOOP1:ACALL DELAY
DJNZ R5,LOOP1
MOV A,#11110011B
MOVX @DPTR,A
ACALL DELAY
ACALL DELAY
ACALL DELAY
SJMP LOOP
DELAY:MOV R3,#02H
LOP3:MOV R1,#85H
LOP1:MOV R2,#0FAH
LOP2:DJNZ R2,LOP2
DJNZ R1,LOP1
DJNZ R3,LOP3
RET
END
《用51单片机制作红绿灯,要求按键能控制整个电路的启动和停止,用汇编语言...》
答:有2种方法:1.用继电器控制,2.把板子的地接在单片机的某一个I/O口上。只要对某个I/O口操作就行了,相信你会吧