大肉大捧一进一出好爽视色大师,丰满少妇被猛烈进入在线播放,欧美真人性野外做爰,黑人巨大vs日本人优在线

機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發
培訓信息
贊助商
關于模擬串口的波特率的設計與應用
關于模擬串口的波特率的設計與應用
 更新時間:2009-9-11 16:39:53  點擊數:0
【字體: 字體顏色

      在用單片機開發各種嵌入式應用系統中,由于異步串行通訊連接簡單,因而成為經常用到的一種通信模式,很多應用中還要求實現多路異步串行通信。為了提高系統的性能價格比,就要求設計工程師用軟件增加實現一路或多路異步串行通信。本文即是對模擬串口的波特率做出的一點分析。
  首先簡單的介紹一下串行異步通訊的數據格式定義,發送或接收一個完整的字節信息,必須有“起始位”、“若干數據位”、“奇偶校驗位”和“停止位”;定義每位信息的時間寬度——每秒發送的信息位個數,即為“波特率”。本文附帶的模擬串口源程序采用數據幀的格式為 1位起始位(低電平),8位數據位(先低位在高位),1位停止位(高電平),且在線路空閑狀態時總是保持為高電平。當在11M晶振時鐘頻率下,采用波特率為9600或19200時。該模擬串口都可以無誤差的進行傳輸,具體分析后面進行。
  參照源程序,我們知道,在這個模擬串口設計中,模擬的是單片機串行異步通訊方式1,由P1^0做接收端,P1^1做發送端,通過定時器1定時溢出中斷來確定每位數據的時間,由StartBitOn()函數不斷查詢接收端的狀態,當出現低電平(即起始位)的時候,調用接收程序,接收發送的數據。
針對以下附帶的源程序分析知,PGetChar(),PSendChar()都是通過移位方式來接收數據,每接收一位數據,需要定時器溢出產生中斷一次,故要得到一幀的數據,就必須經過10個數據位的時間才能完成,同樣的,在模擬串口的發送端,要完整的發送一幀數據也要經過10個數據位的時間。因而在如下連接時,引出了以下的問題。
當RS232單次發送一個字符時,可以正常接收和發送回RS232。
當RS232連續發送一串字符時,通過模擬串口返回給RS232的字符只有原來的一半。如發送1234567890這樣一個字符串時,接收的字符為13579。
那為什么在單獨發送一個字符是不會丟失,而連續發送時就只有原來的一半了呢!
____________         ______________________________
|       |       |                     |
|       |       |                     |
| PC     |---------->| PGetChar()             |
|     RS232|       |   |     MCU         |
|       |       |   V                 |
|       |<----------| PSendChar()             |
-------------         -------------------------------
源程序:
/**********************************************
IO 口模擬232串行異步通訊程序

**********************************************/
#include <reg51.h>
sbit BT_SND =P1^1;
sbit BT_REC =P1^0;

#define F_TM F0 //自定義標志位,作為中斷標志位
#define TIMER0_ENABLE TL0=TH0; TR0=1;//TR0 = 1,啟動T
#define TIMER0_DISABLE TR0=0;

// Acc 累加器做發送的移位寄存器
sbit ACC0 = ACC^0;
sbit ACC1 = ACC^1;
sbit ACC2 = ACC^2;
sbit ACC3 = ACC^3;
sbit ACC4 = ACC^4;
sbit ACC5 = ACC^5;
sbit ACC6 = ACC^6;
sbit ACC7 = ACC^7;

//定時器計數器0的中斷
void IntTimer0() interrupt 1
{
    F_TM=1;
}
//發送一個字符
//數據格式一個啟動位(0),8數據位,一個停止位(1)
void PSendChar(unsigned char Getch)
{
    ACC=Getch;
    F_TM=0;
    BT_SND=0; //啟動位
    TIMER0_ENABLE; //記數器0啟動
  while(!F_TM) ;
    BT_SND=ACC0; //先送出低位
    F_TM=0;
  while(!F_TM) ;
    BT_SND=ACC1;
    F_TM=0;
  while(!F_TM) ;
    BT_SND=ACC2;
    F_TM=0;
  while(!F_TM);
    BT_SND=ACC3;
    F_TM=0;
  while(!F_TM);
    BT_SND=ACC4;
    F_TM=0;
  while(!F_TM);
    BT_SND=ACC5;
    F_TM=0;
  while(!F_TM);
    BT_SND=ACC6;
    F_TM=0;
  while(!F_TM);
    BT_SND=ACC7;
    F_TM=0;
  while(!F_TM);
    BT_SND=1;
    F_TM=0;
  while(!F_TM);
  TIMER0_DISABLE; //停止timer
}
//接收一個字符
unsigned char PGetChar()
{
unsigned char rch,ii;
TIMER0_ENABLE;
F_TM=0;
ii=0;
rch=0;
while(!F_TM); //等過起始位

while(ii<8)
{
  rch>>=1;
  if(BT_REC)
  {
  rch|=0x80;
  }
ii++;
F_TM=0;
while(!F_TM);

}
F_TM=0;
while(!F_TM)
{
  if(BT_REC)
  {
    break;
  }
}
TIMER0_DISABLE; //停止timer
return rch;

}
//檢查是不是有起始位
bit StartBitOn()
{
  return (BT_REC==0);

}
void main()
{
unsigned char Getch;

TMOD=0x22; /*定時器1為工作模式2(8位自動重裝),0為模式2(8位
自動重裝) */
PCON=00;
TR0=0; //在發送或接收才開始使用
TF0=0;
TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 執行的
//時間是104.167*11.0592/12= 96
TL0=TH0;
ET0=1;//定時器/記數器T0的溢出中斷允許位,ET,允 許中斷
EA=1;
  while(1)
  {
      
  if(StartBitOn())
  {
    Getch=PGetChar();
    PSendChar(Getch);
  }
}
}
實驗環境:
  串口調試助手軟件
  AT89S51單片機及相應的硬件設備
  win2000操作系統
原因分析如下:
PC的RS232像單片機發送1234567890字符串時,是連續一次發送的。當StartBitOn()檢測到低電平起始位時,運行Getch=PGetChar()函數,顯然上面說過要得到一幀的數據,就必須經過10個數據位的時間,同樣運行PSendChar(Getch)函數時,也必須經過10個數據位的時間,且都是在忽略單片機本身執行指令的時間得到的。因而在當單片機接收了一個數據在接收下一位數據期間,必須至少消耗20個數據位的時間,等它在開始檢測起始位時候,已經傳輸到第三個字符了,因而才會出現第上面的情況,當發送1234567890,而接收的字符是13579的原因。也就才會出現了很多工程師朋友們會對用軟件實現的UART在可靠性和效率方面持懷疑態度的現象
if(StartBitOn())
    {
        Getch=PGetChar();   //采用移位方式要消耗10個數據位的時間
        PSendChar(Getch);   //采用移位方式要消耗10個數據位的時間
      }

BT_REC 接收到的電平:
第1幀數據(10個數據位)第2幀(10個數據位)第3幀(10個起始位)

起始位1                 起始位2             起始位3
  
  參照上面的數據格式示意圖知,當單片機StartBitOn()檢測到起始位1并完成相應的接收轉發Getch=PGetChar(); PSendChar(Getch),在進行下一次檢測時,檢測到的下一個起始位就是起始位3了。

  綜合上面分析可得出以下結論,在用軟件模擬串行通訊時候,是以時間來模擬硬件設備的,用軟件實現的UART的效率肯定沒有辦法和硬件UART比,在上敘連接時候,實際接收的數據確實只能有原來的一半,因為它是連續進行接收和發送兩項工作的,但在實際應用中,可以通過一定的手段,比如先一次接收好PC所發送過來的所有數據,保存在預先設置的緩沖區里,稍后再去進行發送的工作,這樣在接收的時候消耗的時間就只有10個數據位,在接收過程中不會丟失數據,能正確接收到所發送的所有字符。

  • 上一篇: 利用單芯片MCU提高照明系統能源效率
  • 下一篇: 沒有了
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發消息66821730(技術支持)點擊這里給我發消息66821730(廣告投放) 點擊這里給我發消息41031197(編輯) 點擊這里給我發消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業自行提供,該企業負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(濱江)機電一體化學會
    中國行業電子商務100強網站

    網站經營許可證:浙B2-20080178-1
    主站蜘蛛池模板: 遂昌县| 泰州市| 大石桥市| 肥乡县| 同仁县| 富锦市| 平谷区| 泽普县| 涡阳县| 三河市| 甘肃省| 潢川县| 金昌市| 微博| 民县| 广元市| 永平县| 龙江县| 当涂县| 宁远县| 波密县| 青浦区| 东安县| 兴和县| 岑巩县| 古田县| 丰宁| 富民县| 白城市| 揭阳市| 夏邑县| 临湘市| 深州市| 中阳县| 青阳县| 顺义区| 泰来县| 托里县| 元谋县| 衡阳市| 开化县|