急求,单片机80C51上有8个等。编写一个程序能让灯跑起来,

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-06
80c51单片机交通灯程序

ORG 1000H
L:JNB P3.0,LP3
JNB P3.1,LP2 ;判断p3.1,p3.0口
;如果P3.0为1的话,正常运行交通灯
;如果P3.1为1的话,正常运行交通灯
;如果P3.1为0的话,依次点亮灯
;如果P3.0为0的话,停止交通灯,只有黄灯闪烁


;正常运行交通灯

LP1:
MOV P1,#61H
CLR P3.2
CLR P3.3
CLR P3.4
SETB P3.5 ;1,3 路口红灯亮,2,4 路口绿灯亮
LCALL DELAY1

MOV B,#04H ;设置循环次数为4次
M:MOV P1,#51H
CLR P3.5
SETB P3.4 ;1,3路口红灯亮,2,4路口黄灯亮
LCALL DELAY2
MOV P1,#41H
CLR P3.4 ;1,3路口红灯亮,2,4路口黄灯灭
LCALL DELAY2
DJNZ B,M

MOV P1,#0CH
SETB P3.2
SETB P3.3 ;1,3路口绿灯亮,2,4路口红灯亮
LCALL DELAY1

MOV B,#04H
N:MOV P1,#8AH
CLR P3.2 ;1,3路口黄灯亮,2,4路口红灯亮
LCALL DELAY2
MOV P1,#08H ;1,3路口黄灯灭,2,4路口红灯亮
LCALL DELAY2
DJNZ B,N
AJMP L

;黄灯闪
LP3: CLR P1.7
CLR P3.2
CLR P3.3
CLR P3.5
MOV P1,#92H
SETB P3.4 ;黄灯亮,其他的灯灭
LCALL DELAY2
MOV P1,#00H
CLR P3.4 ;所有的黄灯灭
LCALL DELAY2
AJMP L

;循环亮
LP2: CLR P3.2
CLR P3.3
CLR P3.4
CLR P3.5

MOV A,#01H ;赋初值
MOV R0,#08 ;循环变量,循环7次,控制7个灯
LOOP: MOV P1,A ;点亮第一个灯
LCALL DELAY2 ;延迟
RL A ;A的值加1,循环左移
DJNZ R0,LOOP ;RO的值减1不等于1则执行LOOP标号
SETB P3.2 ;P3.2灯亮
LCALL DELAY2 ;延迟
CLR P3.2 ;P3.2灯灭
SETB P3.3 ;下一个灯P3.3亮
LCALL DELAY2 ;延迟
CLR P3.3 ;P3.3灯灭
SETB P3.4 ;下一个灯P3.3亮
LCALL DELAY2 ;延迟
CLR P3.4 ;P3.4灯灭
SETB P3.5 ;P3.5灯亮
LCALL DELAY2 ;延迟
AJMP L




;延迟1
DELAY1 :
MOV R3,#200
DEL1: MOV R4,#250
DEL2: MOV R5,#50
DEL3: NOP ;空操作
DJNZ R5,DEL3
DJNZ R4,DEL2
DJNZ R3,DEL1 ;延长5秒
RET

;延迟2
DELAY2 :
DEL4: MOV R3,#200
DEL5: MOV R4,#200
DEL6: NOP
DJNZ R4,DEL6
DJNZ R3,DEL5 ;延迟0.08秒
RET
END

我编写了一个:P1.0—P1.2分别为南北方向的红,黄,绿灯; P1.3——P1.5为东西方向的红,黄,绿灯;共阴极数码管的a,b,c,d,e,f,g,dp分别接P0.0-P0.7;数码管V0-V2分别接P2.0——P2.2(V0为百位,V1为10位,V2为个位);南北为主干道,能行时间180秒,黄灯亮3秒,东西为乡村道,通行时间为60秒,黄灯亮3秒;采用T0为中断源,扫描显示数码管,T1为定时器,每次定时0.5秒,两次计数1秒。
打字难打,我在实验板上试过,但不知是不是你 想要的。
#include
#define uint unsigned int
#define uchar unsigned char
#define led P0 //数码管7段显示由P0控制
uchar count, times
#define sec times%10 //个位
#define tse time/10%10 //十位
#define hse times/100 //百位
bit n_s, w_e; //南北,东西
sbit n_red=P1^0; //南北红灯
sbit n_ylw=P1^1; //南北黄灯
sbit n_grn=P1^2; //南北绿灯
sbit w_red=P1^3; //东西红灯
sbit w_ylw=P1^4; //....
sbit w_grn=P1^5; //....
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管显示码存表

/*中断函数,供数码管显示用*/
T0_srv() interrupt 1 using 1
{
TH0=-(5000/256);
TL0=-(5000%256);
led=0xff;
P2=((0xfe>(8-count)));
count++;
if(count==3) count=0;
if((P2|0xf0)==0xfe)
{
led=table[hse];
}
else
{
if((P2|0xf0)==0xfd
{
led=table[tse];}
else
{
led=table[sec];}
}

/*延时函数(延时i秒)*/
void delay(uint i)
{
uint j,k;
TR1=1;
for(j=i*2;j>0;j--)
{
for(k=10;k>0;k--)
{
TH1=0x3c; //TH与TL写入初值,0.05秒
Tl1=0xb0;
while(TF1==0);
TF1=0;
}
if((j<7)&&(n_s==1)) //n_s为南北通行标致
n_grn=~n_grn; //n_s最后3秒,绿灯闪烁
if((j<7)&&(w_e==1)) //w_e为东西通行标致
w_grn=~w_grn; //w_e最后3秒,绿灯闪烁
if(j%2==0) times--; /*计时2次0.5秒, time减1*/
}
TR1=0; //停止计时
}

void north_south() //南北通行函数
{
n_s=1;
times=180; //通行180秒
P1=0xf3; //南北亮绿灯,东西亮红灯
delay(180);
n_s=0;
}

void nor_yellow() //南北黄灯函数
{
times=3; //黄灯亮3秒
P1=0xf5;
delay(3);
}

void west_east() //东西通行函数
{
w_e=1;
times=60; //通行60秒
P1=0xde; //东西绿灯,南北红红灯
delay(60);
w_e=0;
}

void wst_yellow() //东西黄灯函数
{
times=3;
P1=0xee; //东西黄灯,南北红灯
delay(3);
}

void main(void)
{
TMOD=0x11; //T0与T1工作在方式1
TH0=-(5000/256); //T0装入初值
TL0=-(5000%256);
IE=0x82; //允许T0中断
TR0=1; //开能T0
P2=0xfe; //数码管扫描初值(从百位开始)
count=0; //计数初值为0
while(1) //无限循环
{
north_south(); //调用南北通行函数
nor_yellow(); //调用南北黄灯函数
west_east(); //调用东西通行函数
wst_yellow(); //调用东西黄灯函数
}
}

/*你很有诚意,虽然只是30分悬赏,但已是你所有家当,希望能帮到你*/

LED灯的一端接P1口的各各引脚,另一端接地。同时在P1口的每个管脚上加1K的上拉电阻,电阻另一端连接至+5V即可
ORG 0000H
AJMP START
ORG 0030H
START:MOV SP,#07H
MOV P1,#00H
MOV R0,#08H
MOV A,#80H
LOOP: CLR C
MOV P1,A
ACALL DELAY
RRC A
DJNZ R0,LOOP
MOV R0,#08H
MOV A,#80H
AJMP LOOP
DELAY:MOV R1,#0AH
DL1:MOV R2,#18H
DL2:NOP
NOP
DJNZ R2,DL2
DJNZ R1,DL1
RET
END

网上有很多程序,建议你看看。
再说现在都用c编写,很简单的。

如果你真要学好点,你还是自己动手吧,这个问题也不是很难!


如果你真要学好点,你还是自己动手吧,这个问题也不是很难!


#include<reg51.h>
void delay(unsigned int x)
{
unsigned char i;
while(x--)for(i=0;i<120;i++);
}
void main(void)
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++)
{
P0=(1<<i);
delay(300);
}
}
}

  • 急求,单片机80C51上有8个等。编写一个程序能让灯跑起来,
    答:LED灯的一端接P1口的各各引脚,另一端接地。同时在P1口的每个管脚上加1K的上拉电阻,电阻另一端连接至+5V即可 ORG 0000H AJMP START ORG 0030H START:MOV SP,#07H MOV P1,#00H MOV R0,#08H MOV A,#80H LOOP: CLR C MOV P1,A ACALL DELAY RRC A DJNZ R0,LOOP MOV R0,#08H MOV...
  • 二极管是共阳接法,80C51单片机中的汇编程序如下所示。请根据电路及所...
    答:8个发光二极管轮流闪烁着点亮,先从最左边LED开始,亮1秒,来1秒,再换另一只LED,依次到最右边亮完结束一个循环。
  • 80C51单片机,12mhz.利用中断程序控制8个灯依次亮灭,定时时间为1秒。
    答:} for(i=0;i<8;i++){ P2=~tab[i];delay(1);} }
  • 用80C51单片机的P1端口作输出,经驱动电路接8只发光二极管,如图,输出位...
    答:LP:MOV P1,#81H ;点亮第1第8灯 LCALL DELAY MOV P1,#42H ;点亮第2第7灯 LCALL DELAY MOV P1,#24H ;点亮第3第6灯 LCALL DELAY MOV P1,#18H ;点亮第4第5灯 LCALL DELAY MOV P1,#24H ;点亮第3第6灯 LCALL DELAY MOV P1,#42H ;点亮第2第7灯 LCALL DELAY ...
  • 80C51单片机引脚有哪些第二功能?
    答:P0和P1,除了做I/O口外,还做地址总线(当接外部存储器时)有第二功能的还有P3口的八个引脚,除此还有两引脚有第二功能。P3第二功能各引脚功能定义:P3.0:RXD串行口输入 P3.1:TXD串行口输出 P3.2:INT0外部中断0输入 P3.3:INT1外部中断1输入 P3.4:T0定时器0外部输入 ...
  • 80c51单片机P1端口上经驱动器接有8只发光二极管FOSC=6MHZ,试编写...
    答:6MHz晶振的话,一个机器周期就是2us,采用定时器计数就会每隔2us计数一次,犹豫你没有指定使用什么工作方式,我暂且使用工作方式1吧,16位定时计数器,那么定时器初值就应为65536-25000,定时器初始化:void inition(){ TMOD=0x01;TH0=(65536-25000)/256;TL0=(65536-250000)%6;EA=1;ET0=1;TR...
  • 单片机实验80C51 外中断 P1口接8个发光二极管,设计实验:S1加1键,S2...
    答:既可用外部中断方式来实现;也可以用查询方式读键处理。灯的亮灭,就是对P1口的赋值操作,每次多一盏,可以让初值为0xff。此后,每次左移或右移实现。每次少一盏,可以与前面相反,右移或左移,并在移入位补1。注意去抖动处理,好好写吧,不难。
  • 80C51单片机控制,用P1口控制8个灯单灯循环亮0.5s灭0.5s ?
    答:12MHz晶振的频率时,下列程序可以满足要求。start1:XRL P1, #255 MOV R4, #50 loop:CALL delay10ms DJNZ R4, loop JMP start1 ;delay10ms:DL1: MOV R6, #10 DL0: MOV R5, #242 DJNZ R5,DJNZ R5,DJNZ R6,DL0 RET END ...
  • 单片机80C51,p2.0,p2.1,p2.2三个按键控制P0口8个灯和P1口8个灯的...
    答:思路:用中断的方法实现。当那三个按键有动作时,产生一个中断。然后进入中断服务程序, 读入这三个数据,然后和设定的值比较,然后对对应的标志(比如,000对应标志为F0)011(F1),110(F2).若读到输入为011,则标志F1=1,F0=0,F2=0)赋值。返回主程序后,通过对在中断赋值程序中的标志判断(分别...
  • 80C51单片机有多少个IO口
    答:嘿嘿 俺来 回答吧 1 80C51单片机有4个并行的IO口 即P0、 P1 、 P2 、 P3 、每一个端口有8条IO口线 2 80C51单片机还有1个全双功能的串行IO口,可以和主机进行远距离通讯。该串口有2条线 即 发送数据线 和 接受数据线。呵呵 满意 就选满意回答 ...