音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

模擬UART程序

作者:zlg900 欄目:MCU技術(shù)
模擬UART程序
//**********************************************************************************
//File:        uart2.c
//Funtion:    Use the time0 and two general IO pins as a UART
//BuadRate is 9600bps.
//Author:             Ziyi Li
//Date:        14/03/2005
//*********************************************************************************

#include "reg932.h"
#define uCHAR unsigned CHAR

sbit uart2txd=P0^0; //pin of the UART2 TxD
sbit uart2rxd=P1^3; //pin of the UART2 RxD

uCHAR num;
uCHAR uart2s;     //ie. SBUF2
uCHAR uart2f=0;     //0:disable 1:read 2:send 3: read completed  4:send completed
//*********************************************************************************
void timer0_isr(void) interrupt 1
{
    TH0=0xFE;
    TL0=0x95;
    if(uart2f==2)
    {
        if(num==1)
        {
            uart2txd=1;
            uart2f=4;
            TR0=0;
        }
        if(num>1&&num<10)
        {
            if(uart2s&(0x01<<(9-num)))    
            uart2txd=1;
            else
            uart2txd=0;
        }
        num--;
    }
    if(uart2f==1)
    {
        if(num>1)
        {
            if(uart2rxd)
            uart2s=uart2s|(0x01<<(9-num));
            else
            uart2s=uart2s&~(0x01<<(9-num));
            num--;
        }
        else
        {
            uart2f=3;
            TR0=0;
        }
    }
}
//*********************************************************
void InitIO(void)
{
    P0M1=0x00;
    P0M2=0xff;
    P1M1=0x00;
    P1M2=0x00;
    uart2txd=1;
}
//*********************************************************
void InitTimer0(void)
{
    // configure timer 0 AS MODE 1
      TMOD &= 0xF0;
      TMOD |= 0x01;
      TAMOD &= 0xFE;
    // values of timer0
      TH0 = 0xFE;
      TL0 = 0x95;
    //config interrupts
    ET0=1;
      EA=1;
}
//*********************************************************
void uart2send(uCHAR s)
{
    num=9;
    uart2s=s;
    uart2f=2;
    uart2txd=0;
    TR0=1;
}
//*********************************************************
void uart2read(void)    //read a byte from UART2
{            //result is stored in uart2s
    while(uart2rxd);    //wait start bit
    num=9;
    uart2f=1;     
    TH0=0xFd;
    TL0=0xc5;
    TR0=1;
}
//*********************************************************

void main(void)
{
  InitIO();
  InitTimer0();
  while(1)
  {
   uart2read();
   while(uart2f!=3);    //wait till read completed
   uart2send(uart2s);
  }
}



* - 本貼最后修改時(shí)間:2005-6-23 15:33:45 修改者:zlg900

2樓: >>參與討論
zlg900
供有興趣的網(wǎng)友使用.
功能不完善,請(qǐng)?zhí)岢鲂薷慕ㄗh完善程序.要保證連續(xù)通信可靠,請(qǐng)用2個(gè)停止位.

* - 本貼最后修改時(shí)間:2005-3-15 9:39:39 修改者:zlg900

3樓: >>參與討論
wuyawen
疑問!
 if(num>1&&num<10)
        {
            if(uart2s&(0x01<<(9-num)))    
            uart2txd=1;
            else//為什么當(dāng)發(fā)送位是0,就不發(fā)送了??
            uart2txd=0;
        }

while(1)
  {
   uart2read();//這里如果我是先發(fā)送過數(shù)據(jù)來的話,是不會(huì)處理的!在這個(gè)函數(shù)里加個(gè)跳出語句好不好!
   while(uart2f!=3);    //wait till read completed
   uart2send(uart2s);
  }


4樓: >>參與討論
wuyawen
請(qǐng)多多指導(dǎo)
 
5樓: >>參與討論
zlg900
最后一位為1.可以先送數(shù)據(jù)的.
1.當(dāng)NUM==1時(shí),程序會(huì)置位TXD的.
2.
void uart2read(void)    //read a byte from UART2
{            //result is stored in uart2s
    while(uart2rxd);    //wait start bit
    num=9;
    uart2f=1;     
    TH0=0xFd;
    TL0=0xc5;
    TR0=1;
}
這個(gè)讀函數(shù)是用等待方法的,在有外部INT的型號(hào),也可以改為中斷觸發(fā),也可以把RXD信號(hào)接到鍵盤中斷,也可實(shí)現(xiàn)中斷觸發(fā).但程序要作適當(dāng)改動(dòng).這樣發(fā)送和接收都是全中斷控制了.

此外,這個(gè)程序不是全雙工的.但只要適當(dāng)改動(dòng),也可實(shí)現(xiàn).具體是TXD和RXD用不同TIMER控制,且緩沖也設(shè)為不同,現(xiàn)在同是uart2s.那么這個(gè)就是全雙工雙緩沖的UART了

* - 本貼最后修改時(shí)間:2005-3-16 8:42:17 修改者:zlg900

6樓: >>參與討論
wuyawen
謝謝
我知道NUM=9~2的時(shí)候發(fā)送的是8位數(shù)據(jù)
當(dāng)NUM=1時(shí)候,uart2txd=1發(fā)送停止位
只是在NUM=9~2中的任何一位的時(shí)候,當(dāng)這一位為零,程序就令uart2txd=0
假如我傳的數(shù)據(jù)是0xc0
那么NUM=9,8,7,6的時(shí)候,uart2txd=0;能夠保準(zhǔn)接收到的數(shù)據(jù)還是0xc0嗎。
會(huì)不會(huì)是0xc?呢!
目前手頭沒有硬件,不能夠?qū)嶋H測(cè)試一下!
盼告知


7樓: >>參與討論
zlg900
不會(huì)的.
你了解了UART的通信格式后,就知道這是正確的.這個(gè)程序是測(cè)試過的,放心.

8樓: >>參與討論
wuyawen
弄明白啦!
void send(void)
{
emuTXD=0;  //start bit
delay(BAUD);
emuTXD=emuBit0;
delay(BAUD);
emuTXD=emuBit1;
delay(BAUD);
emuTXD=emuBit2;
delay(BAUD);
emuTXD=emuBit3;
delay(BAUD);
emuTXD=emuBit4;
delay(BAUD);
emuTXD=emuBit5;
delay(BAUD);
emuTXD=emuBit6;
delay(BAUD);
emuTXD=emuBit7;
delay(BAUD);
if(PARITY)
    {emuTXD=1;  //parity bit
     delay(BAUD);
    }
emuTXD=1;  //stop bit
delay(BAUD);
}
剛剛弄了一個(gè),只要DELAY正常,也可以!
繼續(xù)努力去啦!


9樓: >>參與討論
zlg900
但你給的程序不是中斷方式實(shí)驗(yàn)的.
 
10樓: >>參與討論
ploto
抄的周工說明上的,應(yīng)該說明,這才是科學(xué)的態(tài)度
 
11樓: >>參與討論
131452099
一個(gè)模擬串口的問題
各位大哥:
        我要用一個(gè)普通的I/O口去模擬一個(gè)能夠傳送數(shù)據(jù)的串口應(yīng)該怎么弄呀,有什么好的建議請(qǐng)給我告訴我,如果你有樣板程序的劃請(qǐng)發(fā)到我的郵箱,我的郵箱是yanghuiqing131@126.com,謝謝!!

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
P89C668的問題請(qǐng)教!
VB\\DELPHI如何操作PDIUSBD12
請(qǐng)教周公一個(gè)關(guān)于模擬串口的問題!!
請(qǐng)教一個(gè)關(guān)于nRF401的問題!!1
一個(gè)有關(guān)頭文件的問題
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)