郭天祥新概念51單片機(jī)C語(yǔ)言教程例題_第1頁(yè)
郭天祥新概念51單片機(jī)C語(yǔ)言教程例題_第2頁(yè)
郭天祥新概念51單片機(jī)C語(yǔ)言教程例題_第3頁(yè)
郭天祥新概念51單片機(jī)C語(yǔ)言教程例題_第4頁(yè)
郭天祥新概念51單片機(jī)C語(yǔ)言教程例題_第5頁(yè)
已閱讀5頁(yè),還剩143頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、- 148 -郭天祥目錄例2.2.1 編寫(xiě)程序,點(diǎn)亮第一個(gè)發(fā)光二極管(part2_1.c P27 )- 4 -例2.5.1利用for語(yǔ)句延時(shí)特性,編寫(xiě)第一個(gè)發(fā)光二極管以間隔1S亮滅閃動(dòng)的程序(part2_3.c P42)- 5 -例2.6.1編寫(xiě)程序使第一個(gè)發(fā)光二極管以間隔500ms亮滅閃動(dòng)。(part2_4.c P48)- 5 -例2.7.1編寫(xiě)程序使第一個(gè)二極管以亮200ms、滅800ms的方式閃動(dòng)。(part2_5.c P49)- 6 -例2.8.3利用C51自帶庫(kù)_crol_(),以間隔500ms,實(shí)現(xiàn)流水燈程序(part2_6.c P53)- 6 -例3.2.1編寫(xiě)程序使第一個(gè)數(shù)碼管

2、顯示8(part2.1_.1c P59)- 7 -例3.2.2讓實(shí)驗(yàn)板上6個(gè)數(shù)碼管同時(shí)點(diǎn)亮,依次顯示0到F,時(shí)間間隔為0.5ms,循環(huán)下去。(part2.1_2.c P61)- 8 -例3.3.1第一個(gè)數(shù)碼管顯示1,時(shí)間為0.5s,然后關(guān)閉它,立即讓第二個(gè)數(shù)碼管顯示2,時(shí)間為0.5s,在關(guān)閉它一直到最后一個(gè)數(shù)碼管顯示6,時(shí)間同樣為0.5s,關(guān)閉它之后再回來(lái)顯示第一個(gè)數(shù)碼管,一直循環(huán)下去。(part2.1_3.c P62)- 9 -例3.5.1利用定時(shí)器0工作方式1,在實(shí)驗(yàn)板上實(shí)現(xiàn)第一個(gè)發(fā)光管以1s亮滅閃爍。(part2.1.4.c P74)- 11 -例3.5.2用定時(shí)器0的方式1實(shí)現(xiàn)個(gè)第一發(fā)

3、光二極管以200ms間隔閃爍,用定時(shí)器1的方式1實(shí)現(xiàn)數(shù)碼管前兩位59s循環(huán)計(jì)時(shí)。(part2.1_5.c P75)- 12 -例4.1.1用數(shù)碼管前兩位顯示一個(gè)十進(jìn)制數(shù),變化范圍為0059,開(kāi)始時(shí)顯示00,每按下S2鍵一次,數(shù)值加1;每按下S3鍵一次,數(shù)值減1;每按下S4鍵一次,數(shù)值歸零;按下S5鍵一次,利用定時(shí)器功能使數(shù)值開(kāi)始自動(dòng)每秒加1,再次按下S5鍵,數(shù)值停止加1,保持顯示原數(shù)。(part2.2_1.c P82)- 14 -例4.2.1實(shí)驗(yàn)班上電時(shí),數(shù)碼管不顯示,順序按下矩陣鍵盤(pán)后,數(shù)碼管上依次顯示0F,六個(gè)數(shù)碼管同時(shí)靜態(tài)顯示即可。(part2.2_2.c P87)- 17 -例5.3.

4、1用單片機(jī)控制ADC0804進(jìn)行數(shù)模轉(zhuǎn)換,當(dāng)擰動(dòng)實(shí)驗(yàn)板上A/D旁邊的電位時(shí),在數(shù)碼管的前三位以十進(jìn)制方式顯示出A/D轉(zhuǎn)換后的數(shù)字量(8位A/D轉(zhuǎn)換后數(shù)值在0255變化)。(part2.3_1.c P107)- 21 -例5.5.1用單片機(jī)控制DAC0832芯片輸出電流,讓發(fā)光二級(jí)管D12由滅均勻變到最亮,再由最亮均勻熄滅。在最亮和最暗時(shí)使用蜂鳴器分別警報(bào)一聲,完成整個(gè)周期時(shí)間控制在5S左右,循環(huán)變化。(part2.3_2.c P121)- 23 -例6.5.1在上位機(jī)上用串口調(diào)試助手發(fā)送一個(gè)字符X,單片機(jī)收到字符后返回給上位機(jī)“I get X”,串口波特率設(shè)為9600bps。(part2.4_

5、1.c P137)- 25 -例6.6.1單片機(jī)上電后等待從上位機(jī)串口發(fā)來(lái)的命令,同時(shí)在數(shù)碼管的前三位以十進(jìn)制方式顯示A/D采集的數(shù)值,在未收到上位機(jī)發(fā)送來(lái)的啟動(dòng)A/D轉(zhuǎn)換命令之前數(shù)碼管始終顯示000。當(dāng)收到上位機(jī)以十六進(jìn)制發(fā)送來(lái)的01后,向上位機(jī)發(fā)送字符串“Turn on ad!”同時(shí)間隔1s讀取一次A/D的值,然后把A/D采集回來(lái)的8位二進(jìn)制轉(zhuǎn)換成十進(jìn)制表示的實(shí)際電壓浮點(diǎn)數(shù),并且從串口發(fā)送給上位機(jī),形式如“The voltage is 3.398438V”,發(fā)送周期也是一秒一次,同時(shí)在數(shù)碼管上也要每秒刷新現(xiàn)實(shí)的數(shù)值。當(dāng)收到上位機(jī)以十六進(jìn)制發(fā)送過(guò)來(lái)的02后,向上位機(jī)發(fā)送字符串“Turn of

6、f ad!”,然后停止發(fā)送電壓值,數(shù)碼管上顯示上次結(jié)束時(shí)保持的值。當(dāng)收到上位機(jī)發(fā)來(lái)的其他任何數(shù)時(shí),向上位機(jī)發(fā)送字符串“Error!”。- 27 -例7.2.1實(shí)現(xiàn)1602液晶的第一行顯示“I LOVE MCU!”,在第二行顯示W(wǎng)WW.TXMCU.COM。- 31 -例7.2.2實(shí)現(xiàn)1602第一行從左側(cè)移入“Hello everyone!”同時(shí)第二行從右側(cè)移入“Welcome to here!”,移入速度自定,然后停留在屏幕上。(part2.5_2.c P154)- 33 -例7.3.1實(shí)現(xiàn)12232液晶的第一行顯示“I LOVE MCU!”,第二行顯示“我愛(ài)單片機(jī)”。(part2.5_3.c

7、P160)- 34 -例7.3.2實(shí)現(xiàn)12232液晶第一行從右側(cè)移入“Hello everyone!”,同時(shí)第二行從右側(cè)移入“歡迎大家來(lái)學(xué)習(xí)!”移入速度自定,最后停留在屏幕上。(part2.5_4.c P163)- 37 -例7.4.1實(shí)現(xiàn)在12864液晶上第一行顯示“0123456789”,并且讓每一位數(shù)字隨機(jī)變化,第二行顯示“”,第三行顯示“天祥電子”,第四行對(duì)應(yīng)第三行顯示出下劃線。(part2.5_5.c P173)- 40 -知識(shí)點(diǎn):生成隨機(jī)數(shù)(part2.5_512232suiji.c P176)- 44 -例8.3.1利用定時(shí)器產(chǎn)生一個(gè)099秒變化的秒表,并且顯示在數(shù)碼管上,每過(guò)一

8、秒將這個(gè)變化的數(shù)寫(xiě)入板上AT24C02內(nèi)部。當(dāng)關(guān)閉實(shí)驗(yàn)板電源,并再次打開(kāi)實(shí)驗(yàn)板電源時(shí),單片機(jī)先從AT24C02中將原來(lái)寫(xiě)入的數(shù)讀取出來(lái),接著此數(shù)繼續(xù)變化并顯示在數(shù)碼管上。(part2.6_1.c P188)- 48 -例10.1.1利用定時(shí)器0工作方式0,在實(shí)驗(yàn)板上實(shí)現(xiàn)第一個(gè)發(fā)光管以1s亮滅閃爍。(part3.1.1.c P203)- 53 -例10.2.1利用定時(shí)器0工作方式2,在實(shí)驗(yàn)板上實(shí)現(xiàn)第一個(gè)發(fā)光管以1s亮滅閃爍。(part3.1.2.c P204)- 54 -例10.3.1利用定時(shí)器工作方式3,在實(shí)驗(yàn)板上實(shí)現(xiàn):用TL0計(jì)數(shù)器對(duì)應(yīng)的8位定時(shí)器實(shí)現(xiàn)第一個(gè)發(fā)光管以1s亮滅閃爍,用TH0計(jì)數(shù)

9、器對(duì)應(yīng)的8位定時(shí)器實(shí)現(xiàn)第二個(gè)發(fā)光管以0.5s亮滅閃爍。(part3.1.3.c P206)- 54 -例10.5.1利用計(jì)數(shù)器0工作方式1,在實(shí)驗(yàn)板上實(shí)現(xiàn):用一根導(dǎo)線一端連接GND引腳,另一端去接觸T0(P3.4)引腳,每接觸一下,計(jì)數(shù)器計(jì)一次數(shù),將所計(jì)的數(shù)值實(shí)時(shí)顯示在數(shù)碼管的前兩位,計(jì)滿(mǎn)100時(shí)清0,再?gòu)念^計(jì)起。(part3.1.4.c P214)- 55 -例11.1.1設(shè)置單片機(jī)串行口的工作模式0,間隔循環(huán)發(fā)送十六進(jìn)制數(shù)0xAA,然后用雙路示波器觀察P3.0和P3.1口波形。(- 58 -例11.3.1用交叉串口線連接兩塊實(shí)驗(yàn)板,或直接用短線交叉線連接連個(gè)單片機(jī)的P3.0和P3.1口(共

10、地)。在一塊板上編寫(xiě)矩陣鍵盤(pán)掃描程序,當(dāng)掃描到有鍵按下時(shí),將鍵值通過(guò)串口發(fā)送出去,另一塊板上單片機(jī)收到串口發(fā)送來(lái)的鍵值后,將對(duì)應(yīng)鍵值以0F方式顯示在數(shù)碼管上。- 60 -例11.4.1程序分為主機(jī)程序和從機(jī)程序,約定一次傳送的數(shù)據(jù)為16B,以02H地址的從機(jī)為例。(圖11.4.2為多機(jī)通信主機(jī)程序流程圖)- 65 -圖11.4.3為多機(jī)通信從機(jī)程序流程圖。- 68 -從機(jī)程序代碼:(part3.2.6.c P234)- 68 -例12.8.1指針使用例程:(point.c P264)- 71 -例13.1.1編寫(xiě)程序?qū)崿F(xiàn):開(kāi)啟兩個(gè)外部中斷,設(shè)置低電平觸發(fā)中斷,用定時(shí)器計(jì)數(shù)并且顯示在數(shù)碼管的前兩

11、位,當(dāng)計(jì)數(shù)到5時(shí),使單片機(jī)進(jìn)入空閑(休眠)模式,同時(shí)關(guān)閉定時(shí)器,當(dāng)單片機(jī)響應(yīng)外部中斷后,從空閑(休眠)模式返回,同時(shí)開(kāi)啟定時(shí)器。(- 72 -例13.2.1實(shí)驗(yàn)板上實(shí)現(xiàn)如下描述:程序啟動(dòng)后設(shè)定看門(mén)狗溢出時(shí)間為2s,然后點(diǎn)亮第一個(gè)發(fā)光二極管,稍延時(shí)一會(huì),然后熄滅發(fā)光二極管,使程序進(jìn)入等待死循環(huán)狀態(tài),并且在死循環(huán)中大約每隔1s喂狗一次,看程序運(yùn)行是否正常。- 74 -例13.6.1.在實(shí)驗(yàn)板上實(shí)現(xiàn):操作STC單片機(jī)自帶的E2PROM,存儲(chǔ)一組按秒遞增的兩位數(shù)據(jù),并且將數(shù)據(jù)實(shí)時(shí)顯示在數(shù)碼管上,數(shù)據(jù)每變化一次就往E2PROM中寫(xiě)入一次,當(dāng)關(guān)閉實(shí)驗(yàn)板電源并再次開(kāi)啟電源時(shí),從E2PROM中讀取先前存儲(chǔ)的數(shù)

12、據(jù),接著遞增顯示。- 77 -例13.7.1STC89LE516AD/X2系列單片機(jī)的A/D轉(zhuǎn)換功能。時(shí)鐘11.0592MHz,轉(zhuǎn)換結(jié)果以16進(jìn)制形式輸出到串行口,可以用串行口調(diào)試程序,觀察輸出結(jié)果(本代碼摘自宏晶科技芯片手冊(cè),經(jīng)作者調(diào)試可正常運(yùn)行)。- 80 -例13.8.1給出一個(gè)STC12C5412AD應(yīng)用的參考程序。(part3.4.6.c P287)- 82 -程序14.3.1利用51單片機(jī)的定時(shí)器設(shè)計(jì)一個(gè)時(shí)鐘。- 89 -程序15.5.1使用DS12C887時(shí)鐘芯片設(shè)計(jì)高精度時(shí)鐘。- 97 -程序16.3.1使用TX-1C實(shí)驗(yàn)板上的DS18B20溫度傳感器設(shè)計(jì)溫控系統(tǒng)C語(yǔ)言源代碼(

13、part4.3 P349)- 108 -程序17.3.1太陽(yáng)能充/放電控制器C語(yǔ)言源代碼- 114 -ISD400x系列語(yǔ)音芯片C語(yǔ)言參考程序:- 134 -例21.1.1使用TX-1C實(shí)驗(yàn)板上兩個(gè)獨(dú)立按鍵調(diào)節(jié)直流電機(jī)的轉(zhuǎn)速,同時(shí)在實(shí)驗(yàn)板的數(shù)碼管上象征性的顯示相應(yīng)的轉(zhuǎn)速值。通過(guò)控制單片機(jī)輸出不同占空比的PWM信號(hào)來(lái)控制直流電機(jī)的轉(zhuǎn)速(感性認(rèn)識(shí))。(part5.3 P434)- 138 -例21.2.1步進(jìn)電機(jī)應(yīng)用C語(yǔ)言程序設(shè)計(jì)(part3.2 P444)- 142 -例21.3.1舵機(jī)應(yīng)用C語(yǔ)言程序設(shè)計(jì)實(shí)例:開(kāi)機(jī)時(shí)舵機(jī)角度自動(dòng)轉(zhuǎn)為0度,通過(guò)實(shí)驗(yàn)板上的獨(dú)立按鍵調(diào)節(jié)舵機(jī)的角度轉(zhuǎn)動(dòng),并且在實(shí)驗(yàn)板數(shù)碼

14、管上顯示相應(yīng)的角度。本例僅演示5個(gè)角度的控制,若想實(shí)現(xiàn)任意角度控制請(qǐng)大家自行編程實(shí)驗(yàn)。程序代碼如下:(part5.3 P453)- 145 -/調(diào)節(jié)舵機(jī)使之轉(zhuǎn)動(dòng)5個(gè)角度 0 45 90 135 180 PWM信號(hào)周期為20ms,- 145 -/控制高電平的持續(xù)時(shí)間即可控制舵機(jī)停止制動(dòng)的角度,0.5ms-0度 1-45 1.5-90 2-135 2.5-180- 145 -/程序流程是:開(kāi)機(jī)時(shí)舵機(jī)角度自動(dòng)轉(zhuǎn)為0度,按下 P3.7則轉(zhuǎn)到45度,以后就根據(jù)兩個(gè)按鍵的按下而轉(zhuǎn)動(dòng)- 145 -例2.2.1 編寫(xiě)程序,點(diǎn)亮第一個(gè)發(fā)光二極管(part2_1.c P27 )#include /52系列單片機(jī)頭

15、文件sbit led1=P10; /聲明單片機(jī)P1口的第一位void main() /主函數(shù)led1=0; /*點(diǎn)亮第一個(gè)發(fā)光二極管*/例2.2.2 編寫(xiě)程序,點(diǎn)亮P1口的若干二極管(part2_2.c P39 )#include /52系列單片機(jī)頭文件void main() /主函數(shù)P1=0xaa; /while(1); 例2.5.1利用for語(yǔ)句延時(shí)特性,編寫(xiě)第一個(gè)發(fā)光二極管以間隔1S亮滅閃動(dòng)的程序(part2_3.c P42)#include /52系列單片機(jī)頭文件#define uint unsigned int /宏定義sbit led1=P10; /聲明單片機(jī)P1口的第一位uint

16、 i,j;void main() /主函數(shù)while(1) /大循環(huán)led1=0;/*點(diǎn)亮第一個(gè)發(fā)光二極管*/for(i=1;i0;i-)/延時(shí)for(j=110;j0;j-);led1=1;/*關(guān)閉第一個(gè)發(fā)光二極管*/for(i=1000;i0;i-)/延時(shí)for(j=110;j0;j-);例2.6.1編寫(xiě)程序使第一個(gè)發(fā)光二極管以間隔500ms亮滅閃動(dòng)。(part2_4.c P48)#include /52系列單片機(jī)頭文件#define uint unsigned int /宏定義sbit led1=P10; /聲明單片機(jī)P1口的第一位void delay1s();/聲明子函數(shù)void ma

17、in() /主函數(shù)while(1) /大循環(huán)led1=0;/*點(diǎn)亮第一個(gè)發(fā)光二極管*/delay1s();/調(diào)用延時(shí)子函數(shù)led1=1;/*關(guān)閉第一個(gè)發(fā)光二極管*/delay1s();/調(diào)用延時(shí)子函數(shù)void delay1s()/子函數(shù)體uint i,j;for(i=500;i0;i-)for(j=110;j0;j-);例2.7.1編寫(xiě)程序使第一個(gè)二極管以亮200ms、滅800ms的方式閃動(dòng)。(part2_5.c P49)#include /52系列單片機(jī)頭文件#define uint unsigned int /宏定義sbit led1=P10; /聲明單片機(jī)P1口的第一位void dela

18、yms(uint);/聲明子函數(shù)void main() /主函數(shù)while(1) /大循環(huán)led1=0;/*點(diǎn)亮第一個(gè)發(fā)光二極管*/delayms(200);/延時(shí)200毫秒led1=1;/*關(guān)閉第一個(gè)發(fā)光二極管*/delayms(800);/延時(shí)800毫秒void delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms即延時(shí)約xms毫秒for(j=110;j0;j-);例2.8.3利用C51自帶庫(kù)_crol_(),以間隔500ms,實(shí)現(xiàn)流水燈程序(part2_6.c P53)#include /52系列單片機(jī)頭文件#include #define

19、uint unsigned int /宏定義#define uchar unsigned charvoid delayms(uint);/聲明子函數(shù)uchar aa;void main() /主函數(shù)aa=0xfe;/賦初值11111110 while(1) /大循環(huán)P1=aa;delayms(500); /延時(shí)500毫秒aa=_crol_(aa,1); /將aa循環(huán)左移1位后再賦給aavoid delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms即延時(shí)約xms毫秒for(j=110;j0;j-);例3.2.1編寫(xiě)程序使第一個(gè)數(shù)碼管顯示8(part2

20、.1_.1c P59)#include /52系列單片機(jī)頭文件sbit dula=P26; /申明U1鎖存器的鎖存端sbit wela=P27; /申明U2鎖存器的鎖存端void main()wela=1; /打開(kāi)U2鎖存器P0=0xFE; /送入位選信號(hào)wela=0; /關(guān)閉U2鎖存器dula=1; /打開(kāi)U1鎖存器P0=0x7F; /送入段選信號(hào)dula=0; /關(guān)閉U2鎖存器while(1); /程序停止到這里例3.2.2讓實(shí)驗(yàn)板上6個(gè)數(shù)碼管同時(shí)點(diǎn)亮,依次顯示0到F,時(shí)間間隔為0.5ms,循環(huán)下去。(part2.1_2.c P61)#include /52系列單片機(jī)頭文件#define

21、uchar unsigned char#define uint unsigned intsbit dula=P26; /申明U1鎖存器的鎖存端sbit wela=P27; /申明U2鎖存器的鎖存端uchar num;unchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint);void main()wela=1; /打開(kāi)U2鎖存端P0=0xco; /送入位選信號(hào)wela=0; /關(guān)閉U2鎖存端while(1)for(num=

22、0;num0;i-) /i=xms即延時(shí)約xms毫秒for(j=110;j0;j-);例3.3.1第一個(gè)數(shù)碼管顯示1,時(shí)間為0.5s,然后關(guān)閉它,立即讓第二個(gè)數(shù)碼管顯示2,時(shí)間為0.5s,在關(guān)閉它一直到最后一個(gè)數(shù)碼管顯示6,時(shí)間同樣為0.5s,關(guān)閉它之后再回來(lái)顯示第一個(gè)數(shù)碼管,一直循環(huán)下去。(part2.1_3.c P62)#include /52系列單片機(jī)頭文件#define uchar unsigned char#define uint unsigned intsbit dula=P26; /申明U1鎖存器的鎖存端sbit wela=P27; /申明U2鎖存器的鎖存端uchar num;u

23、nchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint);void main()while(1) dula=1; P0=table1; /送段選數(shù)據(jù) dula=0; P0=0xff; /送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開(kāi)位選鎖存時(shí) wela=1; /原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器造成混亂 P0=0xfe; /送位選數(shù)據(jù) wela=0; delayms(500); /延時(shí)dula=1; P0=table2; /送段選數(shù)據(jù) dul

24、a=0; P0=0xff; /送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開(kāi)位選鎖存時(shí) wela=1; /原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器造成混亂 P0=0xfd; /送位選數(shù)據(jù) wela=0; delayms(500); /延時(shí)dula=1; P0=table3; /送段選數(shù)據(jù) dula=0; P0=0xff; /送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開(kāi)位選鎖存時(shí) wela=1; /原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器造成混亂 P0=0xfb; /送位選數(shù)據(jù) wela=0; delayms(500); /延時(shí)dula=1; P0=table4; /送段選數(shù)據(jù) dula=0; P0=0xff; /送位選數(shù)據(jù)前關(guān)閉所有顯示,防止

25、打開(kāi)位選鎖存時(shí) wela=1; /原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器造成混亂 P0=0xf7; /送位選數(shù)據(jù) wela=0; delayms(500); /延時(shí)dula=1; P0=table5; /送段選數(shù)據(jù) dula=0; P0=0xff; /送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開(kāi)位選鎖存時(shí) wela=1; /原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器造成混亂 P0=0xef; /送位選數(shù)據(jù) wela=0; delayms(500); /延時(shí)dula=1; P0=table6; /送段選數(shù)據(jù) dula=0; P0=0xff; /送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開(kāi)位選鎖存時(shí) wela=1; /原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器

26、造成混亂 P0=0xdf; /送位選數(shù)據(jù) wela=0; delayms(500); /延時(shí)void delayms(uint xms) uinti,j; for(i=xms;i0;i-) /i=xms即延時(shí)約xms毫秒 for(j=110;j0;j-);例3.5.1利用定時(shí)器0工作方式1,在實(shí)驗(yàn)板上實(shí)現(xiàn)第一個(gè)發(fā)光管以1s亮滅閃爍。(part2.1.4.c P74)#include /52系列單片機(jī)頭文件#define uchar unsigned char#define uint unsigned intsbit led1=P10;uchar num;void main()TMOD=0x01

27、; /設(shè)置定時(shí)器0為工作方式1(M1M0為01)TH0=(65536-45872)/256; /裝初值11.0592M晶振定時(shí)50ms數(shù)為45872TL0=(65536-45872)%256; EA=1; /開(kāi)總中斷ET0=1; /開(kāi)定時(shí)器0中斷TR0=1; / 啟動(dòng)定時(shí)器0while(1); /程序停止在這里等待中斷中斷發(fā)生void T0_time() interrupt 1TH0=(65536-45872)/256; /重裝初值TL0=(65536-45872)%256;num+; /num每加1次判斷一次是否到20次if(num=20) /如果到了20次,說(shuō)明1秒時(shí)間到 num=0; /

28、然后把num清0重新再計(jì)20次 led1=led1; /讓發(fā)光管狀態(tài)取反3.5.2用定時(shí)器0的方式1實(shí)現(xiàn)第一個(gè)發(fā)光二極管以200ms間隔閃爍,用定時(shí)器1的方式1實(shí)現(xiàn)數(shù)碼管前兩位59s循環(huán)計(jì)時(shí)。(part2.1_5.c P75)#include /52系列單片機(jī)頭文件#define uchar unsigned char#define uint unsigned intsbit dula=P26; /申明U1鎖存器的鎖存端sbit wela=P27; /申明U2鎖存器的鎖存端sbit led1=P10;unchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d

29、,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint);void display(uchar,uchar);uchar num,num1,num2,shi,ge;void main()TMOD=0x11; /設(shè)置定時(shí)器0為工作方式1(M1M0為11)TH0=(65536-45872)/256; /裝初值11.0592M晶振定時(shí)50ms數(shù)為45872TL0=(65536-45872)%256; TH1=(65536-45872)/256; /裝初值11.0592M晶振定時(shí)50ms數(shù)為45872TL1=(65536

30、-45872)%256; EA=1; /開(kāi)總中斷ET0=1; /開(kāi)定時(shí)器0中斷ET1=1; /開(kāi)定時(shí)器1中斷TR0=1; / 啟動(dòng)定時(shí)器0TR1=1; / 啟動(dòng)定時(shí)器1while(1); /程序停止在這里等待中斷中斷發(fā)生 display(shi,ge);void display(uchar shi,uchar ge) /顯示子函數(shù) dula=1; P0=tableshi; /送段選數(shù)據(jù) dula=0; P0=0xff; /送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開(kāi)位選鎖存時(shí) wela=1; /原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器造成混亂 P0=0xfe; /送位選數(shù)據(jù) wela=0; delayms(5); /

31、延時(shí)dula=1; P0=tablege;/送段選數(shù)據(jù) dula=0; P0=0xff; /送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開(kāi)位選鎖存時(shí) wela=1; /原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器造成混亂 P0=0xfd; /送位選數(shù)據(jù) wela=0; delayms(5); /延時(shí)void delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms即延時(shí)約xms毫秒 for(j=110;j0;j-);void T0_time() interrupt 1 TH0=(65536-45872)/256; /重裝初值TL0=(65536-45872)%256;num+;if

32、(num1=4) /如果到了4次,說(shuō)明200ms時(shí)間到 num1=0; /然后把num1清0重新再計(jì)4次 led1=led1; /讓發(fā)光管狀態(tài)取反void T1_time() interrupt 3 TH1=(65536-45872)/256; /重裝初值TL1=(65536-45872)%256;num2+;if(num2=20) /如果到了20次,說(shuō)明1秒刷新時(shí)間到 num2=0; /然后把num2清0重新再計(jì)4次 num+;if(num=60) /這個(gè)數(shù)用來(lái)送數(shù)碼管顯示,到60后歸0num=0;shi=num/10; /把一個(gè)2位數(shù)分離后分別送數(shù)碼管顯示ge=num%10; /十位和個(gè)位

33、例4.1.1用數(shù)碼管前兩位顯示一個(gè)十進(jìn)制數(shù),變化范圍為0059,開(kāi)始時(shí)顯示00,每按下S1鍵一次,數(shù)值加1;每按下S2鍵一次,數(shù)值減1;每按下S3鍵一次,數(shù)值歸零;按下S4鍵一次,利用定時(shí)器功能使數(shù)值開(kāi)始自動(dòng)每秒加1,再次按下S4鍵,數(shù)值停止加1,保持顯示原數(shù)。(part2.2_1.c P82)#include /52系列單片機(jī)頭文件#define uchar unsigned char#define uint unsigned int sbit key1=P34;sbit key2=P35;sbit key3=P36;sbit key4=P37;sbit dula=P26;/申明U1鎖存器的

34、鎖存端sbit wela=P27;/申明U2鎖存器的鎖存端uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint);uchar numt0,num;void display(uchar numdis) /顯示子函數(shù)uchar shi,ge; /分離兩個(gè)分別要顯示的數(shù)shi=numdis/10;ge=numdis%10; dula=1;P0=tableshi; /送十位段選數(shù)據(jù)dula=0;P0=0xff;/送位選數(shù)據(jù)前關(guān)閉

35、所有顯示,防止打開(kāi)位選鎖存時(shí)wela=1;/原來(lái)段選數(shù)據(jù)通過(guò)位選鎖存器造成混亂P0=0xfe;/送位選數(shù)據(jù)wela=0;delayms(5);/延時(shí)dula=1;P0=tablege; /送個(gè)位段選數(shù)據(jù)dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(5);void delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms即延時(shí)約xms毫秒for(j=110;j0;j-);void init() /初始化函數(shù)TMOD=0x01;/設(shè)置定時(shí)器0為工作方式1(0000 0001)TH0=(65536-45872)/2

36、56;/裝初值50ms一次中斷TL0=(65536-45872)%256;EA=1; /開(kāi)總中斷ET0=1; /開(kāi)定時(shí)器0中斷void keyscan()if(key1=0)delayms(10);if(key1=0)num+;if(num=60)/當(dāng)?shù)?0時(shí)重新歸0num=0;while(!key1);/等待按鍵釋放if(key2=0)delayms(10);if(key2=0)if(num=0)/當(dāng)?shù)?時(shí)重新歸60num=60;num-;while(!key2);if(key3=0)delayms(10);if(key3=0)num=0; /清0while(!key3);if(key4=0

37、)delayms(10);if(key4=0)while(!key4);TR0=TR0;/啟動(dòng)或停止定時(shí)器0void main()init();/初始化函數(shù)while(1) keyscan();display(num);void T0_time() interrupt 1TH0=(65536-45872)/256;/重裝初值TL0=(65536-45872)%256;numt0+;if(numt0=20)/如果到了20次,說(shuō)明1秒時(shí)間到numt0=0;/然后把num清0重新再計(jì)20次num+;if(num=60)num=0;例4.2.1實(shí)驗(yàn)班上電時(shí),數(shù)碼管不顯示,順序按下矩陣鍵盤(pán)后,數(shù)碼管上依

38、次顯示0F,六個(gè)數(shù)碼管同時(shí)靜態(tài)顯示即可。(part2.2_2.c P87)#include /52系列單片機(jī)頭文件#define uchar unsigned char#define uint unsigned int sbit dula=P26;/申明U1鎖存器的鎖存端sbit wela=P27;/申明U2鎖存器的鎖存端uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint xms)uint i,j;for(i=xms;

39、i0;i-) /i=xms即延時(shí)約xms毫秒for(j=110;j0;j-);void display(uchar num)P0=tablenum; /顯示函數(shù)只送段選數(shù)據(jù)dula=1;dula=0;void matrixkeyscan()uchar temp,key; P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xee: key=0; break; case 0xde: key=

40、1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; display(key); P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd

41、: key=6; break; case 0x7d: key=7; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; display(key); P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; ca

42、se 0x7b: key=11; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; display(key); P3=0xf7; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delayms(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15

43、; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; display(key); void main()P0=0; /關(guān)閉所有數(shù)碼管段選dula=1;dula=0;P0=0xc0;/位選中所有數(shù)碼管wela=1;wela=0; while(1) matrixkeyscan();/不停調(diào)用鍵盤(pán)掃描程序 例5.3.1用單片機(jī)控制ADC0804進(jìn)行數(shù)模轉(zhuǎn)換,當(dāng)擰動(dòng)實(shí)驗(yàn)板上A/D旁邊的電位時(shí),在數(shù)碼管的前三位以十進(jìn)制方式顯示出A/D轉(zhuǎn)換后的數(shù)字量(8位A/D轉(zhuǎn)換后數(shù)值在0255變化)。(part2.3_1.c P107)#include /52系列單片機(jī)頭文件#include #define uchar unsigned char#define uint unsigned int sbit dula=P26;/申明U1鎖存器的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論