51單片機c語言經(jīng)典事例程_第1頁
51單片機c語言經(jīng)典事例程_第2頁
51單片機c語言經(jīng)典事例程_第3頁
51單片機c語言經(jīng)典事例程_第4頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

51單片機C語言經(jīng)典事例教程51單片機C語言經(jīng)典事例教程目錄目 -1?例1編寫程序,點亮第一個發(fā)光二極管 -5-例2編寫程序,點亮P1口的若干二極管 -5一例3利用for語句延時特性,編寫第一個發(fā)光二極管以間隔1S亮滅閃動的程序.....-5一例4編寫程序使第一個發(fā)光二極管以間隔500ms亮滅閃動 -6-例5編寫程序使第一個二極管以亮200ms、滅800ms的方式閃動。 -6一例6利用C51自帶庫_crol_(),以間隔500ms,實現(xiàn)流水燈程序 -7一例3.2.1篇寫重序使第一個數(shù)碼管顯示8(part2.1_.lcP59) - 7一例3.2.2讓實驗板上6個數(shù)碼管同時點亮,依次顯示〇到F,時間間隔為0.5ms,循環(huán)下去。(part2.1_2.cP61) -8?例3.3.1第一個數(shù)碼管顯示1,時間為0.5s,然后關(guān)閉它,立即讓第二個數(shù)碼管顯示2,時間為0.5s,在關(guān)閉它,,,,一直到最后ー個數(shù)碼管顯示6,時間同樣為0.5s,關(guān)閉它之后再回來顯示第一個數(shù)碼管,一直循環(huán)下去。(part2.1_3.cP62) - 9一例3.5.1利用定時器0工作方式1,在實驗板上實現(xiàn)第一個發(fā)光管以!s亮滅閃爍。(part2.1.4.cP74) -11?例3.5.2用定時器〇的方式1實現(xiàn)第一個發(fā)光二極管以200ms間隔閃爍,用定時器1的方式1實現(xiàn)數(shù)碼管前兩位59s循環(huán)計時。(part2.1_5.cP75) - 11-例4.1.1用數(shù)碼管前兩位顯示ー個十進制數(shù),變化范圍為〇〇?59,開始時顯示00,每按下S2鍵?次,數(shù)值加1;每按下S3鍵一次,數(shù)值減1;每按下S4鍵一次,數(shù)值歸零;按下S5鍵一次,利為定時器功能使數(shù)值開始自動每秒加1,再次按下S5鍵,數(shù)值停止加1,保持顯示 原 數(shù)。 ( part2.2_l.cP82) -14?例4.2.1實驗班上電時,數(shù)碼管不顯示,順序按下矩陣鍵盤后,數(shù)碼管上依次顯示〇?F,六個數(shù)碼管同時靜態(tài)顯示即可。(part2.2_2.cP87) - 17?例5.3.1用單片機控制ADC0804進行數(shù)模轉(zhuǎn)換,當擰動實驗板上A/D旁邊的電位時,在數(shù)碼管的前三位以十進制方式顯示出A/D轉(zhuǎn)換后的數(shù)字量(8位A/D轉(zhuǎn)換后數(shù)值在0-255變化)。(part2.3_l.cP107) -21--1-51單片機C語言經(jīng)典事例教程例5.5.1用單片機控制DAC0832芯片輸出電流,讓發(fā)光二級管D12由滅均勻變到最亮,再由最亮均勻熄滅。在最亮和最暗時使用蜂鳴器分別警報一聲,完成整個周期時間控制在5S左右,循環(huán)變化。(part2.3_2.cP121) -23一例6.5.1在上位機上用串口調(diào)試助手發(fā)送ー個字符X,單片機收到字符后返回給上位機"IgetX”,串口波特率設(shè)為9600bps。(part2.4_l,cP137) -25一例6.6.1單片機上電后等待女上位機串口發(fā)來的命令,同時在數(shù)碼管的前三位以十進制方式顯示A/D采集的數(shù)值,在未收到上位機發(fā)送來的啟動A/D轉(zhuǎn)換命令之前數(shù)碼管始終顯示〇〇〇〇當收到上位機以十六進制發(fā)送來的01后,向上位機發(fā)送字符串“Turnonad!”同時間隔1s讀取ー?次A/D的值,然后把A/D采集回來的8位二進制轉(zhuǎn)換成十進制表示的實際電壓浮點數(shù),并且從串口發(fā)送給上位機,形式如“Thevoltageis3.398438V”,發(fā)送周期也是一秒一次,同時在數(shù)碼管上也要每秒刷新現(xiàn)實的數(shù)值。當收到上位機以十六進制發(fā)送過來的02后,向上位機發(fā)送字符串“Turnoffad!”,然后停止發(fā)送電壓值,數(shù)碼管上顯示上次結(jié)束時保持的值。當收到上位機發(fā)來的其他任何數(shù)時,向上位機發(fā)送字符串“Error!”。 -27一例7.2.1實現(xiàn)1602液晶的第一行顯示“ILOVEMCU!”,在 第 二 行 顯 示W(wǎng)WW.TXMCU.COM〇 -31?例7,2.2實現(xiàn)1602第一行從左側(cè)移入“Helloeveryone!”同時第二行從右側(cè)移入“Welcometohere!”,移入速度自定,然后停留在屏幕上。(part2.5_2.cP154) -33?例7.3.1實現(xiàn)12232液晶的第一行顯示“ILOVEMCU!”,第二行顯示“我愛單片機”。(part2.5_3.cP160) -34?例7.3.2實現(xiàn)12232液晶第一行從右側(cè)移入“Helloeveryone!^^,同時第二行從右側(cè)移入“歡迎大家來學習!”移入速度自定,最后停留在屏幕上。(part2.5_4.cP163) -37?例7.4.1實現(xiàn)在12864液晶上第一行顯示“0123456789”,并且讓每一位數(shù)字隨機變化,第二行顯示“/r/”,第三行顯示“天祥電子”,第四行對應(yīng)第三行顯示出下劃線。(part2,5_5.cP173) -40?知識點: 生成隨機數(shù)( part2,5_512232suiji.cP176) - 44-例8.3.1利用定.器產(chǎn)生一個〇?99秒變化的秒表,并且顯示在數(shù)碼管上,每過一秒將這個變化的數(shù)寫入板上AT24C02P188) -48--2-51單片機C語言經(jīng)典事例教程例10.1.1利用定時器〇工作方式〇,在實驗板上實現(xiàn)第一個發(fā)光管以1s亮滅閃爍。 ( part3.1.1.cP203) -53-例10.2.1利用定時器〇工作方式2,在實驗板上實現(xiàn)第一個發(fā)光管以1s亮滅閃爍。( part3.1.2.cP204) -54-例10.3.1利用定時器工作方式3,在實驗板上實現(xiàn):用TL0計數(shù)器對應(yīng)的8位定時器實現(xiàn)第一個發(fā)光管以!s亮滅閃爍,用TH0計數(shù)器對應(yīng)的8位定時器實現(xiàn)第二個發(fā)光管以0.5s亮滅閃爍。(part3.1.3.cP206) -54?例10.5.1利用計數(shù)器〇工作方式1,在實驗板上實現(xiàn):用?根導線一端連接GND引腳,另一端去接觸T0(P3.4)引腳,每接觸一下,計數(shù)器計ー次數(shù),將所計的數(shù)值實時顯示在數(shù)碼管的前兩位,計滿100時清0,再從頭計起。(part3.1.4.cP214) - 55一例11.1.1設(shè)置單片機串行口的工作模式〇,間隔循環(huán)發(fā)送十六進制數(shù)OxAA,然后用雙路示波器觀察P3.0和P3.1口波形。( -58一例11.3.1用交叉串口線連接兩塊實驗板,或直接用短線交叉線連接連個單片機的P3.0和P3.1ロ(共地)。在ー塊板上編寫矩陣鍵盤掃描程序,當掃描到有鍵按下時,將鍵值通過串口發(fā)送出去,另ー塊板上單片機收到串口發(fā)送來的鍵值后,將對應(yīng)鍵值以0-F方式顯示在數(shù)碼管上。 .……-60-例11.4.I程序分為主機程序和從機程序,約定一次傳送的數(shù)據(jù)為16B,以02H地址的從機為例。(圖!1.4.2為多機通信主機程序流程圖) -65-圖11.4.3為多機通信從機程序流程圖。 -68-從機程序代碼:(part3.2.6.cP234) -68"例12.8.1指針使用例程: (point.cP264) - 71?例13.1.1編寫程序?qū)崿F(xiàn):開啟兩個外部中斷,設(shè)置低電平觸發(fā)中斷,用定時器計數(shù)并且顯示在數(shù)碼管的前兩位,當計數(shù)到5時,使單片機進入空閑(休眠)模式,同時關(guān)閉定時器,當單片機響應(yīng)外部中斷后,從空閑(休眠)模式返回,同時開啟定時器。( -72-例13.2.1實驗板上實現(xiàn)如下描述:程序啟動后設(shè)定看門狗溢出時間為2s,然后點亮第一個發(fā)光二極管,稍延時一會,然后熄滅發(fā)光二極管,使程序進入等待死循環(huán)狀態(tài),并且在死循環(huán)中大約每隔!s喂狗一次,看程序運行是否正常。 -74一例13.6.1.在實驗板上實現(xiàn):操作STC單片機自帶的E2PROM,存儲ー組按秒遞增的兩位數(shù)據(jù),并且將數(shù)據(jù)實時顯示在數(shù)碼管上,數(shù)據(jù)每變化一次就往E2PR0M中寫入一次,當關(guān)閉實驗ー3-51單片機C語言經(jīng)典事例教程板電源并再次開啟電源時,從E2PROM中讀取先前存儲的數(shù)據(jù),接著遞增顯示。......-77一例13.7.1STC89LE516AD/X2系列單片機的A/D轉(zhuǎn)換功能。時鐘11.0592MHz,轉(zhuǎn)換結(jié)果以16進制形式輸出到串行口,可以用串行口調(diào)試程序,觀察輸出結(jié)果(本代碼摘自宏晶科技芯片手冊,經(jīng)作者調(diào)試可正常運行)。 - 80一例13.8.1給出一個STC12c5412AD應(yīng)用的參考程序。(part3.4.6.cP287) -82?程序14.3.1利用51單片機的定時器設(shè)計ー個時鐘。 -89-程序15.5.1使用DS12C887時鐘芯片設(shè)計高精度時鐘。 -97-程序16.3.1使用TX-1C實驗板上的DS18B20溫度傳感器設(shè)計溫控系統(tǒng)C語言源代碼(part4.3P349) -108-程序17.3.1太陽能充ノ放電控制器C語言源代碼 -114-ISD400X系列語音芯片C語言參考程序: -134-例21.1.1使用TX-1C實驗板上兩個獨立按鍵調(diào)節(jié)直流電機的轉(zhuǎn)速,同時在實驗板的數(shù)碼管上象征性的顯示相應(yīng)的轉(zhuǎn)速值。通過控制單片機輸出不同占空比的PWM信號來控制直流電機的轉(zhuǎn)速(感性認識)。(part5.3P434) -138-例21.2.1步進電機應(yīng)用C語言程序設(shè)計(part3.2P444) -142一例21.3.1舵機應(yīng)用C語言程序設(shè)計實例:開機時舵機角度自動轉(zhuǎn)為〇度,通過實驗板上的獨立按鍵調(diào)節(jié)舵機的角度轉(zhuǎn)動,并且在實驗板數(shù)碼管上顯示相應(yīng)的角度。本例僅演示5個角度的控制,若想實現(xiàn)任意角度控制請大家自行編程實驗。程序代碼如下:(part5.3P453).-145-〃調(diào)節(jié)舵機使之轉(zhuǎn)動5個角度04590135180PWM信號周期為20ms, -145ー〃控制高電平的持續(xù)時間即可控制舵機停止制動的角度, 0.5ms-0度 1-45 1.5-90 2-1352.5-180 -145 -〃程序流程是:開機時舵機角度自動轉(zhuǎn)為〇度,按下P3.7則轉(zhuǎn)到45度,以后就根據(jù)兩個按鍵的按下而轉(zhuǎn)動 -145--4-51單片機C語言經(jīng)典事例教程例1編寫程序,點亮第一個發(fā)光二極管#include<reg52.h>//52系列單片機頭文件sbitledl=Pl;〃聲明單片機Pl口的第一位voidmain() 〃主函數(shù){led1=0; /?點亮第一個發(fā)光二極管*/}例2編寫程序,點亮P1口的若干二極管#include<reg52.h>//52系列單片機頭文件voidmain() 〃主函數(shù){Pl=Oxaa;//while(l);例3利用for語句延時特性,編寫第一個發(fā)光二極管以間隔1S亮滅閃動的程序#include<reg52.h> //52系列單片機頭文件#defineuintunsignedint〃宏定義sbitledl=Pl;〃聲明單片機Pl□的第一位uinti,j;voidmain()〃主函數(shù){while(l)〃大循環(huán)led1=0; /?點亮第一個發(fā)光二極管*/for(i=l;i>0;i—)〃延時for(j=110;j>0;j-);ledl=l; /?關(guān)閉第一個發(fā)光二極管*/for(i=1000;i>0;i-)〃延時for(j=110;j>0;j-);~5-51單片機C語言經(jīng)典事例教程例4編寫程序使第一個發(fā)光二極管以間隔500ms亮滅閃動#include<reg52.h>#defineuintunsignedintsbitledl=Pl;voiddelayls();voidmain(){while(l){led1=0;delayls();ledl=l;delayls();}}voiddelayls()!uinti,j;for(i=500;i>0;i—)for(j=110;j>0;j-);)〃52系列單片機頭文件〃宏定義〃聲明單片機P1口的第一位〃聲明子函數(shù)〃主函數(shù) 〃大循環(huán)/?點亮第一個發(fā)光二極管?/〃調(diào)用延時子函數(shù)/?關(guān)閉第一個發(fā)光二極管?/〃調(diào)用延時子函數(shù)〃子函數(shù)體例5編寫程序使第一個二極管以亮200ms、滅800ms的方式閃動。#include<reg52.h>#defineuintunsignedintsbitled1=P1;voiddelayms(uint);voidmain()while(l){led1=0;delayms(200);ledl=l;delayms(800);voiddelayms(uintxms)〃52系列單片機頭文件〃宏定義〃聲明單片機P1口的第一位〃聲明子函數(shù)〃主函數(shù) 〃大循環(huán) /?點亮第一個發(fā)光二極管*/〃延時200毫秒/?關(guān)閉第一個發(fā)光二極管*/〃延時800毫秒 ー6-5I單片機C語言經(jīng)典事例教程}uinti,j;for(i=xms;i>0;i—) //i=xms即延時約xms毫秒for(j=110;j>0;j-);例6利用C5I自帶庫_crol_(),以間隔500ms,實現(xiàn)流水燈程序#include<reg52.h>//52系列單片機頭文件#include<intrins.h>#defineuintunsignedint 〃宏定義#defineucharunsignedcharvoiddelayms(uint); 〃聲明子函數(shù)ucharaa;voidmain() 〃主函數(shù){aa=0xfe; 〃賦初值11111110while(l)〃大循環(huán){Pl=aa;delayms(500); 〃延時500毫秒aa=_crol_(aa,l);〃將aa循環(huán)左移1位后再賦給aa))voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i—) //i=xms即延時約xms毫秒for(j=110;j>0;j-);例321編寫程序使第一個數(shù)碼管顯示8(part2.l_.lcP59)#include<reg52.h> //52系列單片機頭文件sbitdula=P2-; 〃申明UI鎖存器的鎖存端sbitwela=P2?; 〃申明U2鎖存器的鎖存端voidmain(){wela=l; 〃打開U2鎖存器-7-51單片機C語言經(jīng)典事例教程P0=0xFE; 〃送入位選信號wela=0; 〃關(guān)閉U2鎖存器dula=l; 〃打開U1鎖存器P0=0x7F; 〃送入段選信號dula=0; 〃關(guān)閉U2鎖存器while(l); 〃程序停止到這里例3.2.2讓實驗板上6個數(shù)碼管同時點亮,依次顯示0到F,時間間隔為0.5ms,循環(huán)下去。(part2,1_2.cP61)#include<reg52,h> 〃52系列單片機頭文件#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-: 〃申明UI鎖存器的鎖存端sbitwela=P2?; 〃申明U2鎖存器的鎖存端ucharnum;uncharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);voidmain(){wela=1;〃打開U2鎖存端P0=0xco;〃送入位選信號wela=0;〃關(guān)閉U2鎖存端while(l){for(num=0;num<16;num++)//16個數(shù)循環(huán)顯示{dula=l;〃打開U1鎖存端P0=table[num]; 〃送入段選信號dula=O;〃關(guān)閉UI鎖存端delay(500);〃延時0.5秒)voiddelayms(uintxms)-8-51單片機C語言經(jīng)典事例教程uinti,j;for(i=xms;i>0;i—)//i=xms即延時約xms毫秒for(j=l10;j>0;j-);例331第一個數(shù)碼管顯示1,時間為0.5s,然后關(guān)閉它,立即讓第二個數(shù)碼管顯示2,時間為0.5s,在關(guān)閉它,”,一直到最后ー個數(shù)碼管顯示6,時間同樣為0.5s,關(guān)閉它之后再回來顯示第一個數(shù)碼管,一直循環(huán)下去。(part2.1_3.cP62)#include<reg52.h> //52系列單片機頭文件#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-; 〃申明UI鎖存器的鎖存端sbitwela=P2>; 〃申明U2鎖存器的鎖存端ucharnum;uncharcodetable[]={Ox3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);voidmain()(while(l){dula=l;PO=table[l];〃送段選數(shù)據(jù)dula=0;PO=Oxff: 〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時wela=l; 〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂P0=0xfe; 〃送位選數(shù)據(jù)wela=0;delayms(500);〃延時dula=l;PO=table⑵;〃送段選數(shù)據(jù)

dula=O;PO=Oxff;dula=O;PO=Oxff;-9-〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時5I單片機C語言經(jīng)典事例教程wela=l; 〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂 PO=Oxfd;//送位選數(shù)據(jù)wela=O;delayms(500);〃延時dula=l;P0=table[3];〃送段選數(shù)據(jù)dula=O;PO=Oxff; 〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時 wela=l;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂 PO=Oxfb;〃送位選數(shù)據(jù)wela=O;delayms(500);〃延時dula=l;P0=table[4];〃送段選數(shù)據(jù)dula=O;PO=Oxff; 〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時 wela=l;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂 P0=0xf7; 〃送位選數(shù)據(jù)wela=O;delayms(500);〃延時dula=l;P0=table[5];〃送段選數(shù)據(jù)dula=O;PO=Oxff; 〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時 wela=l;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂 PO=Oxef: 〃送位選數(shù)據(jù)wela=O;delayms(500);〃延時dula=l;P0=table[6];〃送段選數(shù)據(jù)dula=O;PO=Oxff; 〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時 wela=l;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂 PO=Oxdf; 〃送位選數(shù)據(jù)wela=O;delayms(500);〃延時voiddelayms(uintxms)-10-51單片機C語言經(jīng)典事例教程uinti,j;for(i=xms;i>0;i—)//i=xms即延時約xms毫秒for(j=110;j>0;j-);}例3.5.1利用定時器。工作方式!,在實驗板上實現(xiàn)第一個發(fā)光管以1s亮滅閃爍。(part2.1.4.cP74)#include<reg52,h> //52系列單片機頭文件#defineucharunsignedchar#defineuintunsignedintsbitledl=Pl;ucharnum;voidmain(){TMOD=0x01; 〃設(shè)置定時器〇為工作方式1(MIMO為01)TH0=(65536-45872)/256;〃裝初值!1.0592M晶振定時50ms數(shù)為45872TL0=(65536-45872)%256;EA=1; 〃開總中斷ETO=1: 〃開定時器〇中斷TRO=1; 〃啟動定時器〇while(l); 〃程序停止在這里等待中斷中斷發(fā)生voidTO_time()interrupt1!TH0=(65536-45872)/256; 〃重裝初值TL0=(65536-45872)%256;num++;//num每加1次判斷一次是否到20次if(num==20)〃如果到了20次,說明1秒時間到{num=0; 〃然后把num清0重新再計20次ledl=~ledl;〃讓發(fā)光管狀態(tài)取反例3.5.2用定時器0的方式1實現(xiàn)第一個發(fā)光二極管以200ms間隔閃爍,用定時器1的方式1實現(xiàn)數(shù)碼管前兩位-list單片機C語言經(jīng)典事例教程59s循環(huán)計時。(part2.1_5.cP75)

#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;sbitwela=P2e;//52系列單片機頭文件〃申明U1鎖存器的鎖存端〃申明U2鎖存器的鎖存端sbitledl=Pl;uncharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);voiddisplay(uchar,uchar);ucharnum,num1,num2,shi,ge;voidmain()(TMOD=Oxll; 〃設(shè)置定時器0為工作方式1(M1M0為11)TH0=(65536-45872)/256;〃裝初值!1.0592M晶振定時50ms數(shù)為45872TL0=(65536-45872)%256;TH1=(65536-45872)/256;〃裝初值!1.0592M晶振定時50ms數(shù)為45872TLl=(65536-45872)%256;EA=1; 〃開總中斷ET0=l; 〃開定時器〇中斷ET1=1; 〃開定時器1中斷TR0=l; 〃啟動定時器〇TR1=1; /Z啟動定時器1while(l); 〃程序停止在這里等待中斷中斷發(fā)生{display(shi,ge);voiddisplay(ucharshi,ucharge)〃顯示子函數(shù)(dula=l;PO=table[shi]; 〃送段選數(shù)據(jù)dula=0;PO=Oxff; 〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時 wela=l;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂 P0=0xfe; 〃送位選數(shù)據(jù)wela=0;delayms⑸; 〃延時51單片機C語言經(jīng)典事例教程dula=l;PO=table[ge];〃送段選數(shù)據(jù)dula=O;PO=Oxff; 〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時 wela=l;〃原來段選數(shù)據(jù)通過位選鎖存器造成混亂 PO=Oxfd; 〃送位選數(shù)據(jù)wela=O;delayms⑸; 〃延時voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i—) //i=xms即延時約xms毫秒for(j=110;j>0;j-);voidT0_time()interrupt1{TH0=(65536-45872)/256;〃重裝初值TL0=(65536-45872)%256;num++;if(numl==4) 〃如果到了4次,說明200ms時間到{num1=0; 〃然后把numl清〇重新再計4次ledl=~ledl;//讓發(fā)光管狀態(tài)取反}}voidTl_time()interrupt3{TH1=(65536-45872)/256;〃重裝初值TL1=(65536-45872)%256;num2++;if(num2==20) 〃如果到了20次,說明1秒刷新時間到{num2=0; 〃然后把num2清〇重新再計4次num++;if(num==60) 〃這個數(shù)用來送數(shù)碼管顯示,到60后歸0num=0;shi=num/10; 〃把ー個2位數(shù)分離后分別送數(shù)碼管顯示ge=num%10;〃十位和個位}51單片機C語言經(jīng)典事例教程}例4.1.1用數(shù)碼管前兩位顯示ー個十進制數(shù),變化范圍為。。?59,開始時顯示〇〇,每按下S2鍵一次,數(shù)值加1;每按下S3鍵一次,數(shù)值減1;每按下S4鍵一次,數(shù)值歸零;按下S5鍵一次,利用定時器功能使數(shù)值開始自動每秒加1,再次按下S5鍵,數(shù)值停止加1,保持顯示原數(shù)。(part2.2_l.cP82)#include<reg52.h>//52系列單片機頭文件#defineucharunsignedchar#defineuintunsignedintsbitkeyl=P3J;sbitkey2=P3|;sbitkey3二P3-;sbitkey4=P3?;sbitdula=P2-;〃申明U!鎖存器的鎖存端sbitwela=P2?;〃申明U2鎖存器的鎖存端ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);ucharnumt0,num;voiddisplay(ucharnumdis)〃顯示子函數(shù)(51單片機C語言經(jīng)典事例教程ucharshi,ge; 〃分離兩個分別要顯示的數(shù)shi=numdis/10;ge=numdis%10;dula=l;PO=table[shi]; 〃送十位段選數(shù)據(jù)dula=0;PO=Oxff;〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時wela=l;//原來段選數(shù)據(jù)通過位選鎖存器造成混亂P0=0xfe;〃送位選數(shù)據(jù)wela=0;delayms(5);〃延時dula=l;P0=table[ge];〃送個位段選數(shù)據(jù)dula=0;P0=0xff;wela=l;

PO=Oxfd;wela=O;delayms(5);uinti,j;for(i=xms;i>0;i-)uinti,j;for(i=xms;i>0;i-)//i=xms即延時約xms毫秒 for(j=l10;j>0;j—);voidinit() 〃初始化函數(shù){TMOD=0x01;/Z設(shè)置定時器〇為工作方式1(00000001)TH0=(65536-45872)/256;〃裝初值50ms一次中斷TL0=(65536-45872)%256;EA=I;〃開總中斷ET0=l;〃開定時器〇中斷)voidkeyscan(){if(keyl==O){delayms(lO);if(keyl==O){num++;51單片機C語言經(jīng)典事例教程if(num==60)〃當?shù)?0時重新歸〇num=0;while(!keyl);〃等待按鍵釋放 })if(key2=0){delayms(lO);if(key2==0)if(num==0)〃當至リ〇時重新歸60 num=60;num—;while(!key2);if(key3==0)delayms(lO);if(key3==0){num=O;〃清0while(!key3);))if(key4==0){delayms(lO);if(key4==0){while(!key4);TRO=~TRO”啟動或停止定時器〇 }voidmain(){init();〃初始化函數(shù)while(l)keyscan();display(num);}}5I單片機C語言經(jīng)典事例教程voidT0_time()interrupt1!TH0=(65536-45872)/256;〃重裝初值TL0=(65536-45872)%256;numtO++;if(numt0==20)〃如果到了20次,說明1秒時間到{numt0=0;〃然后把num清。重新再計20次num++;if(num==60)num=0;例4.2.1實驗班上電時,數(shù)碼管不顯示,順序按下矩陣鍵盤后,數(shù)碼管上依次顯示〇?F,六個數(shù)碼管同時靜態(tài)顯示即可。(part2,2_2.cP87)#include<reg52.h> //52系列單片機頭文件#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;〃申明UI鎖存器的鎖存端sbitwela=P2*;〃申明U2鎖存器的鎖存端ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i—) //i=xms即延時約xms毫秒for(j=110;j>0;j-);)voiddisplay(ucharnum)(P0:taHefnum];〃顯示函數(shù)只送段選數(shù)據(jù)dula=l;dula=0;}voidmatrixkeyscan()51單片機C語言經(jīng)典事例教程{uchartemp,key;P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0)(delayms(lO);temp=P3;temp=temp&0xf0;if(temp!=OxfO){temp=P3;switch(temp)(caseOxee:key=O;break;caseOxde:key=l;break;caseOxbe:key=2;break;case0x7e:key=3;break;}while(temp!=OxfO)(temp=P3;temp=temp&OxfD; }display(key);})P3=Oxfd;temp=P3;temp=temp&OxfO;if(temp!=OxfO){delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)5I單片機C語言經(jīng)典事例教程{temp=P3;if(temp!=OxfO)switch(temp)(caseOxed:key=4;break;caseOxdd:key=5;break;caseOxbd:key=6;break;caseOx7d:key=7;break;}

while(temp!=OxfO)temp=P3;temp=temp&OxfO; }break;display(key);}}P3=0xfb;temp=P3;temp=temp&OxfO;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO){temp=P3;switch(temp)(caseOxeb:key=8;break;caseOxdb:key=9;-19-break;5I單片機C語言經(jīng)典事例教程caseOxbb:key=10;break;case0x7b:key=ll;break;)while(temp!=OxfO){temp=P3;temp=temp&OxfO; }display(key);}}P3=Oxf7;temp=P3;temp=temp&OxfO;if(temp!=OxfD){delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(case0xe7:key=12;break;caseOxd7:key=13;break;caseOxb7:key=14;break;case0x77:key=15;break;}while(temp!=OxfO)(-20-51單片機C語言經(jīng)典事例教程temp=P3;temp=temp&OxfO;}display(key);)})voidmain()(P0=0;〃關(guān)閉所有數(shù)碼管段選dula=l;dula=0;P0=0xc0;〃位選中所有數(shù)碼管wela=l;wela=0;while(l)matrixkeyscan。;〃不停調(diào)用鍵盤掃描程序例5.3.1用單片機控制ADC0804進行數(shù)模轉(zhuǎn)換,當擰動實驗板上A/D旁邊的電位時,在數(shù)碼管的前三位以十進制方式顯示出A/D轉(zhuǎn)換后的數(shù)字量(8位A/D轉(zhuǎn)換后數(shù)值在〇?255變化)。(part2.3_l.cP107)#include<reg52.h>//52系列單片機頭文件#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;〃申明U!鎖存器的鎖存端sbitwela=P2>;〃申明U2鎖存器的鎖存端sbitadwr=P3-;〃定義AD的WR端口sbitadrd=P3>;〃定義AD的RD端口-21-51單片機C語言經(jīng)典事例教程ucharcodetable(]={Ox3f,OxO6,Ox5b,Ox4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i—)//i=xms即延時約xms毫秒 for(j=l10;j>0;j—);)voiddisplay(ucharbai,ucharshi,ucharge)〃顯小寸,函數(shù)(dula=l;PO=table[bai];〃送段選數(shù)據(jù)dula=0;PO=Oxffi〃送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時wela=l;//原來段選數(shù)據(jù)通過位選鎖存器造成混亂P0=0x7e;〃送位選數(shù)據(jù)wela=0;delayms⑸; 〃延時dula=l;PO=table[shi];

dula=O;PO=Oxff;wela=l;P0=0x7d;wela=O;delayms(5);dula=l;PO=table[ge];dula=O;PO=Oxff;wela=l;P0=0x7b;wela=O;delayms(5);)voidmain()//主程序-22-51單片機C語言經(jīng)典事例教程uchara,Al,A2,A3,adval;wela=l;P0=0x7f; 〃置CSAD為〇,選通ADCS以后不必再管ADCSwe!a=0;while(l)!adwr=1;_nop_();adwr=0;〃啟動AD轉(zhuǎn)換_nop_();Pl=Oxff;adrd=1;Pl=Oxff;adrd=1;〃讀取Pl口之前先給其寫全!〃選通ADCSadwr=l;for(a=10;a>O;a—)后要多留點時間用來轉(zhuǎn)換(//TX-1C實驗板AD工作頻率較低,所以啟動轉(zhuǎn)換〃這里把顯示部分放這里的原因也是為了延長轉(zhuǎn)換時間display(Al,A2,A3);_nop_();adrd=O; //AD讀使能_nop_();adval=Pl; 〃AD數(shù)據(jù)讀取賦給Plロadrd=1;Al=adval/100;〃分出百,十,和個位A2=adval%100/10;A3=adval%10;例5.5.1用單片機控制DAC0832芯片輸出電流,讓發(fā)光二級管D12由滅均勻變到最亮,再由最亮均勻熄滅。在最亮和最暗時使用蜂鳴器分別警報一聲,完成整個周期時間控制在5s左右,循環(huán)變化。(part2.3_2.cP121)#include<reg52.h>#defineucharunsignedchar-23-5I單片機C語言經(jīng)典事例教程#defineuintunsignedintsbitdula=P2-;〃申明U!鎖存器的鎖存端sbitwela=P2?;〃申明U2鎖存器的鎖存端sbitdawr=P3-;〃定義DA的WR端口sbitdacs=P3];〃定義DA的CS端口sbitbeep=P2L;〃定義蜂鳴器端口voiddelayms(uintxms){uintij;for(i=xms;i>0;i—) //i=xms即延時約xms毫秒for(j=l10;j>0;j—);voidmain()(ucharval,flag;dula=0;wela=0;dacs=0;dawr=0;P0=0;while(l){if(flag==0)val+=5;PO=val;〃通過P0口給DA數(shù)據(jù)ロ賦值 if(val==255)flag=l;beep=O;delayms(lOO);beep=l;)delayms(5O);)else(val-=5;PO=val;〃通過PO口給DA數(shù)據(jù)ロ賦值 if(val==O){flag=O;beep=O;-24-5I單片機C語言經(jīng)典事例教程} }delayms(lOO);beep=l;}delayms(50);例6.5.1在上位機上用串口調(diào)試助手發(fā)送ー個字符X,單片機收到字符后返回給上位機"IgetX”,串口波特率設(shè)為-25-51單片機C語言經(jīng)典事例教程9600bps〇(part2.4_l.cP137)#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintunsignedcharflag,a,i;ucharcodetable[]="Iget";//ucharcodetable[]={T,'','g','e','t',''};voidinit()TMOD=0x20;THl=0xfd;TLl=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;}voidmain(){init();while(l){if(flag==l){ES=0;for(i=0;i<6;i++){SBUF=table[i];while(!TI);TI=0;)SBUF=a;while(!TI);TI=0;ES=1;flag=0;voidser()interrupt4-26-5I單片機C語言經(jīng)典事例教程RI=0;a=SBUF;flag=l;例6.6.1單片機上電后等待從上位機串口發(fā)來的命令,同時在數(shù)碼管的前三位以十進制方式顯示A/D采集的數(shù)值,在未收到上位機發(fā)送來的啟動A/D轉(zhuǎn)換命令之前數(shù)碼管始終顯示000。當收到上位機以十六進制發(fā)送來的01后,向上位機發(fā)送字符串“Turnonad!”同時間隔1s讀取一次A/D的值,然后把A/D采集回來的8位二進制轉(zhuǎn)換成上進制表示的實際電壓浮點數(shù),并且從串口發(fā)送給上位機,形式如“Thevoltageis3.398438V”,發(fā)送周期也是一秒ー次,同時在數(shù)碼管上也要每秒刷新現(xiàn)實的數(shù)值。當收到上位機以上六進制發(fā)送過來的02后,向上位機發(fā)送字符串“Turnoffad!”,然后停止發(fā)送電壓值,數(shù)碼管上顯示上次結(jié)束時保持的值。當收到上位機發(fā)來的其他任何數(shù)時,向上位機發(fā)送字符串“Error!”。(part2,4_2.cP140)#include<reg52.h>#include<intrins.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;〃申明UI鎖存器的鎖存端sbitwela=P2?;〃申明U2鎖存器的鎖存端sbitadw匸P3-;〃定義AD的WR端口sbitadrd=P3?;〃定義AD的RD端口ucharfl

溫馨提示

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

評論

0/150

提交評論