單片機(jī)通用模擬串口C程序-基礎(chǔ)電子_第1頁
單片機(jī)通用模擬串口C程序-基礎(chǔ)電子_第2頁
單片機(jī)通用模擬串口C程序-基礎(chǔ)電子_第3頁
單片機(jī)通用模擬串口C程序-基礎(chǔ)電子_第4頁
單片機(jī)通用模擬串口C程序-基礎(chǔ)電子_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

精品文檔-下載后可編輯單片機(jī)通用模擬串口C程序-基礎(chǔ)電子//

//UART.C

//通用模擬串口程序

//資源需求:一個硬件計數(shù)器,兩個I/O口

//硬件計數(shù)器的計數(shù)時間設(shè)定為三倍波特率

//定義的兩個I/O口,用于發(fā)送和接收,分別用在receive()和transmit(char)中

//設(shè)立了專門的接收緩沖區(qū),用于存儲接收數(shù)據(jù)

//注意:必需根據(jù)波特率來設(shè)定定時器;

//每次通信開始必須調(diào)用初始化函數(shù)init_uart()

//

//管腳定義、庫函數(shù)聲明

#includereg51.h

#includestdio.h

//端口定義

sbitRXD3=P1^0;

sbitTXD3=P1^1;

//變量聲明

#defineIN_BUF_SIZE10//輸入緩沖區(qū)長度定義

#defineTRUE1

#defineFALSE0

staticunsignedcharinbuf[IN_BUF_SIZE];//輸入緩沖區(qū)

staticunsignedcharqin=0;

staticunsignedcharqout=0;

staticcharflag_rx_waiting_for_stop_bit;

staticcharflag_rx_off;

staticcharrx_mask;

staticcharflag_rx_ready;

staticcharflag_tx_ready;

staticchartimer_rx_ctr;

staticchartimer_tx_ctr;

staticcharbits_left_in_rx;

staticcharbits_left_in_tx;

staticcharrx_num_of_bits;

staticchartx_num_of_bits;

staticcharinternal_rx_buffer;

staticcharinternal_tx_buffer;

staticcharuser_tx_buffer;

//與硬件有關(guān)的函數(shù)聲明

bitget_rx_pin_status();//1.返回接收管腳返回的值(0或1)

voidset_tx_pin_high(void);//2.發(fā)送管腳置高,輸出1

voidset_tx_pin_low();//3.發(fā)送管腳置低,輸出0

voidtimer_set();//4.設(shè)置定時器的值為波特率的三倍

voidset_timer_interrupt();//5.使能定時器中斷

voididle();//6.等待端口輸入時,執(zhí)行,根據(jù)具體應(yīng)用進(jìn)行修改

//聲明與硬件無關(guān)的函數(shù)

voidflush_input_buffer(void);//清空接收緩存區(qū)

charkbhit(void);//判斷數(shù)據(jù)是否正常接收

charget_char(void);//從接收緩存區(qū)讀出一個數(shù)據(jù)

voidturn_rx_on(void);//啟動接收函數(shù)

voidturn_rx_off(void);//結(jié)束接收函數(shù)

externvoidput_char(char);//向發(fā)送端發(fā)送一個數(shù)據(jù).

voidtimer_isr(void);//中斷處理函數(shù)

//

//函數(shù)名稱:set_tx_pin_high

//功能說明:置串口發(fā)送端口為高,與硬件有關(guān)

//

voidset_tx_pin_high(void)

{

TXD3=1;

}

//

//函數(shù)名稱:set_tx_pin_low

//功能說明:置串口發(fā)送端口為低,與硬件有關(guān)

//

voidset_tx_pin_low(void)

{

TXD3=0;

}

//

//函數(shù)名稱:get_rx_pin_status

//功能說明:返回接收端口的狀態(tài),高為1,低為0,與硬件有關(guān)

//

bitget_rx_pin_status()

{

return(RXD3);

}

//

//函數(shù)名稱:timer_set

//功能說明:設(shè)置定時器工作狀態(tài),與硬件有關(guān)

//

voidtimer_set()

{

TMOD=0x22;//定時器1為工作模式2(8位自動重裝),0為模式2(8位自動重裝)

PCON=0x00;

TR0=0;//在發(fā)送或接收才開始使用

TF0=0;

TH0=(256-96);//9600bps就是1000000/9600=104.167微秒執(zhí)行的timer是

//104.167*11.0592/12=96

TL0=TH0;

ET0=1;

}

//

//函數(shù)名稱:set_timer_interrupt

//功能說明:打開定時器中斷允許,與硬件有關(guān)

//

voidset_timer_interrupt()

{

EA=1;

}

//

//函數(shù)名稱:IntTimer0

//功能說明:定時器中斷函數(shù),與硬件有關(guān),但不做處理,直接調(diào)用通用中斷處理函數(shù)

//

voidIntTimer0()interrupt1

{

timer_isr();//調(diào)用中斷處理函數(shù)

}

//

//函數(shù)名稱:idle

//功能說明:等待定時器中斷時的執(zhí)行程序,與具體應(yīng)用有關(guān)

//

voididle()

{

}

//

//函數(shù)名稱:timer_isr

//功能說明:中斷處理函數(shù),與硬件無關(guān),通用函數(shù)

//

voidtimer_isr(void)/*中斷服務(wù)程序*/

{

charmask,start_bit,flag_in;

//發(fā)送程序

if(flag_tx_ready)

{

if(--timer_tx_ctr=0)

{

mask=internal_tx_buffer1;

internal_tx_buffer=1;

if(mask)

{

set_tx_pin_high();

}

else

{

set_tx_pin_low();

}

timer_tx_ctr=3;

if(--bits_left_in_tx=0)

{

flag_tx_ready=FALSE;

}

}

}

//接收程序

if(flag_rx_off==FALSE)

{

if(flag_rx_waiting_for_stop_bit)

{

if(--timer_rx_ctr=0)

{

flag_rx_waiting_for_stop_bit=FALSE;

flag_rx_ready=FALSE;

internal_rx_buffer=0xFF;

if(internal_rx_buffer!=0xC2)

{

inbuf[qin]=internal_rx_buffer;

if(++qin=IN_BUF_SIZE)

{

qin=0;

}

}

}

}

else//rx_test_busy接收忙

{

if(flag_rx_ready==FALSE)

{

start_bit=get_rx_pin_status();

//判斷起始位

if(start_bit==0)

{

flag_rx_ready=TRUE;

internal_rx_buffer=0;

timer_rx_ctr=4;

bits_left_in_rx=

rx_num_of_bits;

rx_mask=1;

}

}

else

{

if(--timer_rx_ctr=0)

{

timer_rx_ctr=3;

flag_in=

get_rx_pin_status();

if(flag_in)

{

internal_rx_buffer|=rx_mask;

}

rx_mask=1;

if(--bits_left_in_rx=0)

{

flag_rx_waiting_for_stop_bit=TRUE;

}

}

}

}

}

}

//

//函數(shù)名稱:init_uart

//功能說明:初始化異步串口,與硬件無關(guān),通用函數(shù)

//

voidinit_uart(void)

{

flag_tx_ready=FALSE;

flag_rx_ready=FALSE;

flag_rx_waiting_for_stop_bit=FALSE;

flag_rx_off=FALSE;

rx_num_of_bits=10;

tx_num_of_bits=10;

set_tx_pin_low();

timer_set();

set_timer_interrupt();//使能計時器中斷

}

//

//函數(shù)名稱:get_char

//輸入?yún)?shù):無

//輸出參數(shù):ch,接收數(shù)據(jù)

//功能說明:接收一個字節(jié),與硬件無關(guān),通用函數(shù)

//

charget_char(void)

{

charch;

do

{

while(qout==qin)

{

idle();

}

ch=inbuf[qout]0xFF;

if(++qout=IN_BUF_SIZE)

{

qout=0;

}

}

while(ch==0x0A||ch==0xC2);

return(ch);

}

//

//函數(shù)名稱:put_char

//功能說明:接收一個字節(jié),與硬件無關(guān),通用函數(shù)

//

voidput_char(charch)

{

while(flag_tx_ready);

user_tx_buffer=ch;

//喚醒串口

timer_tx_ctr=3;

bits_left_in_tx=tx_num_of_bits;

internal_tx_buffer=(user_tx_buffer1)|0x200;

flag_tx_ready=TRUE;

}

//

//函數(shù)名稱:flush_input_buffer

//功能說明:初始化緩沖區(qū),與硬件無

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論