完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
自己写的UART通信,RTX接收一个字节,之后从P0.0发送。用开发板+串口调试助手实现,为什么16进制发20,收到的是16进制60?
#include unsigned char shuju; ***it k=P0^0; void UART_init() { SCON=0x50; TMOD=0x20; //波特率9600 TH1=0xFD; //波特率9600 TL1=0xFD; //波特率9600 ES=1; EA=1; TR1=1; k=1; } void send_bit(unsigned char i) { unsigned char j; k=0; for(j=0;j<8;j++) { k=i&0x01; i=i>>1; } k=1; } main() { UART_init(); while(1) { if(RI) { send_bit(shuju); RI=0; REN=1; } } } void jieshou() interrupt 4 { if(RI) { shuju=SBUF; REN=0; } } |
|
相关推荐
1个回答
|
|
在main中使用if(RI)应该会出现问题,因为中断函数中也有RI的判断,RI应该在中断中置零,不然二者应该要冲突的吧,建议将send_bit使用中断中的变量进行触发
以下参考官方ISP软件中的例子: #include "reg51.h" #include "intrins.h" typedef unsigned char BYTE; typedef unsigned int WORD; #define FOSC 11059200L //System frequency #define BAUD 9600 //UART baudrate /*Define UART parity mode*/ #define NONE_PARITY 0 //None parity #define ODD_PARITY 1 //Odd parity #define EVEN_PARITY 2 //Even parity #define MARK_PARITY 3 //Mark parity #define SPACE_PARITY 4 //Space parity #define PARITYBIT EVEN_PARITY //Testing even parity sfr AUXR1 = 0xA2; #define UART_P1 0x80 //(AUXR1.7) switch RXD/TXD from P3.0/P3.1 to P1.6/P1.7 ***it bit9 = P2^2; //P2.2 show UART data bit9 bit busy; void SendData(BYTE dat); void SendString(char *s); void main() { AUXR1 |= UART_P1; //switch RXD/TXD from P3.0/P3.1 to P1.6/P1.7 #if (PARITYBIT == NONE_PARITY) SCON = 0x50; //8-bit variable UART #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) SCON = 0xda; //9-bit variable UART, parity bit initial to 1 #elif (PARITYBIT == SPACE_PARITY) SCON = 0xd2; //9-bit variable UART, parity bit initial to 0 #endif TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule TR1 = 1; //Timer1 start run ES = 1; //Enable UART interrupt EA = 1; //Open master interrupt switch SendString("STC10/11xxrnUart Test !rn"); while(1); } /*---------------------------- UART interrupt service routine ----------------------------*/ void Uart_Isr() interrupt 4 using 1 { if (RI) { RI = 0; //Clear receive interrupt flag P0 = SBUF; //P0 show UART data bit9 = RB8; //P2.2 show parity bit } if (TI) { TI = 0; //Clear transmit interrupt flag busy = 0; //Clear transmit busy flag } } /*---------------------------- Send a byte data to UART Input: dat (data to be sent) Output:None ----------------------------*/ void SendData(BYTE dat) { while (busy); //Wait for the completion of the previous data is sent ACC = dat; //Calculate the even parity bit P (PSW.0) if (P) //Set the parity bit according to P { #if (PARITYBIT == ODD_PARITY) TB8 = 0; //Set parity bit to 0 #elif (PARITYBIT == EVEN_PARITY) TB8 = 1; //Set parity bit to 1 #endif } else { #if (PARITYBIT == ODD_PARITY) TB8 = 1; //Set parity bit to 1 #elif (PARITYBIT == EVEN_PARITY) TB8 = 0; //Set parity bit to 0 #endif } busy = 1; SBUF = ACC; //Send data to UART buffer } /*---------------------------- Send a string to UART Input: s (address of string) Output:None ----------------------------*/ void SendString(char *s) { while (*s) //Check the end of the string { SendData(*s++); //Send current char and increment string ptr } } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压
126 浏览 0 评论
【RA-Eco-RA0E1-32PIN-V1.0开发板试用】开发板简介与上电测试
269 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之传参
441 浏览 0 评论
【xG24 Matter开发套件试用体验】点灯之后的UART测试
509 浏览 0 评论
【xG24 Matter开发套件试用体验】第一个LED测试工程
435 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11005 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-7 08:07 , Processed in 0.392118 second(s), Total 39, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号