⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10.asm

📁 非常实用的电子单片机设计程序
💻 ASM
字号:
;                 *************************************
;                 *       汽车通讯控制程序            *
;                 *           LOU RANMIAO             *
;                 *                 2001.4.24         *
;                 *************************************
;  *****************************************************************
;*                                                                    *
;* 后车信号接收     P1.0    1             40    VCC                   *
;* 前车信号接收     P1.1    2             39    P0.0    左转开关(L)   *
;*                  P1.2    3             38    P0.1    右转开关(L)   *
;*                  P1.3    4             37    P0.2    刹车开关(L)   *
;*                  P1.4    5             36    P0.3     前车左转指示 *
;*                  P1.5    6             35    P0.4     前车右转指示 *
;*                  P1.6    7             34    P0.5     后车超车指示 *
;*                  P1.7    8             33    P0.6     前车刹车指示 *
;*                  RST     9             32    P0.7                  *
;*                  P3.0    10   MCS-51   31    EA       VDD          *
;*                  P3.1    11            30    ALE                   *
;*   INTEX0         P3.2    12            29    PSEN                  *
;*   INTEX1         P3.3    13            28    P2.7                  *
;*                  P3.4    14            27    P2.6                  *
;*   remoteout      P3.5    15            26    P2.5                  *
;*                  P3.6    16            25    P2.4                  *
;*                  P3.7    17            24    P2.3                  *
;*                 XTAL2    18            23    P2.2                  *
;*                 XTAL1    19            22    P2.1                  *
;*                   VSS    20            21    P2.0                  *
;*                                                                    *
;*                                                                    *
;  *****************************************************************
;
;						发送接收一体板程序
;*************************************
;*                                   *
;*      主程序和中断程序入口         *
;*                                   *
;*************************************
		ORG     0000H					;程序开始地址
                LJMP    START			;转START
		ORG     0003H					;外中断0中断入口
                LJMP    INTEX0			;转INTEX0
		ORG     000BH					;定时器T0中断入口
                RETI						;返回
                ORG     0013H					;外中断1入口地址
       		LJMP    INTEX1			;转INTEX1
		ORG     001BH					;定时器T1中断入口
        	LJMP    INTT1			;转INTT1
		ORG     0023H					;串行口中断入口
		RETI						;中断返回
		ORG     002BH					;定时器T2中断入口
		RETI						;中断返回
;
;***************************
;*                         *
;*       初始化程序        *
;*                         *
;****************************
CLEARMEMIO:     CLR	A				;清A
		DEC	A				;A为#0FFH
		MOV     P1,A				;端口置1
                MOV     P2,A				;端口置1
                MOV     P3,A				;端口置1
                CLR     P3.5				;关遥控输出
CLEARMEM:       MOV     SP,#70H         ;设堆栈基址为70H
                MOV     IE,#00H         ;关所有中断
                MOV     IP,#01H			;外中断0为高优先级
                MOV     TMOD,#22H		;8位自动重装初值定时器
                MOV     TH1,#0F3H		;置13微秒定时器初值
                MOV     TL1,#0F3H		;
                SETB    EX0				;允许外中断0中断
                SETB    EX1				;允许外中断1中断
                CLR     ET1				;关定时器T1中断
                SETB    EA				;开总中断允许
		RET						;子程序返回
;
;*************************************
;*                                   *
;*	    主 程 序                     *
;*                                   *
;*************************************
START:          LCALL   CLEARMEMIO      ;上电初始化
;
MAIN:           LJMP    KEYWORK			;跳到查键程序
		NOP                     ;PC值出错处理
		NOP						;
		LJMP	START			;重新初始化启动
;
;*************************************
;*                                   *
;*        T1中断服务程序             *
;*                                   *
;*************************************
INTT1:          CPL     P3.5            ;产生40kHZ信号,用作红外线发射
		RETI						;中断返回
;
;
;*************************************
;*				                     *
;*         扫 键 程 序(主程序)     *
;*				                     *
;*************************************
;
KEYWORK:        SETB    P0.2				;置输入状态
                SETB    P0.0				;置输入状态
                SETB    P0.1				;置输入状态
                CLR     00H				;清00H刹车标志位
                JNB     P0.2,KEY3		;查刹车输入,为0转KEY3
KEY4:           JNB     P0.0,KEY0		;查左转输入,为0转KEY0
                JNB     P0.1,KEY1		;查右转输入,为0转KEY1
KEY5:           JB      00H,KEY2			;标志为1转KEY2
                SETB    EA				;标志为0,开总中断允许
                SETB    EX1				;开外中断1
                SETB    EX0				;开外中断0
                LCALL   DL10MS			;延时60毫秒
                LCALL   DL10MS			;
                LCALL   DL10MS			;
                LCALL   DL10MS			;
                LCALL   DL10MS			;
                LCALL   DL10MS			;
KEY6:           SETB    P0.3				;关前车左转提示输出
                SETB    P0.4				;关前车右转提示输出
                SETB    P0.5				;关后车超车提示输出
                SETB    P0.6				;关前车刹车提示输出
                LJMP    KEYWORK			;跳回KEYWORK循环
;
KEY3:           LCALL   DELAY			;延时消抖动
                JB      P0.2,KEY5		;是干扰转KEY5
                SETB    00H				;刹车标志置1
                LJMP    KEY4				;转KEY4查左右转弯按键
;
KEY0:           LCALL   DELAY			;延时消抖动
                JB      P0.0,KEY5		;是干扰转KEY5
                MOV     A,#02H			;发2个脉冲
                LJMP    REMOTE			;跳到发射程序
;
KEY1:           LCALL   DELAY			;延时消抖动
                JB      P0.1,KEY5		;是干扰转KEY5
                MOV     A,#05H			;发5个脉冲
                LJMP    REMOTE			;跳到发射程序
KEY2:           CLR     00H				;清00H标志
                MOV     A,#08H			;发8个脉冲
                LJMP    REMOTE			;跳到发射程序

;******************************
;  	前车信息接收程序(外中断0)
;******************************
;从P1.1口接收脉冲
INTEX0:         PUSH    ACC				;现场保护
                PUSH    PSW				;
                CLR     EX0				;关外中断0
                CLR     EX1				;关外中断1
                CLR     EA				;关总中断允许
                JNB     P1.1,READ1		;P1.1为0转READ1
READOUT0:       POP     PSW				;是干扰,中断退出
                POP     ACC				;
                RETI						;
;
READ1:          CLR     A				;清A
                MOV     DPH,A			;清DPTR
                MOV     DPL,A			;
HARD1:          JB      P1.1,HARD11     ;8*255=2.04ms,>2.04MS判定是起始位
                INC     DPTR				;低电平计数(周期为8微秒)
                NOP						;
                NOP
                AJMP    HARD1			;低电平循环计数
HARD11:         MOV     A,DPH			;
                JZ      READOUT0			;高8位为0,小于2.04MS,退出
                CLR     A				;>2.04MS判定是起始位
READ11:         INC     A				;脉冲数加1
READ12:         JNB     P1.1,READ12		;低电平等待
                MOV     R1,#0AH			;高电平脉宽判断用
READ13:         JNB     P1.1,READ11		;变低电平转READ11
                LCALL   DELAY         	; 延时512微秒
                DJNZ    R1,READ13		;延时小于10次转READ13循环
                DEC     A				;高电平宽大于5MS停止接收,A减1
                DEC     A				;再减1
                JZ      FLT				;是2个脉冲,执行FLT
                DEC     A				;
                DEC     A				;
                DEC     A				;
                JZ      FRT				;是5个脉冲,执行FRT
                DEC     A				;
                DEC     A				;
                DEC     A				;
                JZ      STOP				;是8个脉冲,执行STOP
                CLR     PX0				;外中断0置低优先级
                SETB    PX1				;外中断1置高优先级
                LJMP    READOUT0			;转中断退出
;
;******************************
;  	后车信息接收程序(外中断1)
;******************************
;接收程序原理同外中断0,从P1.0口接收脉冲
INTEX1:         PUSH    ACC				;
                PUSH    PSW				;
                CLR     EX1				;
                CLR     EX0				;
                CLR     EA				;
                JNB     P1.0,READ2		;
READOUT1:       POP     PSW				;
                POP     ACC				;
                RETI						;
READ2:          CLR     A				;
                MOV     DPH,A			;
                MOV     DPL,A			;
HARD2:          JB      P1.0,HARD21		;
                INC     DPTR				;
                NOP						;
                NOP						;
                AJMP    HARD2			;
HARD21:         MOV     A,DPH			;
                JZ      READOUT1			;
                CLR     A				;
READ21:         INC     A				;
READ22:         JNB     P1.0,READ22		;
                MOV     R1,#0AH			;
READ23:         JNB     P1.0,READ21		;
                LCALL   DELAY			;
                DJNZ    R1,READ23		;
                DEC     A				;
                DEC     A				;
                JZ      BLT				;是2个脉冲,后车超车转BLT
                CLR     PX1				;外中断0与外中断1交换中断优先级
                SETB    PX0				;
                LJMP    READOUT1			;转中断退出
;
FLT:            CLR     P0.3				;前车左转弯,P0.3为0
                LJMP    READOUT0			;转外中断0中断退出
FRT:            CLR     P0.4				;前车右转弯,P0.4为0
                LJMP    READOUT0			;转外中断0中断退出
BLT:            CLR     P0.5				;后车超车,P0.5为0
                LJMP    READOUT1			;转外中断1中断退出
STOP:           CLR     P0.6				;前车刹车,P0.6为0
                LJMP    READOUT0			;转外中断0中断退出
;
;********************************
;
;        载波发送程序
;
; *******************************
;A中数据为发射的脉冲个数
REMOTE:         CLR     EX0				;关外中断0
                CLR     EX1				;关外中断1
                MOV     R1,A				;发射脉冲个数入R1
                LJMP    OUT3				;第一位脉冲处理
OUT:            MOV     R0,#02H			;1毫秒脉冲控制
OUT1:           SETB    ET1				;开定时T1中断(40KHZ红外调制用)
                SETB    TR1				;开启T1
                LCALL   DELAY      		; 延时513微秒 6(2)*0.5=3MS(1MS)
                DJNZ    R0,OUT1			;总延时值不到转OUT1再循环
                MOV     R0,#02H			;赋1毫秒脉宽定时值
OUT2:           CLR     TR1				;关T1
                CLR     ET1				;关T1中断
                CLR     P3.5				;关红外线输出
                LCALL   DELAY      		; 延时513微秒
                DJNZ    R0,OUT2			;总延时(1MS)不到转OUT2再延时
                DJNZ    R1,OUT			;脉冲未发完,转OUT再发
                LCALL   DL10MS			;脉冲发完延时10毫秒(帧间隔)
                LJMP    KEY5				;脉冲发送结束跳到KEY5
OUT3:           MOV     R0,#06H			;3毫秒脉宽控制
                LJMP    OUT1				;转OUT1红外线发射
;
;
;*************************************
;*                                   *
;*      延时 249 * 2+2 = 500 us     *
;*                                   *
;*************************************
DELAY:          MOV     R7,#0F9H
DELAY1:         DJNZ    R7,DELAY1
		RET
;
;*************************************
;*                                   *
;*             延时10 ms            *
;*                                   *
;*************************************
DL10MS:         MOV     R6,#14H
DL10MS1:        LCALL   DELAY
                DJNZ    R6,DL10MS1
		RET
;
;
		END					;程序结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -