




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西北大學(xué)《口腔醫(yī)學(xué)臨床前技能訓(xùn)練(二)》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江汽車職業(yè)技術(shù)學(xué)院《數(shù)據(jù)分析與應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 青島黃海學(xué)院《入侵檢測與入侵防御》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東勝利職業(yè)學(xué)院《供應(yīng)鏈與物流概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 甘肅省定西市漳縣2025屆五年級數(shù)學(xué)第二學(xué)期期末統(tǒng)考模擬試題含答案
- 廣東茂名健康職業(yè)學(xué)院《高等藥理學(xué)(雙語)》2023-2024學(xué)年第二學(xué)期期末試卷
- 古希臘哲學(xué)和中國哲學(xué)
- 功放高頻移相
- 公共交通服務(wù)規(guī)范管理制度
- 工程項目成本控制的原則
- 火災(zāi)自動報警系統(tǒng)施工過程檢查記錄
- TD/T 1069-2022 國土空間生態(tài)保護(hù)修復(fù)工程驗收規(guī)范(正式版)
- 踝關(guān)節(jié)扭傷康復(fù)治療
- FZ∕T 01085-2018 粘合襯剝離強(qiáng)力試驗方法
- 白龍江引水工程環(huán)境影響報告書(公示版)
- 《短視頻拍攝與制作》課件-3短視頻中期拍攝
- 瀏陽煙花術(shù)語大全
- 居民心理健康知識講座課件
- 2024年英語專業(yè)四級考試真題及詳細(xì)答案
- 成語故事葉公好龍
- MHT:中小學(xué)生心理健康檢測(含量表與評分說明)
評論
0/150
提交評論