日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
模擬串口程序
模擬串口程序
 更新時間:2008-8-17 19:45:39  點擊數(shù):32
【字體: 字體顏色

來源:coldra資料室  作者:coldra

M48,8MHz 
9600,1,8,1 

輸出:用定時器控制普通IO口輸出位 
輸入:用外部中斷+定時器,判斷位的寬度 

好幾天沒休息,利用閑暇寫的,也沒找到別人的參考程序,不過終于算是穩(wěn)定了,其實還應(yīng)該有很多其它的方法可以試一下,比如用PWM輸出串行數(shù)據(jù),用輸入捕獲接收數(shù)據(jù),或定時查詢,或用任意一個IO口中斷,則每個引腳都有可能 

現(xiàn)在還有些問題,全雙工同時收發(fā)時發(fā)送偶爾出錯,占用兩個定時器有些浪費,以后再修改吧,最好加上各種波率 

本程序為直接摘出部分,刪了無關(guān)的部分,在此可能有些變量沒用,或有段落遺漏,請諒 

#include  
#include  
#include  
#include  

#define Sbit1() PORTD =1<#define Sbit0() PORTD&=~(1<

volatile unsigned int 
eep_ms,//毫秒計時 
keytime,                    //等待時間 
SoundOnTime;                    //// 
volatile unsigned  char  
rdata, 
key, 
start=0, 
keycode,        // 
*TxPoint, 
rtime, 
INT0_time,                //中斷次數(shù) 

RxLength=0,        //接收長度 
RUDR,            //摸擬串口接收的數(shù)據(jù) 
TxLength,                    //串口發(fā)送數(shù)據(jù)長度 
SUDR;                        //串口發(fā)送的數(shù)據(jù) 

unsigned char arr[10],DispBuff[10]; 


void Initial_IO(void)//IO口初始化 
    { 
     DDRD = 0X82;              //PD1串口輸出,PD0串口輸入,PD2模擬串口輸入(INT0) 
     PORTD = 0X82;             //PD1輸出高電平 
    } 

void Initial_INT0(void) 
    { 
    EICRA =(1<     EIMSK =1<    } 

void Initial_timer0(void)                         //定時器0初始化 
    { 
     TCCR0B =(1<     TIMSK0 =(1<    } 

void Initial_timer1(void) 
    { 
     TCCR1A=(1<          TCCR1B=(1<     ICR1=1000; 
     TIMSK1 =(1<    } 

void Initial_timer2(void) 
    { 
     TCCR2B=(1<     TIMSK2 =(1<    } 


void Initial_WDR(void)                                       //看門狗初始化 
    { 
    wdt_enable(WDTO_1S); 
    wdt_reset(); 
    } 


void Initial(void) 

    Initial_IO(); 
    Initial_timer0(); 
    Initial_timer1(); 
    Initial_timer2(); 
    Initial_INT0(); 
    Initial_WDR(); 
    sei(); 



/*啟動串口發(fā)送*/ 
void SendData(unsigned char *P,unsigned char DataLength) 
    { 
    TxLength=DataLength; 
    TxPoint=P;  
    start=0; 
    } 
     

int main (void) 
    { 

    Initial(); 

    while(1) 
        { 
        wdt_reset(); 
        if((rdata)&&(eep_ms>10))//收到數(shù)據(jù)延時10mS后啟動發(fā)送,回送驗證數(shù)據(jù) 
            { 
            key=0; 
            SendData(&DispBuff[0],9);//發(fā)送DispBuff[0]的9位數(shù)據(jù) 
            while(TxLength);//等待發(fā)送完成 
            rdata=0; 
            eep_ms=0; 
            } 
        } 
    } 


/*定時器0,100us溢出中斷*/ 
SIGNAL(SIG_OVERFLOW0) 
    { 
    TCNT0=151;//重載數(shù)據(jù),計時區(qū)間為151---255,共104uS,一個位的時間 
    if(TxLength)// 
        { 
        if(start==0) 
            { 
            Sbit0();//起始位 
            SUDR=*(TxPoint++); 
            } 
        else 
            { 
            if((start<=8)) 
                { 
                if(SUDR&(1<<(start-1)))Sbit1();//數(shù)據(jù)1 
                else Sbit0();//數(shù)據(jù)0 
                } 
            else Sbit1();//停止位 
            } 
        if(start<10)start++; 
        else  
            { 
            TxLength--;//一字節(jié) 發(fā)送完成,字節(jié)數(shù)減1 
            start=0; 
            }// 
        } 
    } 

/*定時器1,1ms溢出中斷*/ 
SIGNAL(SIG_OVERFLOW1) 

    eep_ms++; 

/*定時器2*/  
SIGNAL(SIG_OVERFLOW2) 
    { 
    sei();     
    if(INT0_time)//有數(shù)據(jù) 
        { 
        INT0_time=0;//中斷次數(shù)清0 
        rdata=1;//置有數(shù)據(jù)標志 
        eep_ms=0; 
        if(RxLength<10)DispBuff[RxLength++]=RUDR; 
         
        } 
    if(rtime<4)rtime++;//字節(jié)間隔時間,間隔3個字節(jié)重新開始一幀 
    else RxLength=0; 
    } 
     
SIGNAL(SIG_INTERRUPT0)//INT0,邊沿觸發(fā)中斷 
    { 
    unsigned char temp,temp2=0; 
    static unsigned char pre_TCNT2,j=0; 
    if(INT0_time==0)//一個字節(jié)第一個下降沿中斷,起始位開始 
        { 
        TCNT2=130; 
        pre_TCNT2=130; 
        RUDR=0xff;//接收的數(shù)據(jù)初值 
        j=0;    //位數(shù)清零 
        INT0_time++;//中斷次數(shù)加一 
        } 
    else  
        { 
        temp=TCNT2; 
        if(temp>pre_TCNT2)temp2=temp-pre_TCNT2;//取一個高/低電平的寬度 
        if(temp2>10)//濾過窄電平(干擾信號) 
            { 
            pre_TCNT2=temp;//記錄前一次的時間值 
            temp=0; 
            while(temp2>13)//計算位的個數(shù),約13為一個位(8*13=104uS) 
                    { 
                    temp2-=13;// 
                    temp++; 
                    } 
            if(temp2>6)temp++;//計算位的個數(shù),一般13為一個位 
            if(INT0_time==1)temp-=1; 
            if(INT0_time&1)//奇數(shù)次中斷 
                { 
                while(temp)//位0的個數(shù) 
                    { 
                    RUDR&=~(1<                    temp--; 
                    j++; 
                    } 
                } 
            else j+=temp;//偶數(shù),位1的個數(shù),跳過 
            INT0_time++;//中斷次數(shù)加一 
            } 
        } 
    rtime=0; 
    }

//*************************************************************************************************

  • 上一篇: 硬件工程師必看---必殺技學習(轉(zhuǎn))
  • 下一篇: [轉(zhuǎn)載]點陣式LED簡單圖形顯示技術(shù)
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

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

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1