下面是单片机里面的汇编程序:
ORG 0000H
AJMP MAIN
ORG 0023H ;串行中断入口地址
JMP COM_INT ;串行中断服务程序
;*********** 主程序开始 *******************
ORG 0030H
MAIN: MOV SP,#30H ;设置堆栈
CALL REST ;初始化
CALL COMM ;串口初始化
JMP $ ;原地等待
; ************* 初始化 *********************
REST: MOV P0,#0FFH ;禁止数码管显示
MOV P2,#255
RET ;返回
; ************** 串口初始化 *****************
;设置串行口工作方式1,定时器1作为波特率发生器
;波特率设置为 4800 ;
COMM: MOV TMOD,#20H ;设置定时器t1工作方式2
MOV TL1,#0F4H ;定时器计数初值,波特率 2400
MOV TH1,#0F4H ;定时器重装值
SETB EA ;允许总的中断
SETB ES ;允许串行中断
MOV PCON,#80H ;波特率倍增
MOV SCON,#50H ;设置串口工作方式1,ren = 1 允许接收
SETB TR1 ;定时器开始工作
RET ;返回
;*************** 串口中断服务程序 ***********
; 如果接收 "A" 表示上位机需要联机信号,单片机发送 "Y"作为
; 应答信号,如果接收到 数字 1~ N,表示相应的功能;
; 这里,如果收到 1 ,则单片机向计算机发送字符 'A';
; 如果收到 2 ,则单片机向计算机发送字符 'B';
; 如果收到其他的数据,则发送 'C';
COM_INT: CLR ES ;禁止串行中断
CLR RI ;清除接收标志位
MOV A,SBUF ;从缓冲区取出数据
MOV P1,A
MOV DPTR,#TAB
CJNE A,#041H,IN_1 ;检查数据
MOV SBUF,#59H ;收到联机信号"A",发送联机信号"Y"
JNB TI,$ ;等待发送完毕
CLR TI ;清除发送标志
SETB ES ;允许串行中断
RETI ;中断返回
IN_1: JNE A,#01h, IN_2 ;如果收到1
MOVC A,@A+DPTR
MOV SBUF,A ;发送 'A'
JNB TI,$ ;等待发送完毕
CLR TI ;清除发送中断标志
SETB ES ;允许串行中断
RETI ;中断返回
IN_2: CJNE A,#02,IN_3 ;接收到 2
MOVC A,@A+DPTR
MOV SBUF,A ;发送 'B'
JNB TI,$ ;等待发送完毕
CLR TI ;清除发送中断
SETB ES ;允许串行中断
RETI ;中断返回
IN_3: MOV A,#03H
MOVC A,@A+DPTR
MOV SBUF,A ;发送 'C'
JNB TI,$ ;等待发送完毕
CLR TI ;清除发送中断标志
SETB ES ;允许串行中断
RETI ;返回
;查表数据区
TAB: DB 'X','A','B','C'
END
评论