欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
AVR128單片機最小系統串口,外部中斷,跑馬燈,uCOS-II移植例程源碼分享
[打印本頁]
作者:
13333
時間:
2018-4-11 19:56
標題:
AVR128單片機最小系統串口,外部中斷,跑馬燈,uCOS-II移植例程源碼分享
128例程資料
0.jpg
(31.9 KB, 下載次數: 67)
下載附件
2018-4-12 03:31 上傳
實驗名稱:串口通信實驗
功能描述:計算機通過串口向開發板發送數據,開發板將數據原樣送回。
實驗目的:學習串口通信
實驗說明:MCU--M128
內部8M晶振
連接方式:利用串口線將開發板和計算機相連。
單片機源程序如下:
/************************************************
文件:sio.c
用途:結構化串口通信程序
************************************************/
#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
/*********************************************************************************************************
** 函數名稱: Com_init
** 功能描述: 初始化串行口
** 輸 入:
** 全局變量: 無
** 調用模塊: Com_baudrate
** 說明:
** 注意:
********************************************************************************************************/
void Com_init (void) {
//WDR(); //喂狗
//CLI(); // 關中斷
#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(); // 開中斷
}
/*********************************************************************************************************
** 函數名稱: Com_baudrate
** 功能描述: 利用定時器T1產生由參數baudrate指定的波特率
** 輸 入: baudrate指定的波特率
** 全局變量: 無
** 調用模塊: 無
** 說明:
** 注意:
********************************************************************************************************/
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
}
/*********************************************************************************************************
** 函數名稱: Com_putchar
** 功能描述: 從串行口輸出一個字符c
** 輸 入: c:輸出字符
** 輸出 : 0:失敗 1:成功
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) {
//WDR(); //喂狗
if (Tbuf_full(RTbuf))
return(0);
else{
Tbuf_putchar(c,RTbuf); // 將數據加入到發送緩沖區并開中斷
return(1);
}
}
/*********************************************************************************************************
** 函數名稱: Com_putstring
** 功能描述: 從串行口輸出一個字符串
** 輸 入: p:指向輸出字符串 len:輸出長度
** 輸出 :
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
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');
}
}
/*********************************************************************************************************
** 函數名稱: Com_getchar
** 功能描述: 從串行口輸入一個字符
** 輸 入: mode:0不需等待,在調用函數前檢測Com_R_count的值
** 1 等待數據到來
** 輸出 : 讀入的字符
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
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);
}
}
/*********************************************************************************************************
** 函數名稱: Com_R_count
** 功能描述: 返回接收緩沖區字符個數函數
** 輸 入:
** 輸出 : 字符個數
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
unsigned char Com_R_count(siocirqueue *RTbuf){
return RTbuf->R_count;
}
/*********************************************************************************************************
** 函數名稱: Rbuf_init
** 功能描述: 接收緩沖區初始化
** 輸 入:
** 輸出 :
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
void Rbuf_init(siocirqueue *RTbuf){
RTbuf->R_front=0;
RTbuf->R_rear=0;
RTbuf->R_count=0;
RTbuf->R_overflow=0;
}
/*********************************************************************************************************
** 函數名稱: Tbuf_init
** 功能描述: 發送緩沖區初始化
** 輸 入:
** 輸出 :
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
void Tbuf_init(siocirqueue *RTbuf){
RTbuf->T_front=0;
RTbuf->T_rear=0;
RTbuf->T_count=0;
RTbuf->T_disabled=1;
}
/*********************************************************************************************************
** 函數名稱: Rbuf_empty
** 功能描述: 接收緩沖區判空
** 輸 入:
** 輸出 : TRUE 空 FALSE 非空
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
unsigned char Rbuf_empty(siocirqueue *RTbuf){
return RTbuf->R_count==0;
}
/*********************************************************************************************************
** 函數名稱: Tbuf_empty
** 功能描述: 發送緩沖區判空
** 輸 入:
** 輸出 : TRUE 空 FALSE 非空
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************
unsigned char Tbuf_empty(void){
return RTbuf->T_count==0;
}
/*********************************************************************************************************
** 函數名稱: Rbuf_full
** 功能描述: 接收緩沖區判滿
** 輸 入:
** 輸出 : TRUE 滿 FALSE 非滿
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************
unsigned char Rbuf_full (void){
return RTbuf->R_count==RBUF_SIZE;
}
/*********************************************************************************************************
** 函數名稱: Tbuf_full
** 功能描述: 發送緩沖區判滿
** 輸 入:
** 輸出 : TRUE 滿 FALSE 非滿
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
unsigned char Tbuf_full(siocirqueue *RTbuf){
return RTbuf->T_count==TBUF_SIZE;
}
/*********************************************************************************************************
** 函數名稱: Rbuf_putchar
** 功能描述: 把一個字符放入接收緩沖區
** 輸 入:
** 輸出 :
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************
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();
}
}
/*********************************************************************************************************
** 函數名稱: Tbuf_putchar
** 功能描述: 把一個字符放入發送緩沖區
** 輸 入:
** 輸出 :
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
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();
}
}
/*********************************************************************************************************
** 函數名稱: Rbuf_getstring
** 功能描述: 從接收緩沖區返回當前子串指針
** 輸 入:
** 輸出 : 當前子串指針
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************
unsigned char * Rbuf_getstring(void){
return (RTbuf->R_buf[RTbuf->R_front]);
}
/*********************************************************************************************************
** 函數名稱: Tbuf_getstring
** 功能描述: 從發送緩沖區返回當前子串指針
** 輸 入:
** 輸出 : 當前子串指針
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************
unsigned char * Tbuf_getstring(void){
return (RTbuf->T_buf[RTbuf->T_front]);
}
/*********************************************************************************************************
** 函數名稱: Rbuf_putchar
** 功能描述: 從接收緩沖區讀一個字符
** 輸 入:
** 輸出 : 讀字符
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************/
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);
}
/*********************************************************************************************************
** 函數名稱: Tbuf_getchar
** 功能描述: 從發送緩沖區讀一個字符
** 輸 入:
** 輸出 : 讀字符
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
********************************************************************************************************
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);
}
}
*/
/******************************* 中斷處理函數 ***************************
* 功能:完成數據得的接收和發送
***********************************************************************/
#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黑下載附件…………
復制代碼
uCOS-II移植\
串口收發\
復件 跑馬燈實驗2\
外部中斷程序\
跑馬燈實驗1\
跑馬燈實驗2\
跑馬燈實驗3\
所有資料51hei提供下載:
例程.rar
(332.91 KB, 下載次數: 216)
2018-4-11 19:54 上傳
點擊文件名下載附件
例程
下載積分: 黑幣 -5
作者:
phang
時間:
2018-9-20 13:05
參考一下,謝謝了
作者:
savoryvinegar
時間:
2018-9-20 20:17
xiexie ~~
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1