字节
时触发中断,进入中断程序,(在进入中断渣亩哗程序时串口照样接收,中断程序是往串口
缓存
区读的数据,并且读数据时相当快的,永远不用担心还在读的时候数据被新来的给覆耐并盖了)将该接收的字节提取出放在一个
缓冲区
内,缓冲区是你自己
定义
的一个
数组
或
字符串
,谁你喜好,如你所述GPS是每隔1秒发送一次数据的,此时你可以在
主程序
中设计当0.5秒没有接收到GPS所发的数据时,就将缓冲区内的数据读出处理,并清空缓冲区,这样其实中断程序只管如行
接收数据
,
主函数
只管处理数据,两不相冲。
流程是:(主程序中)发送拿棚数据―等待中断―发送成功产生中断―进入中断滚或清除TL,再次发送消备则―中断返回―等待中断―发送成功产生中断―进入中断清除TL,再次发送。。。。循环而已。结部分我自己用的程序用参考下了***********************************************************************************************
ORG 0000H
SJMP START
ORG 0003H
LJMP INT0_INT
ORG 000BH
LJMP TIMER0_INT
ORG 0023H
LCALL UART_INT
RETI
-----------------------------------------------
START:
MOV SP,#70H
LCALL INITIAL 初始化
LCALL LOAD_DATA 读入EPORM数据
MOV A,DATA_SET_ALME 设置参数-警报开关
CLR ALM_ON
JZ SS1
SETB ALM_ON
SS1:
MOV DIS_S_DA1,DATA_SET_SET1
MOV DIS_S_DA2,DATA_SET_SET2
MOV DIS_S_DA3,DATA_SET_SET3
MOV DIS_S_DA4,DATA_SET_SET4
**************************************************
ORG 0050H
MAIN:
JNB KEY_HAVE_DO,MAIN_N1
LCALL KEY_INPUT_SCANF按键输入扫描
MAIN_N1:
JNB HAVE_DATA_DO,MAIN_N2 接收数据辩颤要处碧灶亩理
CLR HAVE_DATA_DO
LCALL DATA_MANAGER 接收数据处理
MAIN_N2:
JNB LED_OUT1,MAIN_N3
LCALL PLAUSE_OUT_STF
MAIN_N3:
JNB LED_OUT2,MAIN_N4
LCALL PLAUSE_OUT_STR
MAIN_N4:
JNB DATA_NEED_SAVE,MAIN_N5
CLR DATA_NEED_SAVE
LCALL SAVE_DATA
MAIN_N5:
JNB DATA_SET_NEED_SAVE,MAIN_N55
CLR DATA_SET_NEED_SAVE
LCALL SAVE_SET_DATA
MAIN_N55:
JB LED_ALM1,MAIN_N6
JB LED_ALM2,MAIN_N6
SETB ALM_OUT
SJMP MAIN_N7
MAIN_N6:
CLR ALM_OUT 警报输出
MAIN_N7:
----------------------
JNB FLASH_ON,MAIN_N8
LCALL FLASH_DO 闪烁
MAIN_N8:
------
INC DELAY_COUNT
MOV A,DELAY_COUNT
CJNE A,DATA_SET_TIME,MAIN_N10 设置参数-时间间隔
MOV DELAY_COUNT,#0
CLR LED_AT
JNB LGD_CHECK_BIT,MAIN_N9
SETB LED_AT 数悔森据中断
MOV DIS_DATA1,#14 E
MOV DIS_DATA2,#26 r
MOV DIS_DATA3,#26 r
MOV DIS_DATA4,#18
MAIN_N9:
LCALL LGD_SEND 查询发送
MAIN_N10:
LCALL DELAY
CPL LED
LCALL WARCH_DOG 喂看门狗
SJMP MAIN
-------------------------------------------------------
INT0_INT:
JB KEY_HAVE_DO,KEY_NO_DO
SETB KEY_HAVE_DO
KEY_NO_DO:
RETI
-------------------------------------------
***********************************************************************************
OUT_485 BIT P3.3485输出允许-低
****************************
UART_INT: 串口中断入口
CLR RI
CLR ES
PUSH ACC
PUSH PSW
PUSH B
LCALL UART_MANAGER
POP B
POP PSW
POP ACC
JB TR0,IS_ON_DELAY
CLR RI
SETB ES
IS_ON_DELAY:
RETI
*****************************
-----------------
UART_SEND: 发送
MOV SBUF,A
JNB TI,$
CLR TI
RET
奇偶发送
*****************************************
RECEIVE_ONE_BYTE: 防死循环接收一个字节 ,数据在A,RECEIVE_DATA_ERR 为1超时
MOV RECEIVE_DELAY1,#200 4Ms 实际1.3
RE_CHICK_RI:
JNB RI,RECEIVE_OUT_CHECK JNB RI,$
CLR RI
MOV A,SBUF
LCALL PARITY_CHECK 奇偶校验
JC RECEIVE_BYTE_ERR
CLR RECEIVE_DATA_ERR
RET
RECEIVE_OUT_CHECK:
MOV RECEIVE_DELAY2,#221 100uS 11.0592M(5T)
DJNZ RECEIVE_DELAY2,$
DJNZ RECEIVE_DELAY1,RE_CHICK_RI
RECEIVE_BYTE_ERR:
MOV A,#00H
SETB RECEIVE_DATA_ERR 接收超时
RET
********************************************
****************************************
LGD_SEND: 发送
CLR OUT_485_EA 485发
CLR ES
NOP
MOV A,#01H01
LCALL UART_SEND
MOV A,#41H41
LCALL UART_SEND
MOV A,#0DH0D
LCALL UART_SEND
NOP
CLR RI
SETB ES
SETB OUT_485_EA 485收
SETB LGD_CHECK_BIT
RET
*******************************************
UART_MANAGER:
MOV A,SBUF
CJNE A,#41H,RECEIVE_ERROR41
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR 接收超时
CJNE A,#30H,RECEIVE_ERROR30
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR 接收超时
MOV RECEIVE_DATA_BUF1,A D1
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR 接收超时
MOV RECEIVE_DATA_BUF2,A D2
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR 接收超时
MOV RECEIVE_DATA_BUF3,A D3
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR 接收超时
MOV RECEIVE_DATA_BUF4,AD4
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR 接收超时
D5
LCALL RECEIVE_ONE_BYTE ALL
JB RECEIVE_DATA_ERR,RECEIVE_ERROR 接收超时
LCALL RECEIVE_ONE_BYTE 45
CJNE A,#45H,RECEIVE_ERROR
JB RECEIVE_DATA_ERR,RECEIVE_ERROR 接收超时
CLR LGD_CHECK_BIT 接收成功
SETB HAVE_DATA_DO 接收数据要处理
RECEIVE_ERROR:
RET
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)