导航:首页 > 操作系统 > 51单片机汇编语言100例

51单片机汇编语言100例

发布时间:2023-08-22 20:56:23

㈠ 51单片机定时器的汇编语言程序编程,

LED BIT P1.0 ;定义LED的引脚
ORG 0000H

LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H ;定时器0工作模式1
MOV TH0,#HIGH(65536-50000) ;初值,50毫秒中断一次
MOV TL0,#LOW(65536-50000)
SETB TR0 ;启动定时器
SETB ET0 ;启动定时器中断
SETB EA ;开总中断
MOV R2,#40 ;中断计数初始值
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E ;R2减到0重新赋值,否则退出
MOV R2,#40
CPL LED ;LED亮灭转换
T0E:
RETI
END

㈡ 51单片机编程题,用汇编语言怎么做

在8051单片机的时钟频率为6MHz,那么定时器的计数脉冲周期就是 2uS;

sbit CP=P1^0;

void Timer0_init()

{

TMOD |=0x01; //T0定时器,方式1,采用16位定时器

TH0 = (65536-500)/256; //定时器装初值500, 即 1000uS 中断一次

TL0 = (65536-500)%256;

EA=1; ET0=1; TR0=1;

}


void timer0() interrupt 1

{

TH0 = (65536-500)/256; //定时器装初值500, 1mS 中断一次

TL0 = (65536-500)%256;

CP=~CP; //改变脉冲信号的输出状态

}


void main()

{

Timer0_init();

CP=0;

while(1) { }

}


汇编语言,才看到,算了,你别人的回答吧

㈢ 51单片机用计数器中断实现100以内的按键计数,汇编语言程序

试试下列程序:
ORG 0000H
JMP START
ORG 000BH
JMP T0_INT
;------------------------------
START:
MOV TMOD, #06H
MOV TH0, #255
MOV TL0, #255
MOV IE, #82H
SETB TR0
MOV R2, #0
MOV R3, #0
MOV DPTR, #TAB
;------------------------------
M_LOOP:
MOV A, R3
MOVC A, @A + DPTR
MOV P2, A
MOV A, R2
MOVC A, @A + DPTR
MOV P0, A
SJMP M_LOOP
;------------------------------
T0_INT:
JNB P3.4, T0_INT
INC R3
CJNE R3, #10, T0_END
MOV R3, #0
INC R2
CJNE R2, #10, T0_END
MOV R2, #0
T0_END:
RETI
;------------------------------
TAB: DB 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
;------------------------------
END

㈣ 求个51单片机开平方的汇编程序

汇编程序:用减奇数法开平方(16位)

命题:从 1 开始,把连续 n 项奇数的等差数列,求和,可以得到 n^2。

证明:1 + 3 + 5 + ... + (2n-1) = (1 + (2n-1)) * (n/2) = n^2。


那么,对于任意正整数 M,都会有:

M = 1 + 3 + 5 + … + ( 2n - 1 ) + ε

= n^2 + ε

= N + ε

式中 N 是完全平方数,N = n^2。

式中 ε 是小于 2n - 1 的误差。


由此,可推出“减奇数开平方”的算法

即:在 M 中依次减去 1、3、5、...,直到不够减为止;

够减的次数 n,即为 N 的平方根。

程序可见:

这种求平方根的方法,效率很高,远远高于牛顿迭代法。

㈤ 51单片机汇编语言定时器的使用(中断方式)

(1)
COUNT_INTEQU30H
LEDVALUEEQU31H
ORG0000H
LJMPSTART
ORG001BH
LJMPTimer1Interrupt

START:
MOVSP,#60H
MOVCOUNT_INT,#0
MOVLEDVALUE,#01H
LCALLInitTimer1

LOOP:
MOVA,LEDVALUE
MOVP2,A
LJMPLOOP

InitTimer1:
MOVTMOD,#10H;定时器T1为工作方式1,产生50ms定时
MOVTH1,#3CH
MOVTL1,#0B0H
SETBEA
SETBET1
SETBTR1
RET

Timer1Interrupt:
PUSHDPH
PUSHDPL
PUSHACC
MOVTH1,#3CH
MOVTL1,#0B0H
;========================
INCCOUNT_INT
MOVA,COUNT_INT;每50ms加1,
CJNEA,#2,Timer1Interrupt_EXIT;100ms
MOVCOUNT_INT,#0
MOVA,LEDVALUE
RLA
MOVLEDVALUE,A
;========================
Timer1Interrupt_EXIT:
POPACC
POPDPL
POPDPH
RETI

END
(2)
COUNT_INT_LEQU30H
COUNT_INT_HEQU31H
LEDVALUEEQU32H
ORG0000H
LJMPSTART
ORG001BH
LJMPTimer1Interrupt

START:
MOVSP,#60H
MOVCOUNT_INT_L,#0
MOVCOUNT_INT_H,#0
MOVLEDVALUE,#01H
LCALLInitTimer1

LOOP:
MOVA,LEDVALUE
MOVP2,A
LJMPLOOP

InitTimer1:
MOVTMOD,#20H;定时器T1为工作方式2,产生250us定时
MOVTH1,#00H
MOVTL1,#06H
SETBEA
SETBET1
SETBTR1
RET

Timer1Interrupt:
PUSHDPH
PUSHDPL
PUSHACC
MOVTH1,#00H
MOVTL1,#06H
;========================
INCCOUNT_INT_L
MOVA,COUNT_INT_L;每250us加1,
CJNEA,#40,Timer1Interrupt_EXIT;250US*40=10ms
MOVCOUNT_INT_L,#0
INCCOUNT_INT_H
MOVA,COUNT_INT_H;每10Ms加1,
CJNEA,#10,Timer1Interrupt_EXIT;10ms*10=100MS
MOVCOUNT_INT_H,#0
MOVA,LEDVALUE
RLA
MOVLEDVALUE,A
;========================
Timer1Interrupt_EXIT:
POPACC
POPDPL
POPDPH
RETI

END

㈥ 求单片机课程设计实验 用汇编语言,基于51单片机的定时闹钟

MODE_RG EQU40H ;模式选择

MODE2 EQU 60H ;MODE值

MODE3 EQU61H

MODE4 EQU62H

MODE5 EQU63H

MODE6 EQU64H

MODE1 EQU65H

HOUR EQU41H ;小时缓冲区

MIN EQU42H ;分钟缓冲区

SEC EQU 43H ;秒缓冲区

TEMP EQU4AH

;*********闹钟缓冲区********************

H_ALARM EQU 6AH ;闹钟缓冲区

M_ALARM EQU6BH

S_ALARM EQU6CH

F_ALARM EQU6DH

;***********秒表缓冲区******************

M_SEC EQU76H

S_SEC EQU77H

;*********LED送显示临时变量*************

LED0 EQU51H

LED1 EQU52H

LED2EQU53H

LED3 EQU54H

MODE_KEYEQUP3.4

UP_KEY EQUP3.3

DOWN_KEY EQUP3.5

BUF EQU49H

ORG0000H

LJMPMAIN

ORG000BH

LJMPINT_0

ORG001BH

LJMPINT_1

ORG0080H

MAIN: MOVSP,#2FH ;堆栈初始化

MOVMODE_RG,#0 ;MODE_RG寄存器值初始化

MOVLED0,#0FEH ;初始化LED

MOVLED1,#0FDH

MOVLED2,#0FBH

MOVLED3,#0F7H

MOVMODE1,#1

MOVMODE2,#2

MOVMODE3,#3

MOVMODE4,#4

MOVMODE5,#5

MOVMODE6,#6

MOVF_ALARM,#0 ;错误2:一开始用CLRF_ALARM,这导致在后面的时候JZF_ALARM运行错误,

MOVBUF,#0 ;在于JZ指令是对累加器A全为0或者全为1进行判断,CLR只能对一位操作

MOVTMOD,#11H ;定时器初始化:定时器0,方式1,定时器1,方式1

MOVIP,#00001000B ;定时器1优先级高

MOVTH0,#3CH ;定时50MS

MOVTL0,#0B1H

MOVTH1,#0D8H ;定时10MS

MOVTL1,#0F0H

SETBEA

SETBET0

SETBET1

SETBTR0;启动定时器

MOVHOUR,#0 ;fortest

MOVMIN,#0

MOVSEC,#0 ;定时器计数器,50MS中断一次,200次则刚好1S

MOVM_SEC,#0

MOVS_SEC,#0

MOVH_ALARM,#0

MOVM_ALARM,#0

MAIN1: LCALLDISPLAY12

LCALLDISPLAY34

;CLRP1.4 TEST

JNBMODE_KEY,KEY_SCAN

MOVA,MODE_RG

CJNEA,MODE6,Y1 ;MODE6秒表

JNBDOWN_KEY,DEALDOWN ;判断秒表开关

JNBUP_KEY,DEALUP

Y1: MOVA,F_ALARM ;判断闹钟

JNZALARM

LJMPMAIN1

;-----------------------------------秒表开关程序---------------------------

DEALDOWN: LCALLDELY10MS

JBDOWN_KEY,MAIN1

H1: JNBDOWN_KEY,H1

CPLTR1

LJMPMAIN1

DEALUP: LCALLDELY10MS

JBUP_KEY,MAIN1

H2: JNBUP_KEY,H2

MOVM_SEC,#0

MOVS_SEC,#0

CLRTR1

LJMPMAIN1

;-----------------------------------闹钟扫描程序---------------------------

ALARM: MOVA,H_ALARM

CPLP1.2

CJNEA,HOUR,EXIT3

MOVA,M_ALARM

CJNEA,MIN,EXIT3

LJMPSTARTALARM

EXIT3: SETBP3.6

LJMPMAIN1

STARTALARM:CPLP3.6

JNBDOWN_KEY,OFFALARM

LJMPS1

OFFALARM: LCALLDELY10MS

JBDOWN_KEY,MAIN1

S2: JNBDOWN_KEY,S2

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S1: LCALLDELAY

LJMPMAIN1

;-----------------------------------键盘扫描程序---------------------------

KEY_SCAN: LCALLDELY10MS

JBMODE_KEY,MAIN1

INCMODE_RG

;SETBP1.4 测试

K1: JNBMODE_KEY,K1 ;按键直到用户松开按键

K2: MOVA,MODE_RG

CJNEA,#0,DEALMODE;不是在正常显示模式下则跳转到模式处理程序

LJMPMAIN1 ;返回主程序

;*******************模式处理程序部分

DEALMODE: MOVTEMP,#0 ;凡转入MODE处理,则首先清除TEMP

MOVA,MODE_RG ;有MODE_RG值不为5、0

CJNEA,MODE2,M0 ;判断MODE_RG值,不为1跳转

LJMPH_GLINT ;模式1,小时位闪烁

M0: CJNEA,MODE3,M1 ;不是模式2,跳转

LJMPM_GLINT ;模式2,分钟位闪烁

M1: CJNEA,MODE4,M2 ;不是模式3,跳转

LJMPH_GLINT

M2: CJNEA,MODE5,M3

LJMPM_GLINT

M3: CJNEA,MODE6,M4

MOVM_SEC,#0

MOVS_SEC,#0

LJMPMAIN1

M4: CJNEA,MODE1,M5

;CLRTR1

LJMPMAIN1

M5: MOVMODE_RG,#0

LJMPMAIN1

;*****************************MODE为1,3,小时位闪烁

//MOVTEMP,HOUR ;将TEMP赋值,防止在加的时候是在随机值的基础上增加

H_GLINT: ;CPLP1.0

MOVR0,#28

MOVR1,#28

K4: LCALLDISPLAY12 ;分开显示

LCALLDISPLAY34

E1: JNBMODE_KEY,K21 ;检测是否有按键按下,有按下则跳转到分钟位闪烁

JBUP_KEY,E9 ;判断加位有无按键按下

LJMPUP

E9: DJNZR0,K4

K6: LCALLDISPLAY34

JNBMODE_KEY,K21 ;检测是否有按键按下,有按下则跳转延时后进行模式判断

LJMPG1

K21: LCALLDELY10MS ;延时后确定有MODE按键按下,将

JBMODE_KEY,H_GLINT

W: JNBMODE_KEY,W

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;确定有按下,MODE+1后返回MODE处理程序

JNBUP_KEY,UP ;判断加位有无按键按下

G1: DJNZR1,K6

LJMPH_GLINT ;调用完毕返回,实现闪烁

K3: LJMPMAIN1 ;可省略

;******************************MODE为2,4,分钟位闪烁

M_GLINT: MOVR0,#28

MOVR1,#28

K23: CPLP1.7

LCALLDISPLAY12

LCALLDISPLAY34

JNBMODE_KEY,KK ;跳转,确定是否有按键按下

JNBUP_KEY,UP ;判断加位有无按键按下

MOVA,MODE_RG

CJNEA,MODE3,E2 ;在MODE5的情况下要判断闹钟确认键有没按下

LJMPE5

E2: JNBDOWN_KEY,F2

LJMPE5

F2: LJMPONALARM2

E5: DJNZR0,K23

K24: LCALLDISPLAY12

JNBMODE_KEY,KK ;检测是否有按键按下,有按下则跳转

JNBUP_KEY,UP ;判断加位有无按键按下

MOVA,MODE_RG ;扫描闹钟确认键

CJNEA,MODE3,E7 ;在MODE5的情况下要判断闹钟确认键有没按下

LJMPG2

E7: JBDOWN_KEY,E8

CPLP1.3

LJMPONALARM2

E8: LJMPG2

KK: LCALLDELY10MS ;去抖

JBMODE_KEY,M_GLINT

W1: JNBMODE_KEY,W1

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;确定有按下,MODE+1后返回MODE处理程序

G2: DJNZR1,K24

LJMPM_GLINT

;*************************位加,处理程序

;***************小时调整

UP: MOVR1,#20

UP11: INCTEMP

UP12: MOVA,MODE_RG ;判断此时的MODE,根据MODE将临时变量给对应的赋值

CJNEA,MODE2,AA0 ;不是在MODE2的情况下跳转

MOVA,TEMP

CJNEA,#24,A_UP1

MOVTEMP,#0

A_UP1: MOVHOUR,TEMP ;为MODE2,将临时变量赋给小时位

LJMPUP15

AA0: CJNEA,MODE4,UP13//UP13为分钟调整入口

MOVA,TEMP

CJNEA,#24,A_UP

MOVTEMP,#0

A_UP: MOVH_ALARM,TEMP ;模式3,将临时变量赋给闹钟的小时位

LJMPUP15 ;UP15为显示入口

;****************分钟调整入口

UP13: MOVA,MODE_RG

CJNEA,MODE3,UP14 ;不是模式2,跳转

MOVA,TEMP

CJNEA,#60,DISOVER2

MOVTEMP,#0

DISOVER2: MOVMIN,TEMP

LJMPUP15

UP14: MOVA,TEMP ;上面判断不是模式2,则必然是模式4

CJNEA,#60,DISOVER3

MOVTEMP,#0

DISOVER3: MOVM_ALARM,TEMP

LJMPUP15

UP15: LCALLDISPLAY12

LCALLDISPLAY34

DJNZR1,UP01

MOVR1,#1 ;

JNBUP_KEY,UP11

UP01: JNBUP_KEY,UP12

UP16: MOVA,MODE_RG ;松开键以后按照模式判断该返回哪种状态,不能返回DEALMODE函数

CJNEA,MODE2,UP17

LJMPH_GLINT

UP17: CJNEA,MODE3,UP18

MOVSEC,#0 ;每次设置完时间后将秒钟位置零保证时间准确

LJMPM_GLINT

UP18: CJNEA,MODE4,UP19

LJMPH_GLINT

UP19: CJNEA,MODE5,UP20

LJMPM_GLINT

UP20: LJMPMAIN1

ONALARM2: LCALLDELY10MS ;延时10MS,去抖

JBDOWN_KEY,B2 ;抖动所致,返回分钟位闪烁

LJMPK42

B2: LJMPM_GLINT

K42: JNBDOWN_KEY,K42

MOVF_ALARM,#0FFH

MOVMODE_RG,#0

LJMPMAIN1

;---------------------------------------中断程序入口---------------------

;*******************时间中断0*********************

;错误1:中断程序EXIT处用了MAIN1,导致一直处于中断状态

INT_0: PUSHACC

PUSHPSW

MOVTH0,#3CH

MOVTL0,#0B1H

INCBUF

MOVA,BUF

CJNEA,#20,EXIT

TIME: MOVBUF,#0

INCSEC

MOVA,SEC

CJNEA,#60,EXIT

MOVSEC,#00H

INCMIN

MOVA,MIN

CJNEA,#60,EXIT

MOVMIN,#00H

INCHOUR

MOVA,HOUR

CJNEA,#24,EXIT

MOVHOUR,#0

RETI

EXIT: POPPSW

POPACC

RETI

;******************时间中断1***********************

INT_1: MOVTH1,#0D8H ;定时10MS

MOVTL1,#0F0H

INCS_SEC

MOVA,S_SEC

CJNEA,#100,EXIT4

MOVS_SEC,#0

INCM_SEC

MOVA,M_SEC

CJNEA,#100,EXIT4

MOVM_SEC,#0

EXIT4: RETI

;---------------------------------------显示-----------------------------

DISPLAY12: MOVA,MODE_RG ;判断模式,决定是显示闹钟时间还是显示当前时间

CJNEA,MODE4,DIS0 ;模式四,显示闹钟

LJMPDIS01 ;MODE4

DIS0: CJNEA,MODE5,DIS20

DIS01: MOVR7,H_ALARM ;闹钟模式

LJMPDIS2

DIS20: CJNEA,MODE6,DIS21

MOVR7,M_SEC ;秒表模式,显示秒表高位

LJMPDIS2

DIS21: CJNEA,MODE1,DIS1

LJMPDIS22

DIS22: MOVR7,MIN

LJMPDIS2

DIS1: MOVR7,HOUR ;DISPLAY12显示高位

DIS2: LCALLBCTD ;判断完毕,调用显示

;将秒、分分别转码,放到R4,R3

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVDPTR,#NUMTAB

MOVP2,#0FH

MOVP2,LED0

MOVA,45H ;从拆字的出口获取值

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED1

MOVA,46H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

RET

DISPLAY34: MOVA,MODE_RG ;判断模式,决定是显示闹钟时间还是显示当前时间

CJNEA,MODE4,DIS31

LJMPDIS32

DIS31: CJNEA,MODE5,DIS35

DIS32: MOVR7,M_ALARM

LJMPDIS34

DIS35: CJNEA,MODE6,DIS41

MOVR7,S_SEC ;秒表模式,显示秒表低位

LJMPDIS34

DIS41: CJNEA,MODE1,DIS33

MOVR7,SEC

LJMPDIS34

DIS33: MOVR7,MIN ;DISPLAY34显示低位

DIS34: LCALLBCTD

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVP2,LED2

MOVA,47H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED3

MOVA,48H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

SETBP2.3

RET

;--------------------二翻十:入口:R6R7出口:R2R3R4----------------------

BCTD: MOVR5,#16

CLRA

MOVR2,A

MOVR3,A

MOVR4,A

LOOP: CLRC

MOVA,R7

RLCA

MOVR7,A

MOVA,R6

RLCA

MOVR6,A

MOVA,R4

ADDCA,R4

DAA

MOVR4,A

MOVA,R3

ADDCA,R3

DAA

MOVR3,A

MOVA,R2

ADDCA,R2

DAA

MOVR2,A

DJNZR5,LOOP

RET

;-----------------------拆字:入口:R3R4出口:45H46H47H48H------------------

DIVIDE: MOVA,R3

ANLA,#0FH

MOV46H,A

MOVA,R3

ANLA,#0F0H

SWAPA

MOV45H,A;时拆字45H放时高位,46H放十低位

MOVA,R4

ANLA,#0FH

MOV48H,A

MOVA,R4

ANLA,#0F0H

SWAPA

MOV47H,A;分拆字47H放分高位,48H放分低位

RET

;------------------------------------延时----------------------------------

DELY10MS:MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

DELAY: MOV74H,#2;延时子程序,12M晶振延时1.002秒

L3: MOV72H,#10

L1: MOV73H,#249

L2: DJNZ73H,L2

LCALLDISPLAY12

LCALLDISPLAY34

JNBDOWN_KEY,OFFALARM1

LJMPS3

OFFALARM1: LCALLDELY10MS

JBDOWN_KEY,S3

S4: JNBDOWN_KEY,S4

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S3: DJNZ72H,L1

DJNZ74H,L3

RET

NUMTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;码表

END

㈦ 51单片机中如何用汇编语言编写流水灯

流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:

ORG 0000H;复位启动
AJMP START;
ORG 001BH;T1中断
AJMP T1INT;

;定义变量========================
YSJSEQU 30H;延时计数器
LEDEQU 31H;LED控制缓冲器

;主程序==========================
START:MOV LED,#0FEH;初始化数据
MOV YSJS,#0;
MOV TMOD,#10H;定时器1工作于方式1,16位定时器
MOV TL1,#0B0H;设置定时初值
MOV TH1,#3CH;定时时间=50mS
SETB ET1;使能定时器1中断
SETB TR1;启动定时器1
SETB EA;开总中断

MOV P1,LED;初始化流水灯
LOOP:JMP LOOP;循环等待中断
T1INT:PUSH PSW;定时器1中断程序
PUSH ACC;保护现场
MOV TH1,#3CH;定时时间=50mS
MOV TL1,#0B0H;
INC YSJS;

PUSH ACC;保护ACC
MOV A,YSJI;
CJNE A,#2,QT1;50mS*2=100mS
MOV P1,LED;
MOV A,LED;
RL A;累加器A的值循环左移1位
MOV LED,A;
MOV YSJS,#0;
QT1:POP ACC;恢复现场
POP PSW;
RETI;返回主程序
END;汇编程序结束

(7)51单片机汇编语言100例扩展阅读:

实现流水灯的三个方法:

第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。

第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。

第三种,库函数实现流水灯。利用左移函数进行。

㈧ c51单片机控制交通灯要求用汇编语言

// 51单片机控制交通灯要求用汇编语言,仿真实例,可以参考一下

SNF EQU 00H ; 南北通行标志位

EWF EQU 01H ; 东西通行标志位

URF EQU 02H ; 紧急事件标志位

ORG 0000H

LJMP MAIN ; 上电转主程序

ORG 000BH ; 定时中断入口

LJMP DSZD

ORG 0003H ; 紧急中断入口

LJMP URZD

ORG 0030H

MAIN: LCALL INIT ; 调用初始化子程序

LOOP: LCALL DIS ; 循环执行显示子程序

AJMP LOOP

; *** *** *** 初始化程序

INIT: SETB SNF

SETB EWF

SETB URF

MOV R2,#20 ; 定时器中断20次为1s

MOV TMOD,#01H ; 初始化定时器

MOV TL0,#0B0H

MOV TH0,#3CH

SETB EA ; 开定时中断与紧急中断

SETB ET0

SETB TR0

SETB EX0

SETB IT0 ; 设置中断程控方式

MOV DPTR,#TAB ; 数值首地址放入DPTR中

MOV 40H,#40 ; 东南西北通行时间设置

MOV 41H,#40

MOV 30H,#40 ; 通行时间初始化

MOV 31H,#60

MOV P0,#4CH ; 初始化时南北通行并把交通灯状态分别放在32H和33H中

MOV 32H,#4CH

MOV P2,#15H

MOV 33H,#15H

RET

; *** *** *** 显示子程序

DIS: MOV P3,#0DFH ; 选中南北方向的十位数码管

MOV A,30H ; 把显示数据送人数码管显示

MOV B,#10

DIV AB

MOVC A,@A+DPTR

MOV P1,A ;

LCALL D1MS

MOV P3,#0EFH ; 选中南北方向的个位数码管

MOV A,B ; 送入数码管显示

MOVC A,@A+DPTR

MOV P1,A

LCALL D1MS

MOV P3,#7FH ; 选中第东西方向的十位数码管

MOV A,31H ; 送入数码管显示

MOV B,#10

DIV AB

MOVC A,@A+DPTR

MOV P1,A

LCALL D1MS

MOV P3,#0BFH ; 选中第东西方向的个位数码管

MOV A,B

MOVC A,@A+DPTR

MOV P1,A

LCALL D1MS

SETB P3.0

SETB P3.1

JNB P3.0,DIS_S ; 查询是否第一个按键按下

JNB P3.1,DIS_E ; 查询是否第二个按键按下

AJMP DIS_R ; 没有键按下则返回

DIS_S:LCALL D5MS ; 按键去抖

JNB P3.0,DIS_SN

AJMP DIS_R

DIS_SN:MOV 40H,#50 ; 对通行时间从新分配,南北通行时间加长

MOV 41H,#30

AJMP DIS_R

DIS_E:LCALL D5MS ; 按键去抖

JNB P3.1,DIS_EW

AJMP DIS_R

DIS_EW:MOV 40H,#30 ; 东西通行时间加长

MOV 41H,#50

DIS_R:RET

; *** *** *** 定时中断处理程序

DS_C: LJMP DS_R ; 接力跳转

DSZD: PUSH ACC ; 保护现场

PUSH PSW

CLR TR0 ; 关定时器及中断标志位并重新赋值

CLR TF0

MOV TL0,#0B0H

MOV TH0,#3CH

DJNZ R2,DS_C ; 判断1m时间是否到达

MOV R2,#20 ; 到达重新赋值

DEC 30H ; 南北方向通行时间减一

MOV A,30H ; 把减一后的时间送入显示存储单元

; *** *** *** 南北通行到达最后4秒时黄灯闪烁

DS_10:CJNE A,#4,DS_11 ; 如果通行时间剩余4秒

JNB SNF,DS_11 ; 判断是否是南北通行

MOV P0,#8AH

MOV 32H, #8AH ; 把交通灯状态存入存储单元(后面类似)

DS_11:CJNE A,#3,DS_12 ; 不是剩余3秒,返回

JNB SNF,DS_12 ; 不是南北通行时间,返回

MOV P0,#88H

MOV 32H, #88H

DS_12:CJNE A,#2,DS_13

JNB SNF,DS_13

MOV P0,#8AH

MOV 32H, #8AH

DS_13:CJNE A,#1,DS_14

JNB SNF,DS_14

MOV P0,#88H

MOV 32H, #88H

; *** *** ***

DS_14:JNZ DS_NE ; 通行时间没有结束转向改变东西方向的数码管

CPL SNF ; 如果通行时间结束则对标志位取反

JNB SNF,DS_1 ; 判断是否南北通行

MOV 30H,40H ; 是,点亮相应的交通灯

MOV P0,#4CH

MOV 32H,#4CH ; 存储交通灯状态

MOV P2,#15H

MOV 33H, #15H ; 存储交通灯状态

DS_NE:DEC 31H ; 东西方向通行时间减一

MOV A,31H ; 把通行剩余时间送入显示存储单元

; *** *** *** 东西方向通行时间剩余4秒钟黄灯闪烁(程序注释与南北方向类似 略)

DS_20:CJNE A,#4,DS_21

JB EWF,DS_21

MOV P0,#51H

MOV 32H, #51H

DS_21:CJNE A,#3,DS_22

JB EWF,DS_22

MOV P0,#41H

MOV 32H, #41H

DS_22:CJNE A,#2,DS_23

JB EWF,DS_23

MOV P0,#51H

MOV 32H, #51H

DS_23:CJNE A,#1,DS_24

JB EWF,DS_24

MOV P0,#41H

MOV 32H, #41H

; *** *** ***

DS_24:JNZ DS_R ; 东西方向时间没有结束,返回

CPL EWF ; 对通行状态取反

JNB EWF,DS_2 ; 东西方向通行时间到来,跳转

MOV 31H,#80 ; 东西方向通行结束,重新显示时间

MOV P0,#89H ; 点亮相应的交通灯

MOV 32H, #89H

MOV P2,#29H

MOV 33H, #29H

AJMP DS_R

DS_1: MOV 30H,#80 ; 南北通行时间结束,重新对显示存储单元赋值

MOV P0,#89H ; 执行转弯状态1

MOV 32H, #89H

MOV P2,#26H

MOV 33H, #26H

AJMP DS_NE

DS_2: MOV 31H,41H ; 东西方向开始通行,赋值予显示存储单元

MOV P0,#61H ; 点亮相应的交通灯

MOV 32H, #61H

MOV P2,#15H

MOV 33H, #15H

DS_R: SETB TR0

POP PSW ; 恢复现场

POP ACC

RETI

; *** *** *** 紧急中断处理程序

URZD: PUSH ACC ; 保护现场

PUSH PSW

CLR IE0 ; 清除中断标志位

CLR TR0 ; 关定时器

CPL URF ; 紧急事件标志位

JB URF,UR_CON ; 紧急结束;跳转

MOV P0,#49H ; 各路口灯全显示红灯亮

MOV P2,#15H

AJMP UR_R

UR_CON:SETB TR0 ; 恢复正常交通

MOV A,32H

MOV P0,A

MOV A,33H

MOV P2,A

UR_R: POP PSW ; 恢复现场

POP ACC

RETI

; *** *** *** 查表指令0,1,2,3,4,5,6,7,8,9

TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH

DB 7DH, 07H, 7FH, 6FH

; *** *** *** 延时5ms与1ms

D5MS: MOV R7,#5

D1MS: MOV R7,#10

MOV R6,#50

L1: DJNZ R6,$

DJNZ R7,L1

RET

阅读全文

与51单片机汇编语言100例相关的资料

热点内容
计算机专业学51单片机 浏览:206
程序员不接受反驳 浏览:294
微软自带的压缩软件 浏览:286
中国玩家在日本服务器做什么 浏览:48
12864和单片机 浏览:898
25匹空调压缩机 浏览:649
adkandroid下载 浏览:308
如何在苹果电脑上装python 浏览:327
哪个app的跑步训练内容最丰富 浏览:583
广讯通怎么删除文件夹 浏览:206
解压的视频化妆品 浏览:674
易语言新进程监视源码 浏览:941
turbo码译码算法 浏览:956
stc11f16xe单片机 浏览:282
linuxupdate命令行 浏览:578
pdf转化成wps 浏览:765
php抛出错误 浏览:159
买车看车用什么app 浏览:656
dos怎么清除屏幕上的命令 浏览:813
压缩裤冬天 浏览:449