完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#define MAIN_Fosc 11059200L //定义主时钟
#include "STC15Fxxxx.H" #define uchar unsigned char #define Baudrate1 9600L #define UART1_BUF_LENGTH 32 char buf; u8 TX1_Cnt; //发送计数 u8 RX1_Cnt; //接收计数 bit B_TX1_Busy; //发送忙标志 bit Send_ed; u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲 unsigned char ref; void UART1_config(u8 brt); // 选择波特率, 2: 使用timer2做波特率, 其它值: 使用Timer1做波特率. //void PrintString1(u8 *puts); //======================================================================== // 函数: void main(void) // 描述: 主函数。 // 参数: none. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void main(void) { P0M1 = 0x00; P0M0 = 0xFF; //设置为强推挽输出 P1M1 = 0x00; P1M0 = 0xFF; //设置为强推挽输出 P2M1 = 0x00; P2M0 = 0xFF; //设置为强推挽输出 P3M1 = 0x00; P3M0 = 0x3C; //设置为强推挽输出 P4M1 = 0x00; P4M0 = 0x7F; //设置为强推挽输出 P5M1 = 0x00; P5M0 = 0x3F; //设置为强推挽输出 P44=0; P04=0; P54=0; P55=0; P45=0; P53=0; P16=1; UART1_config(1); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. EA = 1; //允许总中断 // PrintString1("STC15F2K60S2 UART1 Test Prgramme!rn"); //SUART1发送一个字符串 ES=1; //允许串行中断 Send_ed=1; while (1) { buf = SBUF; switch(buf) { case 0x31:P44=1;P54=0;break; case 0x32:P04=1;P54=0;break; case 0x33:P45=1;P53=0;break; case 0x34:P53=1;P45=0;break; case 0x35:P45=1;P53=1;break; case 0x36:P45=0;P53=0;break; case 0x37: if(Send_ed==1) { Send_ed=0; if(P16==1) { ref = 0xAA; // SBUF=0xAA; SBUF = ref; // Send_ed=0; } else { SBUF = 0xBB; while(TI==0); TI=0; } } break; case 0x38: if(Send_ed==1) { ref=0x01; SBUF=ref; Send_ed=0; } else { SBUF=0xDD; } break; case 0x39: if(Send_ed==1) { SBUF=0xAA; Send_ed=0; } break; case 0x40:SBUF=0xAA; while(TI==0); TI=0; break; default:P44=0;P04=0;break; } // if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲 // { // SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回 // B_TX1_Busy = 1; // if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0; // } } } //======================================================================== // 函数: void PrintString1(u8 *puts) // 描述: 串口1发送字符串函数。 // 参数: puts: 字符串指针. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== //void PrintString1(u8 *puts) //发送一个字符串 //{ // for (; *puts != 0; puts++) //遇到停止符0结束 // { // SBUF = *puts; // B_TX1_Busy = 1; // while(B_TX1_Busy); // } //} //======================================================================== // 函数: SetTimer2Baudraye(u16 dat) // 描述: 设置Timer2做波特率发生器。 // 参数: dat: Timer2的重装值. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void SetTimer2Baudraye(u16 dat) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. { AUXR &= ~(1<<4); //Timer stop AUXR &= ~(1<<3); //Timer2 set As Timer AUXR |= (1<<2); //Timer2 set as 1T mode TH2 = dat / 256; TL2 = dat % 256; IE2 &= ~(1<<2); //禁止中断 AUXR |= (1<<4); //Timer run enable } //======================================================================== // 函数: void UART1_config(u8 brt) // 描述: UART1初始化函数。 // 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_config(u8 brt) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. { /*********** 波特率使用定时器2 *****************/ if(brt == 2) { AUXR |= 0x01; //S1 BRT Use Timer2; SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1); } /*********** 波特率使用定时器1 *****************/ else { TR1 = 0; AUXR &= ~0x01; //S1 BRT Use Timer1; AUXR |= (1<<6); //Timer1 set as 1T mode TMOD &= ~(1<<6); //Timer1 set As Timer TMOD &= ~0x30; //Timer1_16bitAutoReload; TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256); TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256); ET1 = 0; //禁止中断 INT_CLKO &= ~0x02; //不输出时钟 TR1 = 1; } /*************************************************/ SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率 // PS = 1; //高优先级中断 ES = 1; //允许中断 REN = 1; //允许接收 P_SW1 &= 0x3f; P_SW1 |= 0x00; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟) // PCON2 |= (1<<4); //内部短路RXD与TXD, 做中继, ENABLE,DISABLE B_TX1_Busy = 0; TX1_Cnt = 0; RX1_Cnt = 0; } //======================================================================== // 函数: void UART1_int (void) interrupt UART1_VECTOR // 描述: UART1中断函数。 // 参数: nine. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_int (void) interrupt 4 { if(RI) { RI = 0; RX1_Buffer[RX1_Cnt] = SBUF; if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0; //防溢出 } if(TI) { TI =0; Send_ed =1 ; B_TX1_Busy = 0; } } |
|
相关推荐
2个回答
|
|
现在有两个问题,一个是串口助手一直都有收到数据 停不下来,但是关闭串口助手再打开又收不到数据;
二是助手收到的数据是不对的,比如我发送的是0xAA,收到的是AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 AA 35 4D 53 .....这么一直收下去 |
|
|
|
1017352350 发表于 2017-11-28 14:02 软件上就是波特率的问题,很可能和硬件连接有关系 串口是TTL还是232/485 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
820 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第十一章 KEY实验
388 浏览 0 评论
783 浏览 0 评论
801 浏览 2 评论
飞凌嵌入式-ELFBOARD-ELF 2硬件知识分享-最小系统原理
466 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11932 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-12 23:33 , Processed in 0.832502 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号