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

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
全數(shù)字信號(hào)發(fā)生器的軟件設(shè)計(jì)
全數(shù)字信號(hào)發(fā)生器的軟件設(shè)計(jì)
 更新時(shí)間:2008-7-26 20:01:01  點(diǎn)擊數(shù):2
【字體: 字體顏色
    本儀器的程序主要由鍵盤(pán)、顯示程序、AT24C01A讀寫(xiě)程序、信號(hào)產(chǎn)生程序等部分組成。以下對(duì)部分功能作一些分析。
一、鍵盤(pán)程序
  本儀器需要調(diào)整的數(shù)值范圍較大,因此,“增加”和“減少”鍵必須具有快速連加和快速連減的功能,否則調(diào)整速度太慢。這種鍵盤(pán)可以用多種方法來(lái)實(shí)現(xiàn),關(guān)鍵在于設(shè)計(jì)一個(gè)正確的程序結(jié)構(gòu),圖1是一種實(shí)現(xiàn)方法的流程圖。
 
圖1 流程圖
  程序工作時(shí),不斷地掃描鍵盤(pán),第一次掃描到有鍵按下后如常規(guī)鍵盤(pán)一樣,進(jìn)行鍵值處理,處理完畢,不等待鍵盤(pán)釋放,直接退出鍵盤(pán)程序。當(dāng)又一次執(zhí)行到鍵盤(pán)程序,如果檢測(cè)到鍵還被按著,就不再直接去鍵值處理程序,而是將一個(gè)計(jì)數(shù)器加1,直接返回主程序,如此循環(huán),直到計(jì)數(shù)到一個(gè)定值(如500,表示鍵盤(pán)程序已被執(zhí)行了500次),如果鍵還被按著,說(shuō)明用戶(hù)有連加(或連減)要求,程序即將計(jì)數(shù)器減去一個(gè)數(shù)值(如30),然后進(jìn)行鍵值處理。這樣,以后鍵盤(pán)程序每執(zhí)行30次,就執(zhí)行一次鍵值處進(jìn)程序,實(shí)現(xiàn)了第一次啟動(dòng)時(shí)間較長(zhǎng),以后快速連續(xù)動(dòng)作的要求。如果檢測(cè)到鍵已被釋放,則清除所有標(biāo)志,將計(jì)數(shù)器清零,準(zhǔn)備下一次按鍵處理。
  程序開(kāi)始時(shí)定義了兩個(gè)常量:Qdsj和Ljsj,如下所示
const  uint  Qdsj=500; /*與首次啟動(dòng)連加(減)功能的時(shí)間有關(guān)*/
const  uint  Ljsj=30;  /*與連加(減)的速度有關(guān)*/
  這兩個(gè)常量與第一次啟動(dòng)及連加、減的速度有關(guān),具體數(shù)值應(yīng)根據(jù)實(shí)際情況試驗(yàn)后確定。下面是部分鍵處理程序,注意其中這兩個(gè)變量的使用。
void Key()/*鍵處理*/
{     ……
        if(!KeyValue)        
        {
…無(wú)鍵按下,清除一切標(biāo)志退出
        }
        if(KeyMark)     /*第一次檢測(cè)到按鍵嗎?*/
        {   KeyCounter++;   /*不是第一次(KeyMark已是1了)*/
            if(Qdsj==KeyCounter) /*連續(xù)按著已有Qdsj次了*/
            {   KeyCounter-=Ljsj; /*減去Ljsj次*/
             KeyProcess(KeyValue,1);   /*鍵值處理*/    
            }
            else{ return ; }   /* 如果按著還沒(méi)有到Qdsj*/
        }
        else /*第一次檢測(cè)到有鍵按下*/
        { mDelay(10);     /*延時(shí)10毫秒*/
…再次檢測(cè)
            if(!KeyValue)
{… 清除一切標(biāo)志并返回}
}         
二、小數(shù)點(diǎn)的處理
  要在LED數(shù)碼管上顯示小數(shù)點(diǎn),可以有兩種選擇,一種方式是在顯示0.1~0.9時(shí)用小數(shù)顯示,而在顯示1~500時(shí)不顯示小數(shù)點(diǎn),這種方式編程略麻煩一些;另一種是使用定點(diǎn)的方式顯示小數(shù)點(diǎn),即不論是在0.1~0.9Hz段,還是1~500Hz段,均在倒數(shù)第二位點(diǎn)亮小數(shù)點(diǎn),這種顯示方式比較簡(jiǎn)單,本機(jī)采用了第二種方式。
  通常,用高級(jí)語(yǔ)言編程時(shí),可以用浮點(diǎn)型數(shù)據(jù)來(lái)表示小數(shù),但本程序并沒(méi)有這樣來(lái)處理。因?yàn)閱纹瑱C(jī)的資源有限,而浮點(diǎn)型數(shù)據(jù)的表達(dá)方式與其他數(shù)據(jù)的表達(dá)方式很不相同,無(wú)論是存儲(chǔ)還是運(yùn)算,都相當(dāng)占用資源,因而在單片機(jī)中能不用浮點(diǎn)型數(shù)據(jù)就盡量不要使用。這里我們將所有的頻率設(shè)定值擴(kuò)大10倍,即所要求的頻率值是0.1~500Hz,但在單片機(jī)內(nèi)部用1~5000來(lái)表示。如果頻率設(shè)定值小于10,每按一次鍵,頻率設(shè)定值就加或減1,如果頻率設(shè)定值大于等于10,每按一次按鍵就加或減10。例如,當(dāng)前頻率設(shè)定值為100,按一下“增加”鍵,該值就會(huì)變?yōu)?10,相當(dāng)于頻率設(shè)定值由10變?yōu)?1;如果當(dāng)前設(shè)定值為9,按一下“減少”鍵,該值變?yōu)?,相當(dāng)于頻率值由0.9變到了0.8。在根據(jù)頻率設(shè)定值計(jì)算定時(shí)常數(shù)時(shí),只要將被除數(shù)擴(kuò)大10倍即可,程序中是這樣表示的:
ltemp=1000000;  
ltemp*=10; //由于plsd被放大了10倍,故被除數(shù)也放大10倍
……
  在顯示頻率設(shè)定值時(shí),點(diǎn)亮倒數(shù)第二位的數(shù)碼管上的小數(shù)點(diǎn),顯示程序中有這樣的程序行:
if(Counter1==1) //如果當(dāng)前正在顯示倒數(shù)第二位時(shí)
{ if(!PlSl) //如果是要求顯示頻率
   DispCode=DispCode&0xbf; /*點(diǎn)亮小數(shù)點(diǎn)*/

  由于P0.6與小數(shù)點(diǎn)位相連,所以不論待顯示的數(shù)是多少,該位被清零后,小數(shù)點(diǎn)就能被點(diǎn)亮。要將該位清零,只要將字形碼與0xbf(10111111)相與即可。
三、AT24C01A的讀寫(xiě)
  AT24C01A芯片是具有I2C接口的EEPROM,由于89C51單片機(jī)沒(méi)有I2C接口,因此,必須用I/O口模擬I2C時(shí)序。這里僅提供作者用C語(yǔ)言編寫(xiě)的接口程序,不對(duì)此作更多的介紹。
  使用這一接口程序,只要定義好寫(xiě)常數(shù)、讀常數(shù)及根據(jù)硬件連線定義好三個(gè)引腳SDA、SCL和WP,然后直接調(diào)用讀、寫(xiě)函數(shù)即可。
#define AddWr   0xa0            /*器件地址選擇及寫(xiě)標(biāo)志*/
#define AddRd   0xa1            /*器件地址選擇及讀標(biāo)志*/
sbit    Sda=    P3^7;           /*串行數(shù)據(jù)*/
sbit    Scl=    P3^6;           /*串行時(shí)鐘*/
sbit    WP=    P3^5;
  接口程序提供了多字節(jié)的讀、寫(xiě)函數(shù),其中讀函數(shù)需要用到三個(gè)參數(shù):用于存放讀出數(shù)據(jù)的數(shù)組,待讀EEPROM的起始地址,字節(jié)數(shù);寫(xiě)函數(shù)也要用到三個(gè)參數(shù):用于存放待寫(xiě)入數(shù)據(jù)的數(shù)組,待寫(xiě)入EEPROM的起始地址,字節(jié)數(shù)。下面是這兩個(gè)函數(shù)的用法參考:
  RdFromROM(Number,10,2); //從地址10H開(kāi)始處讀出2個(gè)字節(jié),存入Numbre數(shù)組中。
  WrToROM(Number,10,2); //將Number數(shù)組中的2個(gè)字節(jié)寫(xiě)入EEPROM,地址從10H開(kāi)始
四、信號(hào)產(chǎn)生
  信號(hào)發(fā)生由定時(shí)中斷0完成,在定時(shí)時(shí)間到之后,重置定時(shí)常數(shù),接著判斷究竟是較高頻率還是較低頻率,分別予以處理,如果是較高頻率,直接取反輸出端口即可返回,如果是較低頻率,則要進(jìn)行計(jì)數(shù),并判斷計(jì)數(shù)值是否到設(shè)定值,如果到了,則取反輸出端口,并清零計(jì)數(shù)器,然后再返回,這部分程序如下。
void OutWave() interrupt 1 //定時(shí)0中斷用于波形輸出
{ static uint Count; //較低頻率時(shí)計(jì)數(shù)用
TH0=CTH0; //重裝時(shí)間常數(shù)
TL0=CTL0;
if(HighLow) //如果是較高頻率
{ WaveOut=!WaveOut;
Mczsl++; }
else { Count++;
if(Count>=Plcs)
{ WaveOut=!WaveOut;
Count=0;
Mczsl++;
} } }
  其中Mczsl是脈沖輸出個(gè)數(shù)的計(jì)數(shù)值。從程序中還可以看出,每次輸出只能得到波形的一半,要么高電平,要么低電平,一個(gè)完整的波形需要兩次輸出才能完成。
  定時(shí)中斷中所設(shè)定的定時(shí)常數(shù),預(yù)設(shè)定計(jì)數(shù)值(Plcs)都由主程序根據(jù)頻率設(shè)定值計(jì)算得到,根據(jù)前述原理,對(duì)于較低頻率的信號(hào)和較高頻率的信號(hào)采用兩種不同的方法產(chǎn)生,對(duì)于較低頻率的信號(hào),定時(shí)常數(shù)是一個(gè)定值,通過(guò)改變預(yù)設(shè)定計(jì)數(shù)值來(lái)達(dá)到定時(shí)時(shí)間,而對(duì)于較高頻率的信號(hào),直接改變定時(shí)常數(shù)來(lái)改變定時(shí)時(shí)間。為此,在主程序中根據(jù)設(shè)定值的大小分別處理,如果設(shè)定值大于10Hz,那么是較高頻率的算法,只要計(jì)算出設(shè)定頻率值對(duì)應(yīng)的時(shí)間,不難得到待設(shè)定值,程序中的處理方法是:
ltemp=1000000;
ltemp*=10; //由于plsd被放大了10倍,故被除數(shù)也放大10倍
ltemp/=Plsd; //獲得周期(單位微秒)
ltemp/=2; //獲得定時(shí)常數(shù)
  根據(jù)t=1/f,計(jì)算定時(shí)時(shí)間,單位是s,而我們所要求的定時(shí)時(shí)間單位是μs,因此,首先讓ltemp等于1000000,又由于Plsd變量在單片機(jī)內(nèi)部被放大10倍,故再將該值擴(kuò)大10倍,然后用ltemp為被除數(shù),去除以Plsd,得到周期數(shù)。由于每次定時(shí)中斷只能得到一半波形,因此定時(shí)數(shù)應(yīng)該是周期數(shù)的一半,將周期數(shù)除以2,即得到了定時(shí)常數(shù)。顯然,這里沒(méi)有先計(jì)算時(shí)間到s,然后再換算為μs,其目的也是為了避免小數(shù)運(yùn)算。
當(dāng)所設(shè)定的頻率值小于10Hz時(shí),程序是這樣處理的:
CTH0=(65536-1000)/256;
CTL0=(65536-1000)%256; //否則是在10HZ以下,定時(shí)器的定時(shí)常數(shù)是1ms
HighLow=0;        
Plcs=5000/Plsd;
  首先將定時(shí)常數(shù)確定為1000μs,然后將標(biāo)志位HighLow置0,表示要進(jìn)行較低頻率的處理,最后計(jì)算出中斷次數(shù)。中斷次數(shù)這樣來(lái)確定:用10000000/Plsd得到周期數(shù),然后用這個(gè)值除以2000即得可,這時(shí)除以2000的原因同上述分析,即定時(shí)時(shí)間為1000μs,最終得到的的周期是2000μs。
限于篇幅,完整的源程序在本期光盤(pán)中提供。
  如果讀者在設(shè)計(jì)、制作等方面有收獲,歡迎到http://www.mcustudio.com(平凡單片機(jī)工作室)交流,如果在制作、調(diào)試或有什么困難,也可以到這里尋求幫助。
作者制作的成品如圖2所示。
 
圖2 做好的儀器的外形圖
  • 上一篇: 全數(shù)字信號(hào)發(fā)生器的硬件設(shè)計(jì)
  • 下一篇: 用單片機(jī)控制步進(jìn)電機(jī)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

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

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

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