STC12C5A系列单片机串口编程.doc_第1页
STC12C5A系列单片机串口编程.doc_第2页
STC12C5A系列单片机串口编程.doc_第3页
STC12C5A系列单片机串口编程.doc_第4页
STC12C5A系列单片机串口编程.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STC12C5A系列单片机串口编程串口头文件uart.h如下:=/* File : uart.h* Description : This file is UART driver header of STC12C5A serial signal chip.* Author : Chao* Copyright : Chao* * History* -* Rev : 0.0* Date : 20/08/2011* * create.* -*/#ifndef UART_H_#define UART_H_/-Config-/#define UART1_EN /使能串口1#define UART1_RECEIVE_EN /允许串口1中断接收函数#define UART2_EN /使能串口2#define UART2_RECEIVE_EN /允许串口2中断接收函数/#define ECHO /使能回显/-Defines-/#define SystemFosc 22118400 /系统时钟:22.1184MHz#define UartBaud 9600 /串口波特率#define UART_BUFFER_SIZE 16 /串口数据缓冲区大小#define UartEndChar /串口数据结束字符/-Type define-/typedef struct unsigned int receive_flag; /数据接收标志unsigned char data_length; /数据缓冲区中有效数据个数 unsigned char receive_bufferUART_BUFFER_SIZE; /数据接收缓冲区void (* init)(void); /串口初始化函数void (* send_byte)(unsigned char ddata); /发送单个字符void (* send_string)(unsigned char *ddata, unsigned char length); /发送字符串 UART_T;/-Extern-/#ifdef UART1_ENextern UART_T uart1;#endif#ifdef UART2_ENextern UART_T uart2;#endif#endif /*UART_H_*/=串口编程C程序文件uart.c如下:=/* File : uart.c* Description : This file is UART driver of STC12C5A serial signal chip.* Author : Chao* Copyright : Chao* * History* -* Rev : 0.0* Date : 20/08/2011* * create.* -*/-Include files-/#include#includeuart.h/-Function Prototype-/#ifdef UART1_ENstatic void uart1_init(void); /串口1初始化函数static void uart1_send_byte(unsigned char ddata); /串口1发送单个字符static void uart1_send_string(unsigned char *ddata, unsigned char length); /串口1发送字符串 #endif#ifdef UART2_ENstatic void uart2_init(void); /串口2初始化函数static void uart2_send_byte(unsigned char ddata); /串口2发送单个字符static void uart2_send_string(unsigned char *ddata, unsigned char length); /串口2发送字符串#endif/-Variable-/unsigned long Fosc; /波特率设定时中间变量#ifdef UART1_EN UART_T uart1 = 0, / receive_flag0, / data_lengthHellon, / receive_bufferuart1_init, / inituart1_send_byte, / send_byteuart1_send_string / send_string;unsigned char uart1_receive_temp;unsigned char *uart1_receive_point=uart1.receive_buffer;#endif#ifdef UART2_ENunsigned char uart1_receive_temp;UART_T uart2 = 0, / receive_flag0, / data_lengthHellon, / receive_bufferuart2_init, / inituart2_send_byte, / send_byteuart2_send_string, / send_string;unsigned char uart2_receive_temp;unsigned char *uart2_receive_point=uart2.receive_buffer;#endif#ifdef UART1_EN/* * - FUNCTION -* Name : uart1_init * Description : 串口1初始化程序 * -*/ static void uart1_init(void) unsigned long baud;/选择波特率产生方式:采用独立波特率发生器AUXR |= S1BRS;/设定波特率发生器重新计数初值Fosc = SystemFosc/32;baud = UartBaud;if(baud 9600) AUXR |= BRTx12; /时钟频率不分频elseFosc /= 12;BRT = 256-Fosc/baud;/启动波特率发生器AUXR |= BRTR;SCON = 0x50; /设定串口1工作方式:方式1(8n1),允许接收 ES = 1; /开串口1中断/* * = FUNCTION -* Name : uart1_send_byte * Description : 串口1发送单个字节数据 * -*/ static void uart1_send_byte(unsigned char ddata) SBUF = ddata; /写入要发送的字符while(!TI); /等待发送完毕TI = 0; /清发送标志/* * = FUNCTION -* Name : uart1_send_string * Description : 串口1发送以0结尾的字符串 * -*/ static void uart1_send_string(unsigned char *ddata, unsigned char length) while(length-)uart1_send_byte(*ddata+); #ifdef UART1_RECEIVE_EN/* * = FUNCTION -* Name : ISR_uart1 * Description : 串口1中断数据接收程序* -*/void ISR_uart1(void) interrupt 4if(RI) /确认接收到字符uart1_receive_temp = SBUF;#ifdef ECHOuart1.send_byte(uart1_receive_temp);#endifif(uart1_receive_temp != UartEndChar) /如果没有接收到(假设接收缓冲区足够大) *uart1_receive_point+ = uart1_receive_temp;uart1.data_length+;elseuart1_receive_point = uart1.receive_buffer; /重新将接收字符指针指向接收缓冲区头uart1.receive_flag = 1; /置位接收命令完成标志RI = 0; /清接收标志 #endif#endif#ifdef UART2_EN/* * = FUNCTION -* Name : uart2_init * Description : 串口1初始化程序 * -*/ static void uart2_init(void) #ifndef UART1_ENunsigned long baud;/选择波特率产生方式:采用独立波特率发生器AUXR |= S1BRS;/设定波特率发生器重新计数初值Fosc = SystemFosc/32;baud = UartBaud;if(baud 9600) AUXR |= BRTx12; /时钟频率不分频elseFosc /= 12;BRT = 256-Fosc/UartBaud;/启动波特率发生器AUXR |= BRTR;#endifS2CON=0x50; /设定串口工作方式:方式1(8n1),允许接收IE2=0x01; /允许串口2中断/* * - FUNCTION -* Name : uart2_send_byte * Description : 串口2发送单个字节数据 * -*/ static void uart2_send_byte(unsigned char ddata) S2CON &= 0xFD; /清发送标志S2BUF = ddata; /发送数据while(!(S2CON&0x02); /等待发送完成/* * = FUNCTION -* Name : uart2_send_string * Description : 串口2发送以0结尾的字符串 * -*/ static void uart2_send_string(unsigned char *ddata, unsigned char length) while(length-)uart2_send_byte(*ddata+); #ifdef UART2_RECEIVE_EN/* * - FUNCTION -* Name : ISR_uart2 * Description : 串口2中断数据接收程序* -*/ void ISR_uart2(void) interrupt 8 /单片机接收从机发来的数据if(S2CON&0x01) /如果接收到数据uart2_receive_temp = S2BUF; /读取数据#ifdef ECHOuart2.send_byte(uart2_receive_temp);#endifif(uart2_receive_temp != UartEndChar) /如果没有接收到(假设接收缓冲区足够大) *uart2_receive_point+ = uart2_receive_temp;uart2.data_length+;elseuart2_receive_point = uart2.receive_buffer; /重新将接收字符指针指向接收缓冲区头uart2.receive_flag = 1; /置位接收命令完成标志S2CON &= 0xFE; /清接收标志 #endif#endif=通过上面两个文件,就能很方便的实现STC12C5A系列单片机中串口操作,并且能够通过配置uart.h文件来实现串口1、串口2的条件编译,测试主函数main.c如下:=#include#includeuart.hvoid Sys_init(void); /系统初始化void main()Sys_init();while(1)if(uart1.receive_flag)uart1.send_string(uart1.receive_buffer, uart1.data_length);uart1.receive_flag = 0;uart1.data_length = 0; if(uart2.receive_flag)uart2.send_string(uart2.receive_buffer, uart2.data_length);uart2.receive_flag = 0;uart2.data_length = 0; void Sys_init(void) /系统初始化uart1.init();uart1.send_string(uart1rn,7);uart2.i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论