第一篇:STC單片機(jī)通用AD轉(zhuǎn)換程序
福星電子網(wǎng)http://
#include
#include
sfr P1_ADC_EN = 0x97;//A/D轉(zhuǎn)換功能允許寄存器
sfr ADC_CONTR = 0xC5;//A/D轉(zhuǎn)換控制寄存器
sfr ADC_DATA = 0xC6;//A/D轉(zhuǎn)換結(jié)果寄存器 高8位,sfr ADC_LOW2 = 0xC7;//A/D轉(zhuǎn)換結(jié)果寄存器 低2位,如果是8位AD無此寄存器。
#define uchar unsigned char;
#define uint unsigned int;
Uintad_out1,ad_out2;
void delay(uchar delay_time)// 延時(shí)函數(shù)
{
uchar n;
uint m;
for(n=0;n { for(m=0;m<10000;m++); } } uchar get_AD_result(uchar channel) { uchar AD_finished = 0;// 存儲(chǔ) A/D 轉(zhuǎn)換標(biāo)志 ADC_DATA = 0; ADC_CONTR = channel;// 選擇 A/D 當(dāng)前通道 _nop_();_nop_();_nop_();//使輸入電壓達(dá)到穩(wěn)定 _nop_();_nop_();_nop_(); ADC_CONTR |= 0x08;//0000,1000 令 ADC_START = 1, 啟動(dòng)A/D 轉(zhuǎn)換 AD_finished = 0; while(AD_finished == 0)// 等待A/D 轉(zhuǎn)換結(jié)束 { AD_finished =(ADC_CONTR & 0x10);//0001,0000, ADC_FLAG ==1測試A/D轉(zhuǎn)換結(jié)束否 } ADC_CONTR &= 0xF7;//1111,0111 令 ADC_START = 0, 關(guān)閉A/D 轉(zhuǎn)換,return(ADC_DATA);// 返回 A/D 轉(zhuǎn)換結(jié)果 } void main() { P1 = P1 | 0x01;// 0000,0001,P1.0為 A/D 轉(zhuǎn)換,即通道0與1 福星電子網(wǎng)http:// P1_ADC_EN = 0x01;//0000,0001, P1 的P1.0設(shè)置為 A/D 轉(zhuǎn)換輸入腳// 斷開P1.0,P1.1 內(nèi)部上拉電阻 while(1) { get_AD_result(0); delay(10); //可以多采集幾次求均值 //8位數(shù)據(jù)輸出,參考電壓5V ad_out1=(ADC_DATA*5)/256 //8位數(shù)據(jù)輸出,參考電壓5V ad_out2=((ADC_DATA*4)+ ADC_LOW2)/1024 } } 第九章 數(shù)模/模數(shù)轉(zhuǎn)換電路 一、概念 1、信號(hào)分類:時(shí)間連續(xù)、數(shù)值連續(xù)的信號(hào)(模擬信號(hào)) 時(shí)間連續(xù)、數(shù)值離散的信號(hào) 時(shí)間離散、數(shù)值連續(xù)的信號(hào) 時(shí)間離散、數(shù)值離散的信號(hào)(數(shù)字信號(hào)) 2、典型的模擬信號(hào)處理系統(tǒng)由三部分組成: (1)模數(shù)轉(zhuǎn)換器、(2)數(shù)字信號(hào)處理器、(3)數(shù)模轉(zhuǎn)換器。 3、模數(shù)轉(zhuǎn)換器將待處理的模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào); 數(shù)字信號(hào)處理器對(duì)轉(zhuǎn)換過來的數(shù)字信號(hào)進(jìn)行處理,得到數(shù)字的處理結(jié)果; 數(shù)模轉(zhuǎn)換器將處理結(jié)果轉(zhuǎn)換成模擬信號(hào)。 二、D/A轉(zhuǎn)換器 1、D/A轉(zhuǎn)換器功能:將數(shù)字量成正比地轉(zhuǎn)換成模擬量 D/A轉(zhuǎn)換器由電阻網(wǎng)絡(luò)、模擬電子開關(guān)及求和運(yùn)算放大器 3、權(quán)電阻網(wǎng)絡(luò)數(shù)模轉(zhuǎn)換器 然而,位權(quán)電阻網(wǎng)絡(luò)數(shù)模轉(zhuǎn)換器包含種電阻,要在比較大的阻值范圍內(nèi)保證每個(gè)電阻都有很高的精度是十分困難的,尤其對(duì)制造集成電路不利。雖然雙級(jí)權(quán)電阻網(wǎng)絡(luò)數(shù)模轉(zhuǎn)換器[圖9.2.2] 所用的電阻種類減少了一倍,但是并沒有質(zhì)的變化。由于構(gòu)思巧妙,倒T形權(quán)電阻網(wǎng)絡(luò)數(shù)模轉(zhuǎn)換器[圖9.2.3] 所用的電阻種類只有兩種,10位數(shù)模轉(zhuǎn)換器AD7520就是一種倒T形權(quán)電阻網(wǎng)絡(luò)數(shù)模轉(zhuǎn)換器。為靈活起見,AD7520沒有包含運(yùn)算放大器,使用時(shí)需要外接。目前單片集成數(shù)模轉(zhuǎn)換器多采用權(quán)電流型或開關(guān)電容型結(jié)構(gòu)。理想情況下,位數(shù)模轉(zhuǎn)換器的輸出電壓正比于輸入的數(shù)字量,即數(shù)字量,果,其中,為輸出的模擬電壓,為輸入的為參考電壓。顯然,如果為正,則為負(fù);反之,如為負(fù),則為正。如果需要具有雙極性輸出電壓的數(shù)模轉(zhuǎn)換器,為正)或負(fù)的(如果我們只需添加一個(gè)電阻和一個(gè)正的(如果為負(fù))直流電壓源,使運(yùn)算放大器稱為加法器即可[圖9.2.15]。 為了保證信號(hào)處理結(jié)果的準(zhǔn)確性,數(shù)模轉(zhuǎn)換器必須有足夠的精度。數(shù)模轉(zhuǎn)換器在理論上可以達(dá)到的精度常用分辨率來表示,例如,12位數(shù)模轉(zhuǎn)換器的精度比8位數(shù)模轉(zhuǎn)換器的精度高得多,16位數(shù)模轉(zhuǎn)換器的精度比12位數(shù)模轉(zhuǎn)換器的精度高得多,等等。數(shù)模轉(zhuǎn)換器實(shí)際上可以達(dá)到的精度用轉(zhuǎn)換誤差來表示。例如,轉(zhuǎn)換誤差為1/2LSB(最低有效位)的數(shù)模轉(zhuǎn)換器的精度比轉(zhuǎn)換誤差為1LSB的數(shù)模轉(zhuǎn)換器的精度高。為了保證信號(hào)處理結(jié)果的時(shí)效性,數(shù)模轉(zhuǎn)換器必須有足夠的轉(zhuǎn)換速度。通常用建立時(shí)間來表示數(shù)模轉(zhuǎn)換器的轉(zhuǎn)換速度。在對(duì)轉(zhuǎn)換速度要求不太高的場合,有時(shí)采用串行輸入的數(shù)模轉(zhuǎn)換器,以便減少傳輸線的數(shù)目。這種模數(shù)轉(zhuǎn)換器由并行輸入的數(shù)模轉(zhuǎn)換器和移位寄存器構(gòu)成,其中一位寄存器可以將串行的數(shù)字信號(hào)轉(zhuǎn)換為并行的數(shù)字信號(hào),供并行輸入的數(shù)模轉(zhuǎn)換器使用。 二、A/D轉(zhuǎn)換器 1、模數(shù)轉(zhuǎn)換的過程有四個(gè)階段,即采樣、保持、量化和編碼。1)采樣是將連續(xù)時(shí)間信號(hào)變成離散時(shí)間信號(hào)的過程。經(jīng)過采樣,時(shí)間連續(xù)、數(shù)值連續(xù)的模擬信號(hào)就變成了時(shí)間離散、數(shù)值連續(xù)的信號(hào),稱為采樣信號(hào)。采樣電路相當(dāng)于一個(gè)模擬開關(guān),模擬開關(guān)周期性地工作。理論上,每個(gè)周期內(nèi),模擬開關(guān)的閉合時(shí)間趨近于0。在模擬開關(guān)閉合的時(shí)刻(采樣時(shí)刻),我們就“采”到模擬信號(hào)的一個(gè)“樣本”。2)量化是將連續(xù)數(shù)值信號(hào)變成離散數(shù)值信號(hào)的過程。理論上,經(jīng)過量化,我們就可以將時(shí)間離散、數(shù)值連續(xù)的采樣信號(hào)變成時(shí)間離散、數(shù)值離散的數(shù)字信號(hào)。 我們知道,在電路中,數(shù)字量通常用二進(jìn)制代碼表示。因此,量化電路的后面有一個(gè)編碼電路,將數(shù)字信號(hào)的數(shù)值轉(zhuǎn)換成二進(jìn)制代碼。3)然而,量化和編碼總是需要一定時(shí)間才能完成,所以,量化電路的前面還要有一個(gè)保持電路。保持是將時(shí)間離散、數(shù)值連續(xù)的信號(hào)變成時(shí)間連續(xù)、數(shù)值離散信號(hào)的過程。在量化和編碼期間,保持電路相當(dāng)于一個(gè)恒壓源,它將采樣時(shí)刻的信號(hào)電壓“保持”在量化器的輸入端。雖然邏輯上保持器是一個(gè)獨(dú)立的單元,但是,工程上保持器總是與采樣器做在一起。兩者合稱采樣保持器。 2、模數(shù)轉(zhuǎn)換器有直接型和間接型兩種。 STC單片機(jī)串口在線燒錄芯片問題總結(jié) 在一個(gè)偶然和朋友聊天中了解了STC單片機(jī)芯片,從此一發(fā)不可收拾。當(dāng)時(shí)我看中STC芯片的一個(gè)主要原因是因?yàn)樗蠥D轉(zhuǎn)換功能和在線燒錄功能。用到現(xiàn)在算起來也大致有三、四年的時(shí)間了,在此期間用了不少STC不同型號(hào)的芯片??偟膩碇v這個(gè)芯片還是比較好使的,但在燒錄過程中也碰到不少麻煩,現(xiàn)在把它羅列如下,以便和同行們一起交流、探討和學(xué)習(xí)。 第一種情況是通過USB轉(zhuǎn)串口燒錄。曾經(jīng)成功過一段時(shí)間,但后來不知道為什么再也燒錄不進(jìn)去了,直到現(xiàn)在也不明白其中的道理。查了一些資料說是USB轉(zhuǎn)串口的芯片問題,需要專用芯片的USB轉(zhuǎn)串口。我也信了,但從此給我的印象是-------STC單片機(jī)燒錄程序時(shí)是要挑芯片的。 第二種情況是串口燒錄時(shí)有些232芯片不好用,一打聽才知道是232芯片不好,不能用國產(chǎn)的要用進(jìn)口的,我又專門去買了一批7元多一片的進(jìn)口232芯片,結(jié)果-------沒有成功過。不得已只好換回用國產(chǎn)的,哎!好了,謝天謝地!阿彌多佛!看來STC芯片串口在線燒錄不但挑USB轉(zhuǎn)串口的芯片,還挑232芯片。 第三種情況是同一批板子、同一批232芯片有些板子能在線燒錄程序,而有些板子卻不能燒錄程序,實(shí)在沒辦法。還好本次產(chǎn)品是采用PLCC封裝的,只好把不能燒錄的芯片拔到可以燒錄的板子上去燒錄好再拔插回去,說到這里有人可能會(huì)懷疑不能燒錄的板子232芯片或外圍電路有問題,我當(dāng)時(shí)的直覺也是這樣的,但是我板子232口只要燒錄好程序,工作時(shí)通訊一切正常,這又作何解釋?不可思議! 第四種情況(也是我偶然發(fā)現(xiàn)的)5v的STC15F104E芯片,有時(shí)候能燒錄,有時(shí)候不能燒錄,不能燒錄的概率在90%以上,真是莫名其妙。摸索了將近一天時(shí)間才發(fā)現(xiàn)串口接上后(板子在沒有上電的時(shí)候)STC芯片電源腳有約3v電壓,我想想可能是從串口反串回來的,有這3v電壓的存在,芯片就如同沒有掉電,所以也就燒錄不進(jìn)去。我就用鑷子把電源到地短接一下,目的是進(jìn)行放電。然后馬上給板子上電,哎~~~成了!并且屢試不爽。有類似情況的朋友也不妨一試。哈。。 第五種情況是我有一批板子用的是STC12LE5A60S2 QFP44封裝,在我的筆記本上用串口燒錄成功率為100%,而到我臺(tái)式機(jī)上用串口燒錄時(shí)成功率卻為0%,是我臺(tái)機(jī)的串口有問題嗎?非也!臺(tái)機(jī)串口燒錄STC15F104E和其它是好的,但是對(duì)付本批次板卻是無計(jì)可施,最后無論我如何絞盡腦汁也不得其解,只好懷疑是板子在設(shè)計(jì)時(shí)有問題,但是設(shè)計(jì)有問題的板子為什么在筆記本上燒錄又是好的呢?只能說-------STC芯片串口在線燒錄不但挑USB轉(zhuǎn)串口的芯片、挑232芯片,還挑電腦。 第六種情況是同一塊板子今天能燒錄進(jìn)去,過一段時(shí)間又燒錄不進(jìn)去了,再放一段時(shí)間又能燒錄進(jìn)去了。唉~~~看來STC芯片串口在線燒錄不但挑USB轉(zhuǎn)串口的芯片、挑232芯片、挑電腦,還要看它的心情。 我暈!STC的芯片真的是讓人歡喜讓人憂。 SECOND EQU 40H ;給內(nèi)存RAM空間中40H單元起名SECOND MINUTE EQU 41H ;給內(nèi)存RAM空間中41H單元起名MINUTE HOUR EQU 42H ;給內(nèi)存RAM空間中42H單元起名HOUR SECONDGEWEI EQU 43H ;給43H單元起名SECONDGEWEI存秒的個(gè)位 SECONDSHIWEI EQU 44H ;給44H單元起名SECONDSHIWEI存秒的十位 MINUTEGEWEI EQU 45H ;給45H單元起名MINUTEGEWEI存分的個(gè)位 MINUTESHIWEI EQU 46H ;給46H單元起名MINUTESHIWEI存分的十位 HOURGEWEI EQU 47H ;給47H單元起名HOURGEWEI存小時(shí)的個(gè)位 HOURSHIWEI EQU 48H ;給48H單元起名HOURSHIWEI存小時(shí)的十位 ORG 0000H ;復(fù)位時(shí)程序從此開始 SJMP START ;跳到START進(jìn)行初始化 ORG 000BH ;定時(shí)器 0中斷入口 AJMP TIMER0 ;跳轉(zhuǎn)到TIMER0處 ORG 0030H ;初始化程序從30H開始;---------------初始化START------------------------------START: MOV SECOND, #0 ;給秒存儲(chǔ)單元SECOND賦初始值0 MOV MINUTE, #0 ;給分存儲(chǔ)單元MINUTE賦初始值0 MOV HOUR , #12 ;給小時(shí)存儲(chǔ)單元HOUR賦初始值12 MOV DPTR , #TAB ;給數(shù)據(jù)指針賦值,將DPTR指向TAB數(shù)據(jù)表頭處 MOV 30H, #0 ;給30H單元賦初始值0(用于計(jì)20次的50ms中斷)MOV TH0,#3CH ;給計(jì)數(shù)容器的高8位TH0賦初始值3CH MOV TL0,#0B0H ;給計(jì)數(shù)容器的低8位TL0賦初始值B0H MOV TMOD,#00000001B ;C/T位設(shè)置為0,M1M0設(shè)置位10,即模式1定時(shí) MOV TCON,#00010000B ;TR0設(shè)置為1,即啟動(dòng)定時(shí)器0開始工作 SETB ET0 ;IE中的ET0位設(shè)置為1,開定制器中斷0 SETB EA ;IE中的EA位設(shè)置為1,開總中斷;-----------------------主程序MAIN-----------------------------MAIN:CALL KEY ;調(diào)按鍵子程序KEY CALL PROCESS ;調(diào)數(shù)據(jù)處理子程序PROCESS CALL DISPLAY ;調(diào)顯示子程序DISPLAY SJMP MAIN ;跳轉(zhuǎn)到MAIN標(biāo)號(hào)處;------------------------------按鍵子程序KEY調(diào)時(shí)-------------------KEY:MOV P1,#0FEH ;行掃描 LCALL DELAY ;JNB P1.4,HOURJIA ;P1.4引腳如果是低電平就跳到HOURJIA處 JNB P1.5,HOURJIAN ;P1.5引腳如果是低電平就跳到HOURJIAN處 JNB P1.6,MINUTEJIA ;P1.6引腳如果是低電平就跳到MIMUTEJIA處 JNB P1.7,MINUTEJIAN ;P1.7引腳如果是低電平就跳到MIMUTEJIAN處 FANHUI:RET ;子程序返回(如果沒有按鍵按下) HOURJIA:CALL DELAY ;調(diào)延時(shí)程序目的是跳過按鍵抖動(dòng)期(去抖)JB P1.4,FANHUI ;P1.4如果是高電平就跳到FANHUI處(沒鍵按)JNB P1.4,$ ;如果P1.4是低電平就停在當(dāng)前位置等鍵釋放 MOV R4,HOUR CJNE R4,#23,A1 ;判斷時(shí)數(shù)字是否為23 AJMP A2 A1:INC HOUR ;把小時(shí)位加1 MOV SECOND, #0 ;小時(shí)進(jìn)位,秒歸0 RET A2:MOV HOUR,#0 ;小時(shí)數(shù)為23時(shí)加一為0 MOV SECOND, #0 ;小時(shí)進(jìn)位,秒歸0 RET ;子程序返回 HOURJIAN:CALL DELAY ;調(diào)延時(shí)程序目的是跳過按鍵抖動(dòng)期(去抖)JB P1.5,FANHUI JNB P1.5,$ MOV R5,HOUR CJNE R5,#0,A3 AJMP A4 A3:DEC HOUR MOV SECOND, #0 RET A4:MOV HOUR,#23 MOV SECOND, #0 RET MINUTEJIA:CALL DELAY JB P1.6,FANHUI JNB P1.6,$ MOV R6,MINUTE CJNE R6,#59,A5 AJMP A6 A5:INC MINUTE MOV SECOND, #0 RET A6:MOV SECOND, #0 MOV MINUTE, #0 MOV R4,HOUR CJNE R4,#23,A10 MOV HOUR,#0 RET A10:INC HOUR RET MINUTEJIAN:CALL DELAY JB P1.7,FANHUI JNB P1.7,$ MOV R7,MINUTE CJNE R7,#0,A7 AJMP A8 A7:DEC MINUTE ;P1.5如果是高電平就跳到FANHUI處(沒鍵按) ;如果P1.5是低電平就停在當(dāng)前位置等鍵釋放 ;判斷時(shí)數(shù)字是否為23 ;把小時(shí)位減1 ;小時(shí)數(shù)為0時(shí)減一為23 ;子程序返回 ;調(diào)延時(shí)程序目的是跳過按鍵抖動(dòng)期(去抖) ;P1.6如果是高電平就跳到FANHUI處(沒鍵按) ;如果P1.6是低電平就停在當(dāng)前位置等鍵釋放 ;判斷分鐘數(shù)是否為59 ;把分鐘位加1 ;給秒存儲(chǔ)單元SECOND賦初始值0 ;分鐘數(shù)為59則分鐘歸0 ;判斷時(shí)數(shù)字是否為23 ;23時(shí)增1歸0 ;分鐘數(shù)為59 自增1后小時(shí)增1 ;子程序返回 ;調(diào)延時(shí)程序目的是跳過按鍵抖動(dòng)期(去抖) ;P1.7如果是高電平就跳到FANHUI處(沒鍵按) ;如果P1.7是低電平就停在當(dāng)前位置等鍵釋放 ;判斷分鐘數(shù)是否為0 ;分鐘不為0把分鐘位減1 MOV SECOND, #0 RET A8:MOV MINUTE, #59 ;分鐘數(shù)為0時(shí)減一為59 MOV R4,HOUR CJNE R4,#0,A9 ;判斷時(shí)鐘數(shù)是否為0 MOV HOUR,#23 ;時(shí)鐘數(shù)為0減1為23 MOV SECOND, #0 RET A9:DEC HOUR ;時(shí)鐘數(shù)不為0則減1 MOV SECOND, #0 RET ;子程序返回;-------------------處理子程序PROCESS-----------------------PROCESS:MOV A, SECOND ;把SECOND中的秒值拷貝給A MOV B, #10 ;給寄存器B賦值10 DIV AB ;A除以B,結(jié)果存入A中,余數(shù)存入B中 MOV SECONDSHIWEI , A ;結(jié)果即秒的十位數(shù)拷貝給SECONDSHIWEI MOV SECONDGEWEI , B ;余數(shù)即秒的個(gè)位拷貝給SECONDGEWEI MOV A, MINUTE ;把MINUTE中的分值拷貝給A MOV B, #10 ;給寄存器B賦值10 DIV AB ;A除以B,結(jié)果存入A中,余數(shù)存入B中 MOV MINUTESHIWEI , A ;結(jié)果即分的十位拷貝給MINUTESHIWEI MOV MINUTEGEWEI , B ;余數(shù)即分的個(gè)位拷貝給MINUTEGEWEI MOV A, HOUR ;把HOUR中的小時(shí)值拷貝給A MOV B, #10 ;給寄存器B賦值10 DIV AB ;A除以B,結(jié)果存入A中,余數(shù)存入B中 MOV HOURSHIWEI , A ;結(jié)果即小時(shí)的十位拷貝給HOURSHIWEI MOV HOURGEWEI , B ;余數(shù)即小時(shí)的個(gè)位拷貝給HOURGEWEI RET ;子程序結(jié)束返回到主程序;-----------------顯示子程序DISPLAY--------------DISPLAY:MOV A, HOURSHIWEI ;小時(shí)的十位拷貝給A MOVC A, @A+DPTR ;到A+DPRT這個(gè)數(shù)對(duì)應(yīng)的地方找顯示段碼拷貝給A MOV P0, A ;把顯示段碼(小時(shí)的十位)送到P0 CLR P2.0 ;將P2.0置低電平,對(duì)應(yīng)的三極管導(dǎo)通 CALL DELAY ;調(diào)延時(shí)(讓顯示小時(shí)十位的數(shù)碼管持續(xù)亮一段時(shí)間)SETB P2.0 ;將P2.0置高電平,對(duì)應(yīng)三極管截止,對(duì)應(yīng)數(shù)碼管滅 MOV A, HOURGEWEI ;小時(shí)的個(gè)位拷貝給A MOVC A,@A+DPTR ;到A+DPRT這個(gè)數(shù)對(duì)應(yīng)的地方找顯示段碼拷貝給A MOV P0, A ;把顯示段碼(小時(shí)的個(gè)位)送到P0 CLR P2.1 ;將P2.1置低電平,對(duì)應(yīng)的三極管導(dǎo)通 CALL DELAY ;調(diào)延時(shí)(讓顯示小時(shí)個(gè)位的數(shù)碼管持續(xù)亮一段時(shí)間)SETB P2.1 MOV P0,#7FH CLR P2.1 CALL DELAY SETB P2.1 ;將P2.1置高電平,對(duì)應(yīng)三極管截止,對(duì)應(yīng)數(shù)碼管滅 MOV A, MINUTESHIWEI ;分鐘的十位拷貝給A MOVC A,@A+DPTR ;到A+DPRT這個(gè)數(shù)對(duì)應(yīng)的地方找顯示段碼拷貝給A MOV P0, A ;把顯示段碼(分鐘的十位)送到P0 CLR P2.2 ;將P2.2置低電平,對(duì)應(yīng)的三極管導(dǎo)通 CALL DELAY ;調(diào)延時(shí)(讓顯示分鐘十位的數(shù)碼管持續(xù)亮一段時(shí)間)SETB P2.2 ;將P2.2置高電平,對(duì)應(yīng)三極管截止,對(duì)應(yīng)數(shù)碼管滅 MOV A, MINUTEGEWEI ;分鐘的個(gè)位拷貝給A MOVC A,@A+DPTR ;到A+DPRT這個(gè)數(shù)對(duì)應(yīng)的地方找顯示段碼拷貝給A MOV P0, A ;把顯示段碼(分鐘的個(gè)位)送到P0 CLR P2.3 ;將P2.3置低電平,對(duì)應(yīng)的三極管導(dǎo)通 CALL DELAY ;調(diào)延時(shí)(讓顯示分鐘個(gè)位的數(shù)碼管持續(xù)亮一段時(shí)間)SETB P2.3 ;將P2.3置高電平,對(duì)應(yīng)三極管截止,對(duì)應(yīng)數(shù)碼管滅 MOV P0,#7FH CLR P2.3 CALL DELAY SETB P2.3 MOV A, SECONDSHIWEI ;秒的十位拷貝給A MOVC A,@A+DPTR ;到A+DPRT這個(gè)數(shù)對(duì)應(yīng)的地方找顯示段碼拷貝給A MOV P0, A ;把顯示段碼(秒鐘的十位)送到P0 CLR P2.4 ;將P2.4置低電平,對(duì)應(yīng)的三極管導(dǎo)通 CALL DELAY ;調(diào)延時(shí)(讓顯示秒鐘十位的數(shù)碼管持續(xù)亮一段時(shí)間)SETB P2.4 ;將P2.4置高電平,對(duì)應(yīng)三極管截止,對(duì)應(yīng)數(shù)碼管滅 MOV A, SECONDGEWEI ;秒的個(gè)位拷貝給A MOVC A,@A+DPTR ;到A+DPRT這個(gè)數(shù)對(duì)應(yīng)的地方找顯示段碼拷貝給A MOV P0, A ;把顯示段碼(秒鐘的個(gè)位)送到P0 CLR P2.5 ;將P2.5置低電平,對(duì)應(yīng)的三極管導(dǎo)通 CALL DELAY ;調(diào)延時(shí)(讓顯示秒鐘個(gè)位的數(shù)碼管持續(xù)亮一段時(shí)間)SETB P2.5 ;將P2.5置高電平,對(duì)應(yīng)三極管截止,對(duì)應(yīng)數(shù)碼管滅 RET ;顯示子程序結(jié)束返回主程序;--------------------中斷服務(wù)子程序----------------------------TIMER0:MOV R3, A ;把A中的數(shù)據(jù)送入R3保護(hù)起來 INC 30H ;30H單元中的數(shù)加1 MOV A, 30H ;30H單元中的數(shù)據(jù)拷貝給A CJNE A,#20,JIXU ;A中的數(shù)據(jù)與20比較不相等就跳轉(zhuǎn)到JIXU處 MOV 30H,#0 ;(如果30H單元計(jì)滿20了)給30H賦值0 INC SECOND ;把SECOND中的秒鐘數(shù)加1 MOV A,SECOND ;把SECOND中的數(shù)據(jù)拷貝給A CJNE A, #60, JIXU ;A中的數(shù)據(jù)與60比較不相等就跳轉(zhuǎn)到JIXU處 MOV SECOND, #0 ;給秒SECOND賦值0 INC MINUTE ;把MINUTE中的分鐘數(shù)加1 MOV A, MINUTE ;把MINUTE中的數(shù)據(jù)拷貝給A CJNE A, #60, JIXU ;A中的數(shù)據(jù)與60比較不相等就跳轉(zhuǎn)到JIXU處 MOV MINUTE, #0 ;給分鐘MINUTE賦值0 INC HOUR ;把HOUR中的小時(shí)數(shù)據(jù)加1 MOV A, HOUR ;把HOUR中的數(shù)據(jù)拷貝給A CJNE A, #24, JIXU ;A中的數(shù)據(jù)與24比較不相等就跳轉(zhuǎn)到JIXU處 MOV HOUR, #0 ;給小時(shí)HOUR賦值0 JIXU: MOV A,R3 ;把剛才送入R3中的數(shù)據(jù)還給A MOV TH0,#3CH ;給計(jì)數(shù)容器的高8位TH0賦初始值3CH MOV TL0,#0B0H ;給計(jì)數(shù)容器的低8位TL0賦初始值B0H RETI ;中斷子程序返回主程序;---------------------------延時(shí)子程序----------------------------DELAY:MOV R0, #50 ;給R0賦值50 D2:MOV R1, #10 ;給R1賦值10 D1:DJNZ R1, D1 ;R1減1不等于0跳到D1處 DJNZ R0, D2 ;R0減1不等于0跳到D2處 RET ;延時(shí)子程序結(jié)束返回調(diào)用該程序的下一條;---------------下面的數(shù)據(jù)表中存儲(chǔ)的是顯示段碼(共陽)-------------------TAB:DB 0C0H,0F9H,0A4H,0B0H,99H ;從TAB處開始存儲(chǔ)0、1、2、3、4 DB 92H ,82H ,0F8H,80H ,90H ;5、6、7、8、9對(duì)應(yīng)的顯示段碼 END ;程序結(jié)束 51單片機(jī)舵機(jī)程序不用定時(shí)器:自己整理的不用定時(shí)器調(diào)舵機(jī)向左,中,右三個(gè)方向擺動(dòng)的51單片機(jī)程序 #include for(y=110;y>0;y--);} void delayus2x(unsigned char t){ while(--t);} void delay750us(){ delayus2x(245);delayus2x(122);} void delay1500us(){ delayus2x(245); delayus2x(245); delayus2x(245);} void delay2300us(){ delayus2x(245); delayus2x(245); delayus2x(245); delayus2x(245); delayus2x(147); } void main() //a=~a和delay順序不能反 { while(1){ uint i=50;while(--i) //中 { a=1; delay1500us(); a=0; delay(20); } i=50; while(--i) { a=1; delay2300us(); a=0; delay(20); } i=50; while(--i) { a=1; delay750us(); a=0; delay(20); } } } //左 //右第二篇:第十章 AD轉(zhuǎn)換電路教案
第三篇:STC單片機(jī)串口在線燒錄芯片問題總結(jié)
第四篇:89C51單片機(jī)時(shí)鐘程序
第五篇:51單片機(jī)舵機(jī)程序