关于单片机串口中断程序

关于单片机串口中断程序,第1张

当MCU接收到GPS发来的一个

字节

时触发中断,进入中断程序,(在进入中断渣亩哗程序时串口照样接收,中断程序是往串口

缓存

区读的数据,并且读数据时相当快的,永远不用担心还在读的时候数据被新来的给覆耐并盖了)将该接收的字节提取出放在一个

缓冲区

内,缓冲区是你自己

定义

的一个

数组

字符串

,谁你喜好,如你所述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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12510767.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存