當前位置:首頁 > 單片機 > 單片機
[導讀] 本儀器的程序主要由鍵盤、顯示程序、AT24C01A讀寫程序、信號產生程序等部分組成。以下對部分功能作一些分析。一、鍵盤程序  本儀器需要調整的數值范圍較大,因此,“增加”和“減少”鍵必須具有快速連


本儀器的程序主要由鍵盤、顯示程序、AT24C01A讀寫程序、信號產生程序等部分組成。以下對部分功能作一些分析。一、鍵盤程序  本儀器需要調整的數值范圍較大,因此,“增加”和“減少”鍵必須具有快速連加和快速連減的功能,否則調整速度太慢。這種鍵盤可以用多種方法來實現,關鍵在于設計一個正確的程序結構,圖1是一種實現方法的流程圖。圖1 流程圖  程序工作時,不斷地掃描鍵盤,第一次掃描到有鍵按下后如常規(guī)鍵盤一樣,進行鍵值處理,處理完畢,不等待鍵盤釋放,直接退出鍵盤程序。當又一次執(zhí)行到鍵盤程序,如果檢測到鍵還被按著,就不再直接去鍵值處理程序,而是將一個計數器加1,直接返回主程序,如此循環(huán),直到計數到一個定值(如500,表示鍵盤程序已被執(zhí)行了500次),如果鍵還被按著,說明用戶有連加(或連減)要求,程序即將計數器減去一個數值(如30),然后進行鍵值處理。這樣,以后鍵盤程序每執(zhí)行30次,就執(zhí)行一次鍵值處進程序,實現了第一次啟動時間較長,以后快速連續(xù)動作的要求。如果檢測到鍵已被釋放,則清除所有標志,將計數器清零,準備下一次按鍵處理?! 〕绦蜷_始時定義了兩個常量:Qdsj和Ljsj,如下所示const uintQdsj=500;/*與首次啟動連加(減)功能的時間有關*/const uintLjsj=30;/*與連加(減)的速度有關*/  這兩個常量與第一次啟動及連加、減的速度有關,具體數值應根據實際情況試驗后確定。下面是部分鍵處理程序,注意其中這兩個變量的使用。voidKey()/*鍵處理*/{……if(!KeyValue){…無鍵按下,清除一切標志退出}if(KeyMark)/*第一次檢測到按鍵嗎?*/{KeyCounter++;/*不是第一次(KeyMark已是1了)*/if(Qdsj==KeyCounter) /*連續(xù)按著已有Qdsj次了*/{KeyCounter-=Ljsj; /*減去Ljsj次*/ KeyProcess(KeyValue,1);/*鍵值處理*/}else{return;}/*如果按著還沒有到Qdsj*/}else /*第一次檢測到有鍵按下*/{ mDelay(10);/*延時10毫秒*/…再次檢測if(!KeyValue){…清除一切標志并返回}}二、小數點的處理  要在LED數碼管上顯示小數點,可以有兩種選擇,一種方式是在顯示0.1~0.9時用小數顯示,而在顯示1~500時不顯示小數點,這種方式編程略麻煩一些;另一種是使用定點的方式顯示小數點,即不論是在0.1~0.9Hz段,還是1~500Hz段,均在倒數第二位點亮小數點,這種顯示方式比較簡單,本機采用了第二種方式?! ⊥ǔ#酶呒壵Z言編程時,可以用浮點型數據來表示小數,但本程序并沒有這樣來處理。因為單片機的資源有限,而浮點型數據的表達方式與其他數據的表達方式很不相同,無論是存儲還是運算,都相當占用資源,因而在單片機中能不用浮點型數據就盡量不要使用。這里我們將所有的頻率設定值擴大10倍,即所要求的頻率值是0.1~500Hz,但在單片機內部用1~5000來表示。如果頻率設定值小于10,每按一次鍵,頻率設定值就加或減1,如果頻率設定值大于等于10,每按一次按鍵就加或減10。例如,當前頻率設定值為100,按一下“增加”鍵,該值就會變?yōu)?10,相當于頻率設定值由10變?yōu)?1;如果當前設定值為9,按一下“減少”鍵,該值變?yōu)?,相當于頻率值由0.9變到了0.8。在根據頻率設定值計算定時常數時,只要將被除數擴大10倍即可,程序中是這樣表示的:LTEmp=1000000;  ltemp*=10; //由于plsd被放大了10倍,故被除數也放大10倍……  在顯示頻率設定值時,點亮倒數第二位的數碼管上的小數點,顯示程序中有這樣的程序行:if(Counter1==1) //如果當前正在顯示倒數第二位時{ if(!PlSl) //如果是要求顯示頻率DispCode=DispCode&0xbf;/*點亮小數點*/}  由于P0.6與小數點位相連,所以不論待顯示的數是多少,該位被清零后,小數點就能被點亮。要將該位清零,只要將字形碼與0xbf(10111111)相與即可。三、AT24C01A的讀寫  AT24C01A芯片是具有I2C接口的EEPROM,由于89C51 單片機 沒有I2C接口,因此,必須用I/O口模擬I2C時序。這里僅提供作者用C語言編寫的接口程序,不對此作更多的介紹?! ∈褂眠@一接口程序,只要定義好寫常數、讀常數及根據硬件連線定義好三個引腳SDA、SCL和WP,然后直接調用讀、寫函數即可。#defineAddWr0xa0/*器件地址選擇及寫標志*/#defineAddRd0xa1/*器件地址選擇及讀標志*/sbitSda=P3^7;/*串行數據*/sbitScl=P3^6;/*串行時鐘*/sbitWP=P3^5;  接口程序提供了多字節(jié)的讀、寫函數,其中讀函數需要用到三個參數:用于存放讀出數據的數組,待讀EEPROM的起始地址,字節(jié)數;寫函數也要用到三個參數:用于存放待寫入數據的數組,待寫入EEPROM的起始地址,字節(jié)數。下面是這兩個函數的用法參考:  RdFromROM(Number,10,2); //從地址10H開始處讀出2個字節(jié),存入Numbre數組中?! rToROM(Number,10,2); //將Number數組中的2個字節(jié)寫入EEPROM,地址從10H開始四、信號產生  信號發(fā)生由定時中斷0完成,在定時時間到之后,重置定時常數,接著判斷究竟是較高頻率還是較低頻率,分別予以處理,如果是較高頻率,直接取反輸出端口即可返回,如果是較低頻率,則要進行計數,并判斷計數值是否到設定值,如果到了,則取反輸出端口,并清零計數器,然后再返回,這部分程序如下 :voidOutWave()interrupt1 //定時0中斷用于波形輸出{ statICuint Count; //較低頻率時計數用TH0=CTH0; //重裝時間常數TL0=CTL0;if(HighLow) //如果是較高頻率{ WaveOut=!WaveOut;Mczsl++; }else{ Count++;if(Count>=Plcs){ WaveOut=!WaveOut;Count=0;Mczsl++;} } }  其中Mczsl是脈沖輸出個數的計數值。從程序中還可以看出,每次輸出只能得到波形的一半,要么高電平,要么低電平,一個完整的波形需要兩次輸出才能完成?! 《〞r中斷中所設定的定時常數,預設定計數值(Plcs)都由主程序根據頻率設定值計算得到,根據前述原理,對于較低頻率的信號和較高頻率的信號采用兩種不同的方法產生,對于較低頻率的信號,定時常數是一個定值,通過改變預設定計數值來達到定時時間,而對于較高頻率的信號,直接改變定時常數來改變定時時間。為此,在主程序中根據設定值的大小分別處理,如果設定值大于10Hz,那么是較高頻率的算法,只要計算出設定頻率值對應的時間,不難得到待設定值,程序中的處理方法是:ltemp=1000000;ltemp*=10; //由于plsd被放大了10倍,故被除數也放大10倍ltemp/=Plsd; //獲得周期(單位微秒)ltemp/=2; //獲得定時常數  根據t=1/f,計算定時時間,單位是s,而我們所要求的定時時間單位是μs,因此,首先讓ltemp等于1000000,又由于Plsd變量在 單片機 內部被放大10倍,故再將該值擴大10倍,然后用ltemp為被除數,去除以Plsd,得到周期數。由于每次定時中斷只能得到一半波形,因此定時數應該是周期數的一半,將周期數除以2,即得到了定時常數。顯然,這里沒有先計算時間到s,然后再換算為μs,其目的也是為了避免小數運算。當所設定的頻率值小于10Hz時,程序是這樣處理的:CTH0=(65536-1000)/256;CTL0=(65536-1000)%256; //否則是在10HZ以下,定時器的定時常數是1msHighLow=0;Plcs=5000/Plsd;  首先將定時常數確定為1000μs,然后將標志位HighLow置0,表示要進行較低頻率的處理,最后計算出中斷次數。中斷次數這樣來確定:用10000000/Plsd得到周期數,然后用這個值除以2000即得可,這時除以2000的原因同上述分析,即定時時間為1000μs,最終得到的的周期是2000μs。限于篇幅,完整的源程序在本期光盤中提供。  如果讀者在設計、制作等方面有收獲,歡迎到http://www.mcustudio.com(平凡 單片機 工作室)交流,如果在制作、調試或有什么困難,也可以到這里尋求幫助。作者制作的成品如圖2所示。
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉