128例程資料
0.jpg (31.9 KB, 下載次數(shù): 67)
下載附件
2018-4-12 03:31 上傳
實驗名稱:串口通信實驗
功能描述:計算機通過串口向開發(fā)板發(fā)送數(shù)據(jù),開發(fā)板將數(shù)據(jù)原樣送回。
實驗?zāi)康模簩W(xué)習(xí)串口通信
實驗說明:MCU--M128
內(nèi)部8M晶振
連接方式:利用串口線將開發(fā)板和計算機相連。
單片機源程序如下:
- /************************************************
- 文件:sio.c
- 用途:結(jié)構(gòu)化串口通信程序
- ************************************************/
- #include "config.h"
- #if USEUART0
- siocirqueue RTbuf_UART0;
- #endif
- #if USEUART1
- siocirqueue RTbuf_UART1;
- #endif
- #if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
- #define USEUART0 TRUE
- #define USEUART1 FALSE
- #define iv_USART0_RXC iv_USART_RXC
- #define iv_USART0_TXC iv_USART_TXC
- #define UDR0 UDR
- #define UCSR0A UCSRA
- #define UCSR0B UCSRB
- #define UCSR0C UCSRC
- #define UBRR0H UBRRH
- #define UBRR0L UBRRL
- #define RXCIE0 RXCIE
- #define TXCIE0 TXCIE
- #endif
- /*********************************************************************************************************
- ** 函數(shù)名稱: Com_init
- ** 功能描述: 初始化串行口
- ** 輸 入:
- ** 全局變量: 無
- ** 調(diào)用模塊: Com_baudrate
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- void Com_init (void) {
- //WDR(); //喂狗
- //CLI(); // 關(guān)中斷
- #if USEUART0
- Tbuf_init(&RTbuf_UART0); //初始化接收緩沖
- Rbuf_init(&RTbuf_UART0);
- UCSR0B = 0x00; //disable while setting baud rate
- UCSR0A=0x00;
- #if CPU_TYPE <= M32
- UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
- UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
- #else
- UCSR0C=0x06; //8 DATA ,1 STOP, NO PARITY
- UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0); // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1
- #endif
- #endif
- #if USEUART1
- Tbuf_init(&RTbuf_B); //初始化接收緩沖
- Rbuf_init(&RTbuf_B);
- UCSR1B = 0x00; //disable while setting baud rate
- UCSR1A = 0x00;
- UCSR1C = 0x06;
- UCSR1B = 0xD8;
- #endif
- Com_baudrate (9600); //
- //SEI(); // 開中斷
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Com_baudrate
- ** 功能描述: 利用定時器T1產(chǎn)生由參數(shù)baudrate指定的波特率
- ** 輸 入: baudrate指定的波特率
- ** 全局變量: 無
- ** 調(diào)用模塊: 無
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- void Com_baudrate (unsigned int baudrate) {
- unsigned int tmp;
- tmp= F_CPU/baudrate/16-1;
- #if USEUART0
- UBRR0H=(unsigned char)(tmp>>8);
- UBRR0L=(unsigned char)tmp;
- #endif
- #if USEUART1
- UBRR1H=(unsigned char)(tmp>>8);
- UBRR1L=(unsigned char)tmp;
- #endif
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Com_putchar
- ** 功能描述: 從串行口輸出一個字符c
- ** 輸 入: c:輸出字符
- ** 輸出 : 0:失敗 1:成功
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) {
- //WDR(); //喂狗
- if (Tbuf_full(RTbuf))
- return(0);
- else{
- Tbuf_putchar(c,RTbuf); // 將數(shù)據(jù)加入到發(fā)送緩沖區(qū)并開中斷
- return(1);
- }
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Com_putstring
- ** 功能描述: 從串行口輸出一個字符串
- ** 輸 入: p:指向輸出字符串 len:輸出長度
- ** 輸出 :
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
- unsigned char i;
- //WDR(); //喂狗
- if (len!=0 ){
- for(i=0;i<len;i++)
- while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;
- }
- else {
- do{
- while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;
- }while(*p++!='\n');
- }
-
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Com_getchar
- ** 功能描述: 從串行口輸入一個字符
- ** 輸 入: mode:0不需等待,在調(diào)用函數(shù)前檢測Com_R_count的值
- ** 1 等待數(shù)據(jù)到來
- ** 輸出 : 讀入的字符
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- unsigned char Com_getchar (unsigned char mode,siocirqueue *RTbuf) {
- //WDR(); //喂狗
- // Delay(Delay_Comget,MaxLimit_Comget_Delay);
- // if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗;
- // if (DelayOvf(Delay_Comget))
- // return 0; //時間超時
- // else
-
- while(!Com_R_count(RTbuf));
- return (Rbuf_getchar(RTbuf));// 串行口輸入正確,返回輸入的字符
- }
- void Com_Rbuf_Clear(siocirqueue *RTbuf){
- Rbuf_init(RTbuf);
- }
- unsigned char Com_getstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) {
- unsigned char i=0;
- //WDR(); //喂狗
- if (len>0 ){
- for(i=0;i<len;i++){
- //WDR(); //喂狗
- *p++=Com_getchar(1,RTbuf);
- }
- return(len);
- }
- else{
-
-
- do{
- *p++=Com_getchar(1,RTbuf);
- i++;
- //WDR(); //喂狗
- }while(*(p-1)!='\n');
- // *p++=Com_getchar(1,RTbuf);
- // *(p)=0;
- return(i);
- }
-
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Com_R_count
- ** 功能描述: 返回接收緩沖區(qū)字符個數(shù)函數(shù)
- ** 輸 入:
- ** 輸出 : 字符個數(shù)
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- unsigned char Com_R_count(siocirqueue *RTbuf){
- return RTbuf->R_count;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Rbuf_init
- ** 功能描述: 接收緩沖區(qū)初始化
- ** 輸 入:
- ** 輸出 :
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- void Rbuf_init(siocirqueue *RTbuf){
- RTbuf->R_front=0;
- RTbuf->R_rear=0;
- RTbuf->R_count=0;
- RTbuf->R_overflow=0;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Tbuf_init
- ** 功能描述: 發(fā)送緩沖區(qū)初始化
- ** 輸 入:
- ** 輸出 :
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- void Tbuf_init(siocirqueue *RTbuf){
- RTbuf->T_front=0;
- RTbuf->T_rear=0;
- RTbuf->T_count=0;
- RTbuf->T_disabled=1;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Rbuf_empty
- ** 功能描述: 接收緩沖區(qū)判空
- ** 輸 入:
- ** 輸出 : TRUE 空 FALSE 非空
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- unsigned char Rbuf_empty(siocirqueue *RTbuf){
- return RTbuf->R_count==0;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Tbuf_empty
- ** 功能描述: 發(fā)送緩沖區(qū)判空
- ** 輸 入:
- ** 輸出 : TRUE 空 FALSE 非空
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************
- unsigned char Tbuf_empty(void){
- return RTbuf->T_count==0;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Rbuf_full
- ** 功能描述: 接收緩沖區(qū)判滿
- ** 輸 入:
- ** 輸出 : TRUE 滿 FALSE 非滿
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************
- unsigned char Rbuf_full (void){
- return RTbuf->R_count==RBUF_SIZE;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Tbuf_full
- ** 功能描述: 發(fā)送緩沖區(qū)判滿
- ** 輸 入:
- ** 輸出 : TRUE 滿 FALSE 非滿
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- unsigned char Tbuf_full(siocirqueue *RTbuf){
- return RTbuf->T_count==TBUF_SIZE;
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Rbuf_putchar
- ** 功能描述: 把一個字符放入接收緩沖區(qū)
- ** 輸 入:
- ** 輸出 :
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************
- void Rbuf_putchar (unsigned char x){
- if(!Rbuf_full()){
- REV_DIS();
- RTbuf->R_count++;
- RTbuf->R_buf[RTbuf->R_rear]=x;
- RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
- REV_EN();
- }
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Tbuf_putchar
- ** 功能描述: 把一個字符放入發(fā)送緩沖區(qū)
- ** 輸 入:
- ** 輸出 :
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- void Tbuf_putchar(unsigned char x,siocirqueue *RTbuf){
- if(!Tbuf_full(RTbuf)){
- TXC_DIS();
- if (RTbuf->T_disabled)
- {
- UDR0=x;
- RTbuf->T_disabled=0;
- }
- else
- {
- RTbuf->T_count++;
- RTbuf->T_buf[RTbuf->T_rear]=x;
- RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;
- }
- TXC_EN();
- }
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Rbuf_getstring
- ** 功能描述: 從接收緩沖區(qū)返回當前子串指針
- ** 輸 入:
- ** 輸出 : 當前子串指針
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************
- unsigned char * Rbuf_getstring(void){
- return (RTbuf->R_buf[RTbuf->R_front]);
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Tbuf_getstring
- ** 功能描述: 從發(fā)送緩沖區(qū)返回當前子串指針
- ** 輸 入:
- ** 輸出 : 當前子串指針
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************
- unsigned char * Tbuf_getstring(void){
- return (RTbuf->T_buf[RTbuf->T_front]);
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Rbuf_putchar
- ** 功能描述: 從接收緩沖區(qū)讀一個字符
- ** 輸 入:
- ** 輸出 : 讀字符
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************/
- unsigned char Rbuf_getchar(siocirqueue *RTbuf){
- unsigned char Btemp=0;
- if (!Rbuf_empty(RTbuf)){
- Btemp=RTbuf->R_buf[RTbuf->R_front];
- REV_DIS();
- RTbuf->R_count--;
- RTbuf->R_front=(RTbuf->R_front+1) % RBUF_SIZE;
- REV_EN();
- }
- return (Btemp);
-
- }
- /*********************************************************************************************************
- ** 函數(shù)名稱: Tbuf_getchar
- ** 功能描述: 從發(fā)送緩沖區(qū)讀一個字符
- ** 輸 入:
- ** 輸出 : 讀字符
- ** 全局變量: 無
- ** 調(diào)用模塊:
- ** 說明:
- ** 注意:
- ********************************************************************************************************
- unsigned char Tbuf_getchar(void){
- unsigned char Btemp;
- if (!Tbuf_empty()){
- Btemp=RTbuf->T_buf[RTbuf->T_front];
- TXC_DIS();
- RTbuf->T_count--;
- RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;
- TXC_EN();
- return (Btemp);
- }
- }
- */
- /******************************* 中斷處理函數(shù) ***************************
- * 功能:完成數(shù)據(jù)得的接收和發(fā)送
- ***********************************************************************/
- #if USEUART0
- #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
- void uart0_rx_isr(void)
- {
- unsigned char status,data;
- siocirqueue *RTbuf;
- RTbuf=&RTbuf_UART0;
- // CLI();
- status=UCSR0A;
- data=UDR0;
- //WDR(); //喂狗
- if((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
- {
- if(RTbuf->R_count<RBUF_SIZE){
- RTbuf->R_count++;
- RTbuf->R_buf[RTbuf->R_rear]=data;
- RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;
- }
- else
- {
- RTbuf->R_overflow=1;
- }
- }
- //SEI();
- }
-
- #pragma interrupt_handler uart0_tx_isr: iv_USART0_TXC
- void uart0_tx_isr(void)
- {
- //CLI();
- siocirqueue *RTbuf;
- //WDR(); //喂狗
- RTbuf=&RTbuf_UART0;
- if (RTbuf->T_count>0){
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼 uCOS-II移植\
串口收發(fā)\
復(fù)件 跑馬燈實驗2\
外部中斷程序\
跑馬燈實驗1\
跑馬燈實驗2\
跑馬燈實驗3\
所有資料51hei提供下載:
例程.rar
(332.91 KB, 下載次數(shù): 216)
2018-4-11 19:54 上傳
點擊文件名下載附件
例程 下載積分: 黑幣 -5
|