循迹小车源程序,用汇编语言写。 35
就是小车自己根据黑色轨道前进。如果脱离了轨道,可以自己回到轨道,有3个感应器(左,右,中)一起控制车子左转右转前进。急急急...
就是小车自己根据黑色轨道前进。如果脱离了轨道,可以自己回到轨道,有3个感应器(左,右,中) 一起控制车子 左转 右转 前进。
急急急 展开
急急急 展开
2个回答
展开全部
主程序和中断程序入口 *
;* *
;*************************************
;
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: MOV R0, #70H ;清70H-76H显示单元
MOV R7, #07H ;循环次数
ML0: MOV @R0, #00H ;清0
INC R0 ;下一地址
DJNZ R7, ML0 ;未完再循环
MOV TMOD,#10H ;T1为16位定时器
MOV R4,#14H ;1秒定时用(50毫秒20次)
MOV TL1,#0B0H ;50毫秒定时用初值
MOV TH1,#3CH ;
MOV 20H,#00H ;清0操作
MOV 21H,#00H ;
MOV 22H,#00H ;
MOV 23H,#00H ;
MOV 24H,#00H ;
CLR 30H ;清停车标志
SETB ET1 ;开T1中断
SETB EX1 ;开外中断1
SETB IT1 ;外中断1采用边沿触发
SETB IT0 ;外中断0优先级为1(最高)
SETB EX0 ;开外中断0
SETB EA ;开总中断允许
SETB TR1 ;开启定时器T1
RET ;子程序返回
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
;
START: LCALL CLEARMEMIO ;上电初始化
SETB P1.6 ;选择7.5V输出
CLR P1.7 ;选择7.5V输出
SETB P3.7 ;前进状态
CLR P3.6 ;前进状态
CLR P1.0 ;电机供电开始
;MAIN: LCALL DISP ;LED显示一次
LJMP MAIN ;转MAIN循环
NOP ;PC值出错处理
NOP
LJMP START ;重新初始化
;
;*************************************
;* *
;*外中断0服务程序,用作跑道位置处理 *
;* 23H作跑道计数器 *
;*************************************
INTEX0: PUSH ACC ;堆栈保护
PUSH PSW ;
CLR EX0 ;关中断
LCALL DISP ;LED显示一次(延时抗干扰)
JB P3.2,IN0RET ;P3.2为1退出(干扰)
INC 23H ;跑道计数器加1
MOV A,23H ;数据入A
CJNE A,#06H,JUDGE1 ;不是第6道转JUDGE1
LCALL STOP ;是第6道,停车
LJMP IN0RET ;转中断退出
JUDGE1: CJNE A,#03H,JUDGE2 ;不是第3道转JUDGE2
LCALL STOPSLOW ;是第3道,变慢车
LJMP IN0RET ;转中断退出
JUDGE2: CJNE A,#04H,JUDGE3 ;不是第4道转JUDGE3
LCALL FAST ;是第4道,变快车
LJMP IN0RET ;转中断退出
JUDGE3: CJNE A,#05H,IN0RET ;不是第5道转INORET退出
LCALL STOPSLOW ;是第5道,变慢车
IN0RET: CLR IE0 ;清外中断0中断标志
POP PSW ;恢复现场
POP ACC ;
LCALL DL7MS ;延时7毫秒(抗干扰)
SETB EX0 ;开外中断0
RETI ;中断返回
;
;************************************
;* 慢车控制子程序 *
;************************************
STOPSLOW: CLR P1.6 ;关7.5V电源
CPL P3.6 ;反向驱动(刹车)
CPL P3.7 ;反向驱动
LCALL DS50MS ;刹车时间(可根据试车情况调整)
LCALL DS50MS ;
LCALL DS50MS ;
CPL P3.6 ;正向驱动
CPL P3.7 ;正向驱动
SETB P1.7 ;开4.3V电源
RET ;返回
;
;************************************
;* 快车控制子程序 *
;************************************
FAST: CLR P1.7 ; 关4.3V电源
SETB P1.6 ; 开7.5V电源
RET ;返回
;
;************************************
;* 停车控制程序 *
;************************************
STOP: MOV 23H,#00H ;跑道计数单元清0
CPL P3.6 ;反向驱动(刹车)
CPL P3.7 ;反向驱动(刹车)
LCALL DS50MS ;刹车时间
LCALL DS50MS ;刹车时间(可调整)
SETB P1.0 ;关电机电源
SETB PT1 ;定时器T1为高优先级
LCALL DS10S ;停车10秒
CLR PT1 ;恢复T1为低优先级
SETB P1.6 ;开7.5V电源(高速)
CLR P1.7 ;关4.3V
CLR P1.0 ;电机电源开
CPL 30H ;停车点位置判断标志取反
JB 30H,STREN ;为1(中途停车)转STREN
LCALL CLR00 ;是终点,调复0程序
STREN: RET ;返回
;* *
;*************************************
;
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: MOV R0, #70H ;清70H-76H显示单元
MOV R7, #07H ;循环次数
ML0: MOV @R0, #00H ;清0
INC R0 ;下一地址
DJNZ R7, ML0 ;未完再循环
MOV TMOD,#10H ;T1为16位定时器
MOV R4,#14H ;1秒定时用(50毫秒20次)
MOV TL1,#0B0H ;50毫秒定时用初值
MOV TH1,#3CH ;
MOV 20H,#00H ;清0操作
MOV 21H,#00H ;
MOV 22H,#00H ;
MOV 23H,#00H ;
MOV 24H,#00H ;
CLR 30H ;清停车标志
SETB ET1 ;开T1中断
SETB EX1 ;开外中断1
SETB IT1 ;外中断1采用边沿触发
SETB IT0 ;外中断0优先级为1(最高)
SETB EX0 ;开外中断0
SETB EA ;开总中断允许
SETB TR1 ;开启定时器T1
RET ;子程序返回
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
;
START: LCALL CLEARMEMIO ;上电初始化
SETB P1.6 ;选择7.5V输出
CLR P1.7 ;选择7.5V输出
SETB P3.7 ;前进状态
CLR P3.6 ;前进状态
CLR P1.0 ;电机供电开始
;MAIN: LCALL DISP ;LED显示一次
LJMP MAIN ;转MAIN循环
NOP ;PC值出错处理
NOP
LJMP START ;重新初始化
;
;*************************************
;* *
;*外中断0服务程序,用作跑道位置处理 *
;* 23H作跑道计数器 *
;*************************************
INTEX0: PUSH ACC ;堆栈保护
PUSH PSW ;
CLR EX0 ;关中断
LCALL DISP ;LED显示一次(延时抗干扰)
JB P3.2,IN0RET ;P3.2为1退出(干扰)
INC 23H ;跑道计数器加1
MOV A,23H ;数据入A
CJNE A,#06H,JUDGE1 ;不是第6道转JUDGE1
LCALL STOP ;是第6道,停车
LJMP IN0RET ;转中断退出
JUDGE1: CJNE A,#03H,JUDGE2 ;不是第3道转JUDGE2
LCALL STOPSLOW ;是第3道,变慢车
LJMP IN0RET ;转中断退出
JUDGE2: CJNE A,#04H,JUDGE3 ;不是第4道转JUDGE3
LCALL FAST ;是第4道,变快车
LJMP IN0RET ;转中断退出
JUDGE3: CJNE A,#05H,IN0RET ;不是第5道转INORET退出
LCALL STOPSLOW ;是第5道,变慢车
IN0RET: CLR IE0 ;清外中断0中断标志
POP PSW ;恢复现场
POP ACC ;
LCALL DL7MS ;延时7毫秒(抗干扰)
SETB EX0 ;开外中断0
RETI ;中断返回
;
;************************************
;* 慢车控制子程序 *
;************************************
STOPSLOW: CLR P1.6 ;关7.5V电源
CPL P3.6 ;反向驱动(刹车)
CPL P3.7 ;反向驱动
LCALL DS50MS ;刹车时间(可根据试车情况调整)
LCALL DS50MS ;
LCALL DS50MS ;
CPL P3.6 ;正向驱动
CPL P3.7 ;正向驱动
SETB P1.7 ;开4.3V电源
RET ;返回
;
;************************************
;* 快车控制子程序 *
;************************************
FAST: CLR P1.7 ; 关4.3V电源
SETB P1.6 ; 开7.5V电源
RET ;返回
;
;************************************
;* 停车控制程序 *
;************************************
STOP: MOV 23H,#00H ;跑道计数单元清0
CPL P3.6 ;反向驱动(刹车)
CPL P3.7 ;反向驱动(刹车)
LCALL DS50MS ;刹车时间
LCALL DS50MS ;刹车时间(可调整)
SETB P1.0 ;关电机电源
SETB PT1 ;定时器T1为高优先级
LCALL DS10S ;停车10秒
CLR PT1 ;恢复T1为低优先级
SETB P1.6 ;开7.5V电源(高速)
CLR P1.7 ;关4.3V
CLR P1.0 ;电机电源开
CPL 30H ;停车点位置判断标志取反
JB 30H,STREN ;为1(中途停车)转STREN
LCALL CLR00 ;是终点,调复0程序
STREN: RET ;返回
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询