收藏 分享(赏)

Keil C51串口收发范例及说明.pdf

上传人:精品资料 文档编号:10856369 上传时间:2020-01-15 格式:PDF 页数:11 大小:732.53KB
下载 相关 举报
Keil C51串口收发范例及说明.pdf_第1页
第1页 / 共11页
Keil C51串口收发范例及说明.pdf_第2页
第2页 / 共11页
Keil C51串口收发范例及说明.pdf_第3页
第3页 / 共11页
Keil C51串口收发范例及说明.pdf_第4页
第4页 / 共11页
Keil C51串口收发范例及说明.pdf_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、/=串口编程示范说明=李斌20120802= 1 /* 2 此段包含串口1和定时器1的相关函数 3 波特率计算方法: 4 1T模式重装值=255-(FOSC/32/波特率),12T模式重装值=255-(FOSC/32/12/波特率) 5 波特率重装值0-7对应300,600,1200,2400,4800,9600,19200,28800 6 说明 7 使用22118400晶振,最大波特率28800bit/s 8 虽然波特率可以到28800,但建议使用115200或以下,中断函数功能较多,使用28800可能会导致堆栈溢出或因数 9 据率过高导致收发错误,如需要更高波特率,可以考虑更换晶振或精简函

2、数功能,减少判断语句或函数调用 10 最大缓冲区数量由常量Uart1_MaxString定义,建议为17,33,65,无论是做字符数组处理还是环回定长字符接收 11 做数字处理,实际大小都是Uart1_MaxString-1,即定义Uart1_MaxString为33时,实际为32个可操作字符,最后一 12 位恒定为0x00,方便指针判断. 13 14 自定义数据Uart1.Pattern决定接收方式是做字符数组处理还是做定长环回接收,当Uart1.Pattern=1时,做定长环 15 回接收,例如Uart1_MaxString=33,Uart1.Pattern=1时,PC机发送到第33个字符

3、时,触发Uart1.Read=1,允许接收, 16 第33字符将放入Uart1_Data的第一位并重新开始一轮新的循环. 17 18 如果Uart1_MaxString=33,Uart1.Pattern=0时,PC机发送任意长度的数据到单片机直到接收到与宏定义常数Uart1 19 _ASCII_Over相同的字时,触发Uart1.Read=1,一轮接收终止,当接收到超过32个字符时,接收都将被舍弃. 20 21 Uart1_SendDigital_L函数使用单字指针操作长整数,编译时会提示287行301行有指针错误,这是正常的. 22 串口接收采用中断方式,TI在发送完成后总是被立即置0,所以

4、在初使化这个程序块后,使用printf函数会造成TI查 23 询死机,由于printf函数本体只能工作在8位无校验方式,修改TI的工作方式后本程序块的校验模式就成了摆设,所 24 以,使用本程序块最好不要使用printf函数,当必须使用printf()函数转换数据类型且要求采用其他校验方式时, 25 可以先使用sprintf()函数写到内存后,再使用Uart1_SendString(char *s)发送 26 -串口编程示范- 27 28 * “main.c“文件内容 * 29 /文件包含 30 #include “STC.H“ 31 #include 32 #include “Uart1.c

5、“ /串口收发函数(printf函数不可用) 33 /函数申明 34 35 /主函数 36 void main() 37 38 Uart1_setup(); /初使化串口,在Uart1.c文件中Uart1_setup()函数中设定串口工作方式 39 while(1) 40 41 if(Uart1.Read) 42 /如果串口1数据可读 43 Uart1_SendString(Uart1_Data); /串口1回送接收的数据 44 Uart1.Read=0; /清可读标记(已读,为下次读出做准备) 45 46 47 48 49 * “Uart1.c“文件内容 * 50 /需要在“Uart1.c“

6、文件中修改串口工作参数的函数示范 51 void Uart1_Setup() 52 53 unsigned char U1Brt; /波特率重装值数组的指针 54 /串口参数设置- 55 U1Brt=6; /波特率设置,计数器重装值数组下标 从0开始至7顺序可选 300,600,1200,2400,4800,9600,19200,28800 56 Uart1.ParitySet=0; /校验方式设置, 从0开始至4顺序可选 无校验,奇校验,偶校验,掩码校验,空校验 57 Uart1.Pattern=0; /1做环回接收处理,0做字符数组处理 58 Uart1.Read=0; /清可读标记,并非

7、必要 59 /AUXR |= 0x01; /串口1时基源选择独立波特率发生器 60 AUXR /串口1时基源选择定时器1做波特率发生器 61 62 */ 63 64 65 /=程序正文= 66 /串口相关常量定义- 67 #define FOSC 22118400L /系统频率22118400L 68 #define Uart1_MaxString 33 /串口1最大接收缓冲区字符数量,与Uart1数据类型中的Data_Max意义是不同的 69 #define Uart1_ASCII_Over 0 /接收字符数组的停止标志 70 71 /串口相关变量定义- 72 const unsigned

8、char code Uart_Brt=63,159,207,231,111,183,219,231; 73 char xdata Uart1_DataUart1_MaxString; /串口1接收字串 74 struct Uart1 75 /串口1结构数据类型 76 unsigned char Data_P; /接收字串计数指针 77 unsigned char ParitySet; /奇偶校验方式 0不校验 1奇校验 2偶校验 3始终1 4始终0 78 unsigned char Pattern:1; /收发模式,0做字符数组处理,遇停止符停止,1做最大Uart1_MaxString位循环写

9、入 79 unsigned char Read:1; /接受字符组可读标记 80 unsigned char Parity:1; /接收到的奇偶校验状态 1,0 81 xdata Uart1; /结构变量名 82 83 /Uart1包含函数申明- 84 void Uart1_Setup(); /串口1波特率和时基源设置函数 85 void Uart1_SendData(unsigned char Uart1_dat); /串口1单字符发送函数 86 void Uart1_SendString(char *s); /串口1字符串发送函数 87 void Uart1_int(); /串口中断调用函

10、数 88 void Uart1_SendDigital_I(unsigned int U1I); /串口发送一个整数 89 void Uart1_SendDigital_L(unsigned long U1L); /串口发送一个长整数 90 /* 91 * 函数名称: void Uart1_Setup() 92 * 功能描述: 初始化串口函数 93 94 * 全局变量: PCON,SCON,TMOD,AUXR,TCON,TH1, 95 * 备 注:时钟为22118400Hz 96 参数1:波特率设置,300;600;1200;2400;4800;9600;19200 97 参数2:计数器选择,

11、0,定时器1;1,独立波特率 98 */ 99 void Uart1_Setup() 100 101 unsigned char U1Brt; /波特率重装值数组的指针 102 /串口参数设置- 103 U1Brt=6; /波特率设置,计数器重装值数组下标 从0开始至7顺序可选 300,600,1200,2400,4800,9600,19200,28800 104 Uart1.ParitySet=0; /校验方式设置, 从0开始至4顺序可选 无校验,奇校验,偶校验,掩码校验,空校验 105 Uart1.Pattern=0; /1做环回接收处理,0做字符数组处理 106 Uart1.Read=0

12、; /清可读标记,并非必要 107 /AUXR |= 0x01; /串口1时基源选择独立波特率发生器 108 AUXR /串口1时基源选择定时器1做波特率发生器 109 /初始化串口接收字串数组 110 for(Uart1.Data_P=0;Uart1.Data_P=Uart1_MaxString-1) Uart1.Data_P=0; /如果接收计数指针大于最大接收数,计数指针归0 205 Uart1_DataUart1.Data_P=SBUF; /写接收字符到接收字符数组 206 Uart1.Data_P+; /计数指针自加1 207 if(Uart1.Data_P=Uart1_MaxStr

13、ing-1) Uart1.Read=1; /如果计数指针等于最大接收数,可以读取 208 209 else 210 /做字符处理 211 if(Uart1.Data_PUart1_MaxString-1) 212 /如果接受字符组指针小于字符数组最大下标减1(字符数组最后一位始终为0x00,方便指针做底判断) 213 if(SBUF=Uart1_ASCII_Over) 214 /如果接受字符是0x00 215 Uart1_DataUart1.Data_P=SBUF; /接受数据写入字符数组 216 Uart1.Data_P=0; /字符数组下标归0 217 Uart1.Read=1; /串口数

14、据可读 218 219 else 220 /如果接受字符不是0x00 221 Uart1_DataUart1.Data_P=SBUF; /接受数据写入字符数组 222 Uart1.Data_P+; /字符数组下标自加1 223 224 225 else 226 /如果接受字符组指针大于等于字符数组最大下标减1 227 if(SBUF=Uart1_ASCII_Over) 228 /如果接受字符是0x00 229 Uart1.Data_P=0; /字符数组下标归0 230 Uart1.Read=1; /串口数据可读 231 232 233 234 235 236 237 238 /* 239 *

15、函数名称: void Uart1_SendData(unsigned char Uart1_dat) 240 * 功能描述: UART1 单个字符发送函数 241 * 输 入: unsigned char Uart1_dat 242 * 备 注:参数1:待发送的单个字符 243 */ 244 void Uart1_SendData(unsigned char Uart1_dat) 245 /UART 发送字节函数 246 bit TB8_Temp; 247 ACC = Uart1_dat; /被发送数据送累加器A,准备求奇偶校验位 P 248 TB8_Temp = P; /写奇偶校验标记 24

16、9 switch(Uart1.ParitySet) 250 /根据校验要求判断 251 case 0:TB8=0;break; /要求无校验 252 case 1:TB8=TB8_Temp;break; /要求奇校验,翻转TB8的值 253 case 2:TB8=TB8_Temp;break; /偶校验,TB8不变 254 case 3:TB8=1;break; /要求常1校验,TB8恒等于1 255 case 4:TB8=0;break; /要求常0校验,TB8恒等于0 256 default: break; /要求无校验 257 258 SBUF = Uart1_dat; /累加器 A 中

17、的数据送发送缓冲区发送 259 while(!TI); /等待发送完成 260 TI=0; /清已发送中断标记 261 262 263 /* 264 * 函数名称: void Uart1_SendString(char *s) 265 * 功能描述: UART1 按字符串发送函数 266 * 输 入: char *s 267 * 备 注:参数1:待发送的字符串 268 */ 269 void Uart1_SendString(char *s) 270 /UART 按字符串发送 271 while (*s) 272 /发送字符数据,遇到0x00停止 273 Uart1_SendData(*s+)

18、; /将待发字符串依次使用SendData函数按字节发送 274 275 276 277 /* 278 * 函数名称: void Uart1_SendDigital_I(unsigned int U1I); 279 * 功能描述: UART1 发送一个整数 280 * 输 入: unsigned int U1I 281 * 备 注:我也不想写的这么蠢,它妈堆栈太小没办法 282 */ 283 void Uart1_SendDigital_I(unsigned int U1I) 284 /UART 按整数发送 285 unsigned char *U1cI; 286 U1cI= 287 Uart

19、1_SendData(*U1cI+); 288 Uart1_SendData(*U1cI); 289 290 291 /* 292 * 函数名称: void Uart1_SendDigital_L(unsigned long U1L) 293 * 功能描述: UART1 发送一个长整数 294 * 输 入: unsigned long U1L 295 * 备 注:我也不想写的这么蠢,它妈堆栈太小没办法 296 */ 297 void Uart1_SendDigital_L(unsigned long U1L) 298 /UART 按长整数发送 299 unsigned char *U1cL;

20、300 U1cL= 301 Uart1_SendData(*U1cL); 302 U1cL+; 303 Uart1_SendData(*U1cL); 304 U1cL+; 305 Uart1_SendData(*U1cL); 306 U1cL+; 307 Uart1_SendData(*U1cL); 308 309 310 /*附录常用串口设置开关* 311 AUXR |= 0x01; /串口1选择独立波特率发生器 312 AUXR /串口1选择定时器1做波特率发生器 313 314 AUXR |= 0x40; /定时器1使用1T模式 315 AUXR /定时器1使用12T模式 316 317 AUXR |= 0x04; /独立波特率使用1T模式 318 AUXR /独立波特率使用12T模式 319 320 AUXR |= 0x10; /打开独立波特率发生器 321 AUXR /关闭独立波特率发生器 322 323 PCON |= 0x80; /串口1波特率加倍 324 PCON /串口1波特率不加倍 325 326 AUXR |= 0x08; /串口2波特率加倍 327 AUXR /串口2波特率不加倍 328 */ 329 330

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报