欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC15F系列8051單片機模擬串口57600bps@24MHz
[打印本頁]
作者:
wudawei
時間:
2014-12-31 00:02
標題:
STC15F系列8051單片機模擬串口57600bps@24MHz
//為何不把程序寫得通俗易懂點?超級代碼來了!
//參考了STC官網手冊中的程序,但源程序遇到RX腳一直為低電平也會收到數據0x00,這里已經修正
//柳州市第一職業技術學校 電氣自動化專業部 中國歐軟 China O Soft! 2012年8月3日
#include <reg52.h> //使用8052內核單片機
sbit TX_IO=P3^1; //模擬串口發送IO
sbit RX_IO=P3^0; //模擬串口接收IO
sfr AUXR=0x8e; //STC15F系列單片機特殊寄存器,控制定時器時鐘來源頻率
bit sending,receing,received; //發送中,接收中,接收完畢標志
unsigned char rece_bit_count; //接收位計數變量
unsigned char rece_pls_count; //接收脈沖計數變量
unsigned char send_bit_count; //發送位計數變量
unsigned char send_pls_count; //發送脈沖計數變量
unsigned char receing_data; //正在接收著的臨時數據
unsigned char byte_need_to_send; //要發送出去的字節
unsigned char byte_received; //已收到的字節
void send_byte(unsigned char byte_will_send) //發送一個字節
{ //函數開始
byte_need_to_send=byte_will_send; //傳遞要發送的數據
send_pls_count=3; //采樣倍率3
send_bit_count=8; //8位數據一位停止
TX_IO=0; //發送起始位
sending=1; //置標志位,中斷程序開始發送該字節
while(sending); //等待數據發送完成
} //函數結束
void timer0(void) interrupt 1 //中斷服務程序
{ //函數開始
if(receing) //接收中?
{ //接收中開始
if(--rece_pls_count==0) //三次脈沖計數夠了嗎?
{ //接收一位二進制位開始
rece_pls_count=3; //脈沖計數輔助變量復位
if(rece_bit_count) //是在接收數據位還是停止位
{ //接收數據位開始
receing_data=receing_data>>1; //向右移一位,準備拼入一位二進制數據
if(RX_IO==1){receing_data=receing_data|0x80;}//如果收到的是二進制位"1",則拼入最高位中
rece_bit_count=rece_bit_count-1; //已接收一位,接收位計數變量計數
} //接收數據位結束
else //如果已經收完8位數據
{ //就開始接收停止位
receing=0; //本字節已接收完畢
if(RX_IO==1) //停止位是"1"嗎
{ //是“1”
byte_received=receing_data; //將數據輸出
received=1; //搖旗示意數據正確接收完畢
} //數據輸出處理完畢
} //停止位處理完畢
} //接收一位二進制位結束
} //接收中處理結束
else //還沒收到停止位,不是正在接收狀態
{ //等待接收開始
if(RX_IO==0) //是一個起始位到來嗎
{ //是.......
receing=1; //開始接收
rece_pls_count=3; //置接收起始位脈沖數
rece_bit_count=8; //置接收二進制位數
} //起始位處理完畢
} //等待接收完畢
//----------------------------------------------------------------------------------------
if(sending) //是正在發送狀態嗎
{ //是……
if(--send_pls_count==0) //脈沖計數夠了嗎
{ //夠了……
send_pls_count=3; //脈沖計數復位
if(send_bit_count) //是在發送數據還是要發送停止位
{ //發送數據開始
TX_IO=byte_need_to_send&0x01; //從最低位開始發送數據
byte_need_to_send=byte_need_to_send>>1; //移動數據準備下一次發送
send_bit_count=send_bit_count-1; //已經發送了一位二進制數要記下來
} //發送數據結束
else //數據已經發送完成
{ //發送停止位開始
TX_IO=1; //發送停止位
sending=0; //放下旗幟表示數據已經發送完成
} //停止位發送完成
} //一位二進制位處理完成
} //發送狀態處理完成
} //中斷函數結束
void main(void) //主程序
{ //開始
AUXR=0x80; //T0計時脈沖不分頻,比傳統8051快12倍
TMOD=0X00; //16位自動重載模式,當TR0=0時向TH0,TL0寫入數據將同時寫入重載寄存器
TH0=(65536-(24000000/57600/3))/256; //重載值=65536-(定時器脈沖頻率÷波特率÷3)
TL0=(65536-(24000000/57600/3))%256; //溢出率=定時器脈沖頻率÷(65536-重載值)
TR0=1; //啟動定時器,模擬串口開始工作
EA=1; //打開總中斷
ET0=1; //打開定時器0中斷
PX0=1; //優先保證定時器0中斷,確保模擬串口的可靠性
while(1) //主循環
{ //主循環體開始
if(received==1) //收到一個字節的數據啦?
{ //是……
received=0; //知道了……
send_byte(byte_received); //原封不動打回原籍
} //收到字節處理完畢
} //主循環體結束
} //主程序結束
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1