《單片機(jī)技術(shù)》課件項(xiàng)目二 單片機(jī)手動(dòng)計(jì)數(shù)器設(shè)計(jì)_第1頁(yè)
《單片機(jī)技術(shù)》課件項(xiàng)目二 單片機(jī)手動(dòng)計(jì)數(shù)器設(shè)計(jì)_第2頁(yè)
《單片機(jī)技術(shù)》課件項(xiàng)目二 單片機(jī)手動(dòng)計(jì)數(shù)器設(shè)計(jì)_第3頁(yè)
《單片機(jī)技術(shù)》課件項(xiàng)目二 單片機(jī)手動(dòng)計(jì)數(shù)器設(shè)計(jì)_第4頁(yè)
《單片機(jī)技術(shù)》課件項(xiàng)目二 單片機(jī)手動(dòng)計(jì)數(shù)器設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩66頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

一、學(xué)習(xí)目標(biāo)1.掌握LED數(shù)碼管結(jié)構(gòu)。2.掌握數(shù)碼管字形編碼。3.掌握數(shù)碼管靜態(tài)顯示。4.掌握數(shù)碼管動(dòng)態(tài)顯示。二、學(xué)習(xí)任務(wù)本項(xiàng)目任務(wù)分解為具體3個(gè)學(xué)習(xí)任務(wù):任務(wù)1獨(dú)立按鍵識(shí)別檢測(cè)任務(wù)2一位數(shù)碼顯示任務(wù)3兩位數(shù)碼顯示任務(wù)4手動(dòng)計(jì)數(shù)器實(shí)現(xiàn)三、任務(wù)分解任務(wù)一獨(dú)立按鍵識(shí)別檢測(cè)【任務(wù)描述】

單片機(jī)系統(tǒng)運(yùn)行時(shí),通常需要應(yīng)用輸入設(shè)備實(shí)現(xiàn)人工參與控制。鍵盤(pán)是由若干個(gè)按鍵組成的,是單片機(jī)最簡(jiǎn)單也是最常用的輸入設(shè)備。操作人員通過(guò)鍵盤(pán)輸入數(shù)據(jù)或命令,實(shí)現(xiàn)簡(jiǎn)單的人機(jī)對(duì)話。本任務(wù)要求設(shè)計(jì)1個(gè)獨(dú)立按鍵,單按下改鍵時(shí),對(duì)應(yīng)的LED亮,再一次按下,LED熄滅,如此重復(fù)?!救蝿?wù)分析】

當(dāng)按鍵被按下時(shí),電平被拉成低電平,此電平作為作為單片機(jī)的輸入,單片機(jī)接收到低電平時(shí),認(rèn)為產(chǎn)生了按鍵動(dòng)作,執(zhí)行相應(yīng)的程序?!鞠嚓P(guān)知識(shí)】一、按鍵識(shí)別當(dāng)單片機(jī)檢測(cè)到與按鍵相連的IO口被拉低就證明此按鍵被按下,那門(mén)我們將此功能上一個(gè)層次來(lái)說(shuō)呢,按鍵就是一個(gè)人機(jī)接口。那么按鍵的操作并沒(méi)有我們想象的“按下松開(kāi)”那么簡(jiǎn)單,在實(shí)際應(yīng)用中,手動(dòng)操作需要消抖。按下并抬起按鍵的過(guò)程可以分為5個(gè)階段:(5)有效釋放階段(4)釋放抖動(dòng)階段(3)有效閉合階段(2)閉合抖動(dòng)階段(1)等待階段(4)釋放抖動(dòng)階段(3)有效閉合階段(4)釋放抖動(dòng)階段常用的去抖動(dòng)的方法--硬件方法和軟件方法: (1)硬件去抖動(dòng)的方法很多,也可以通過(guò)硬件防抖動(dòng)來(lái)解決,這樣成本會(huì)高一些。 (2)軟件去抖動(dòng)法,通常用延時(shí)程序去抖動(dòng)。

延時(shí)讀鍵法:在單片機(jī)獲得端口為低電平的信息后,不是立即認(rèn)定按鍵已被按下,而是延時(shí)10毫秒或更長(zhǎng)的時(shí)間后再次檢測(cè)該端口,如果仍為低,說(shuō)明此鍵的確被按下了,這實(shí)際上是避開(kāi)了按鍵按下時(shí)的抖動(dòng)時(shí)間。如左上圖所示,當(dāng)電源很穩(wěn)定,沒(méi)有干擾的情況下,這種方法是可靠的。如右上圖所示,當(dāng)電源不穩(wěn)定,存在很大干擾時(shí),則有可能存在誤判。

多次讀鍵法:在單片機(jī)獲得端口為低電平的信息后,在一段時(shí)間內(nèi)如20毫秒,多次檢測(cè)按鍵的狀態(tài),只有當(dāng)每次讀到的狀態(tài)都是低電平時(shí)才認(rèn)為有按鍵按下,如上圖所示。用這種方法,不會(huì)存在誤判的情況。有一點(diǎn)必須注意,多次檢測(cè)持續(xù)的時(shí)間應(yīng)該比閉合抖動(dòng)的時(shí)間長(zhǎng)。

本項(xiàng)目任務(wù)中,主要用軟件方法去抖,即檢測(cè)出鍵閉合后執(zhí)行一個(gè)延時(shí)程序,產(chǎn)生10ms的延時(shí),讓前沿抖動(dòng)消失后再一次檢測(cè)鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。當(dāng)檢測(cè)到按鍵釋放后,也要給10ms的延時(shí),待后沿抖動(dòng)消失后才能轉(zhuǎn)入該鍵的處理程序?!救蝿?wù)實(shí)施】在proteus中繪制如圖電路:任務(wù)2一位數(shù)碼顯示【任務(wù)描述】P2口驅(qū)動(dòng)一位共陰數(shù)碼管,如圖所示,顯示出一個(gè)數(shù)字‘5’?!救蝿?wù)分析】需要單片機(jī)驅(qū)動(dòng)數(shù)碼管,那么需要掌握數(shù)碼管的硬件知識(shí),數(shù)碼管的驅(qū)動(dòng)方法。【相關(guān)知識(shí)】一、LED數(shù)碼管原理簡(jiǎn)述

單片機(jī)應(yīng)用系統(tǒng)常用的是8段LED,如下圖2-8所示,它有其陰極和共陽(yáng)極兩種。共陰極數(shù)碼管是將所有發(fā)光二極管的陰極接在一起作為公共端COM,當(dāng)公共端接低電平時(shí),某一段陽(yáng)極上的電平為“1”時(shí),該段點(diǎn)亮,電平為“0”時(shí),該段熄滅。共陰極數(shù)碼管是將所有發(fā)光二極管的陰極接在一起作為公共端COM,當(dāng)公共端接低電平時(shí),某一段陽(yáng)極上的電平為“1”時(shí),該段點(diǎn)亮,電平為“0”時(shí),該段熄滅。例:共陰極數(shù)碼管顯示數(shù)字“2”:17第七章單片機(jī)外部擴(kuò)展資源及應(yīng)用abcdefghGND+-共陰極數(shù)碼管abcdefgh11011010a段碼:01011011(5BH)+5Vabcdefgh+-共陽(yáng)極數(shù)碼管00100101段碼:10100100(A4H)LED數(shù)碼顯示器的顯示字符及碼表18第七章單片機(jī)外部擴(kuò)展資源及應(yīng)用

數(shù)碼管要正常顯示,就要用驅(qū)動(dòng)電路來(lái)驅(qū)動(dòng)數(shù)碼管的各個(gè)段碼,從而顯示出我們要的數(shù)字,因此根據(jù)數(shù)碼管的驅(qū)動(dòng)方式的不同,可以分為靜態(tài)式和動(dòng)態(tài)式兩類。本任務(wù)介紹靜態(tài)顯示示驅(qū)動(dòng)。靜態(tài)驅(qū)動(dòng)也稱直流驅(qū)動(dòng)。靜態(tài)驅(qū)動(dòng)是指每個(gè)數(shù)碼管的每一個(gè)段碼都由一個(gè)單片機(jī)的I/O端口進(jìn)行驅(qū)動(dòng),或者使用如BCD碼二-十進(jìn)制譯碼器譯碼進(jìn)行驅(qū)動(dòng)。靜態(tài)驅(qū)動(dòng)的優(yōu)點(diǎn)是編程簡(jiǎn)單,顯示亮度高,缺點(diǎn)是占用I/O端口多,如驅(qū)動(dòng)5個(gè)數(shù)碼管靜態(tài)顯示則需要5×8=40根I/O端口來(lái)驅(qū)動(dòng),要知道一個(gè)89C51單片機(jī)可用的I/O端口才32個(gè),實(shí)際應(yīng)用時(shí)必須增加譯碼驅(qū)動(dòng)器進(jìn)行驅(qū)動(dòng),增加了硬件電路的復(fù)雜性。這里給出了單片機(jī)實(shí)際中驅(qū)動(dòng)數(shù)碼管的電路,是加了三極管的。由于單片機(jī)I/O口驅(qū)動(dòng)能力不夠,不能直接將段選端接單片機(jī)I/O口,因此在電路中增加三級(jí)管用作驅(qū)動(dòng),以增加IO口的電流驅(qū)動(dòng)能力。LED數(shù)碼顯示器的結(jié)構(gòu)與原理1位LED數(shù)碼顯示器的引腳結(jié)構(gòu)市售的LED數(shù)碼管尺寸、顏色多樣,常見(jiàn)1位LED數(shù)碼管有10個(gè)引腳,排列如下:21第七章單片機(jī)外部擴(kuò)展資源及應(yīng)用其中3腳、8腳為公共端(位選端),根據(jù)內(nèi)部發(fā)光二極管的接線形式可分為共陰極(CommonCathode,CC)和共陽(yáng)極(CommonAnode,CA)兩種類型。LED數(shù)碼顯示器的結(jié)構(gòu)與原理1位共陰LED數(shù)碼顯示器的接口電路22第七章單片機(jī)外部擴(kuò)展資源及應(yīng)用若直接用單片機(jī)I/O口驅(qū)動(dòng)LED,則LED的電流由單片機(jī)I/O口提供,由于80C51單片機(jī)I/O口(P1、P2和P3口)輸出場(chǎng)效應(yīng)管的內(nèi)部上拉電阻很大,約有幾百K,因此輸出電流很小,一般不超過(guò)1mA,基本無(wú)法驅(qū)動(dòng)LED發(fā)光。LED數(shù)碼顯示器的結(jié)構(gòu)與原理1位共陰LED數(shù)碼顯示器的接口電路23第七章單片機(jī)外部擴(kuò)展資源及應(yīng)用I/O口輸出高電平時(shí),LED發(fā)光,其電流由VCC提供,R為限流電阻,阻值一般為幾百歐;I/O口輸出低電平時(shí),LED熄滅,R上通過(guò)的電流大于LED發(fā)光時(shí)的電流,且該電流流入單片機(jī)引腳。單片機(jī)允許向全部引腳灌入的最大總電流為有限的,一般為幾十毫安,一旦單片機(jī)的I/O口通過(guò)上拉電阻驅(qū)動(dòng)較多的LED(如數(shù)碼管),當(dāng)單片機(jī)I/O口都輸出低電平時(shí),向引腳灌入的總電流可能超過(guò)上限值,導(dǎo)致單片機(jī)工作不穩(wěn)定。LED數(shù)碼顯示器的結(jié)構(gòu)與原理1位共陰LED數(shù)碼顯示器的接口電路24第七章單片機(jī)外部擴(kuò)展資源及應(yīng)用11三極管導(dǎo)通0LED滅LED數(shù)碼顯示器的結(jié)構(gòu)與原理1位共陰LED數(shù)碼顯示器的接口電路25第七章單片機(jī)外部擴(kuò)展資源及應(yīng)用00三極管截止1LED亮這種接口電路在單片機(jī)輸出低電平時(shí),利用三極管的截止,防止電流灌入單片機(jī)I/O引腳。同時(shí),也增強(qiáng)了對(duì)LED的驅(qū)動(dòng)能力?!救蝿?wù)實(shí)施】在proteus按下圖繪制電路。#include<reg51.h>voiddelay1s();//采用實(shí)現(xiàn)1秒延時(shí)子函數(shù)voidmain() //主函數(shù)

{while(1){P2=0x6d;//5的共陰極段碼

delay1s();}}voiddelay1s(void){ unsignedcharh,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}【進(jìn)階提高】使用AT89C51單片機(jī),驅(qū)動(dòng)一位數(shù)碼管。如圖,P1口驅(qū)動(dòng)共陽(yáng)數(shù)碼管,讓該數(shù)碼管輪流顯示‘H’、‘E’、‘L’、‘L’、‘O’。#include<reg51.h>voiddelay1s(unsignedintms);//采用定時(shí)器1實(shí)現(xiàn)1秒延時(shí)子函數(shù)voiddisp1();//順序顯示字符‘H’、‘E’、‘L’、‘L’、‘O’一次的子函數(shù)voidmain() //主函數(shù){while(1){disp1();}}//函數(shù)名:disp1//函數(shù)功能:順序顯示字符‘H’、‘E’、‘L’、‘L’、‘O’一次//形式參數(shù):無(wú)//返回值:無(wú)voiddisp1(){unsignedcharled[]={0x89,0x86,0xc7,0xc7,0xc0};//定義數(shù)組led存放字符‘H’、‘E’、‘L’、‘L’、‘O’的字型碼unsignedchari;for(i=0;i<5;i++){P1=led[i];//字型顯示碼送段控制口P1delay1s(1000); //延時(shí)1秒}}voiddelay1s(unsignedintms)//若ms=1,延時(shí)時(shí)間就為1ms{unsignedinta,b;for(a=ms;a>0;a--)for(b=123;b>0;b--);}

任務(wù)36位數(shù)碼顯示【任務(wù)描述】用單片機(jī)驅(qū)動(dòng)數(shù)碼管動(dòng)態(tài)顯示方法,在數(shù)碼管上同時(shí)顯示出1~6?!救蝿?wù)分析】

動(dòng)態(tài)顯示的特點(diǎn)是將所有位數(shù)碼管的段選線并聯(lián)在一起,由位選線控制是哪一位數(shù)碼管有效。選亮數(shù)碼管采用動(dòng)態(tài)掃描顯示。所謂動(dòng)態(tài)掃描顯示即輪流向各位數(shù)碼管送出字形碼和相應(yīng)的位選,利用發(fā)光管的余輝和人眼視覺(jué)暫留作用,使人的感覺(jué)好像各位數(shù)碼管同時(shí)都在顯示。動(dòng)態(tài)顯示的亮度比靜態(tài)顯示要差一些,所以在選擇限流電阻時(shí)應(yīng)略小于靜態(tài)顯示電路中的。

下面借用下,前面數(shù)字電路BCD數(shù)碼管顯示原理。4位數(shù)碼管共用一個(gè)譯碼器。當(dāng)CP脈沖的頻率f=1HZ時(shí),在CP脈沖的控制下,4位數(shù)碼管將逐個(gè)輪流分時(shí)顯示。但是,當(dāng)CP脈沖的頻率f=100HZ時(shí),則每個(gè)數(shù)碼管依次一次顯示1/25S,由于人眼的滯留特性,實(shí)際的視覺(jué)效果是4個(gè)數(shù)碼管同時(shí)顯示4個(gè)數(shù)據(jù)。顯示原理f=1HZf=100HZ(人眼的滯留特性)顯示原理工作原理①4位數(shù)碼管共用一個(gè)7448BCD譯碼器。②74139為兩輸入4輸出譯碼器。③74139的輸出信號(hào)Y0、Y1、Y2、Y3,分別作為4位數(shù)碼管的位線。工作原理下面通過(guò)單片機(jī)驅(qū)動(dòng)兩位數(shù)碼管進(jìn)一步說(shuō)明:某系統(tǒng)用單片機(jī)的I/O口控制兩個(gè)共陰極接法的LED顯示器。試編寫(xiě)應(yīng)用程序使得在LED顯示器上顯示“HP”兩個(gè)字符。#include"reg51.h"#defineucharunsignedchar#defineuintunsignedintvoiddelayms(uintt)//延時(shí)程序{uinti,j;for(i=0;i<t;i++)for(j=0;j<120;j++);}main(){while(1) { P0=0x89;//H的段碼

P2=0x01;//第一個(gè)數(shù)碼管顯示

delayms(10);P2=0X00;//清消隱

P0=0x8c;//P的段碼

P2=0x02;//第二個(gè)數(shù)碼管顯示

delayms(10);P2=0x00;//清消隱

}}【任務(wù)實(shí)施】74LS245是什么器件?它是8路同相三態(tài)雙向總線收發(fā)器或驅(qū)動(dòng)器當(dāng)片選端/CE=0,AB/BA=“1”,信號(hào)由A向B傳輸

程序代碼:#include<reg51.h>#defineuintunsignedintvoiddelayms(unsignedintxms){ uinti,j; for(i=xms;i>0;i--) for(j=120;j>0;j--);}voiddisp2(){unsignedcharled[]={0xf9,0Xa4,0xb0,0x99,0x92,0x82};//設(shè)置數(shù)字“123456”的字unsignedchari,w;w=0x01; //位選碼初值為01Hfor(i=0;i<6;i++){P2=~w;//位選碼取反后送位控制口P2口

w<<=1; //位選碼左移一位,選中下一位LEDP1=led[i];//顯示字型碼送P1口

delayms(9); //延時(shí)10ms P1=0XFF;//必須加這句,清消隱

}}main() //主函數(shù){while(1){disp2();}}【進(jìn)階提高】使用移位函數(shù)實(shí)現(xiàn)6位數(shù)碼管的動(dòng)態(tài)顯示。單片機(jī)驅(qū)動(dòng)8位數(shù)碼管顯示電路對(duì)應(yīng)的程序代碼如下:#include<reg52.h>#include<intrins.h>#defineucharunsignedchar//宏定義uchar替換unsignedchar型ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//定義0,1,2……9,a,b,c,d,e,f字符編碼數(shù)組0x82,0xd8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voiddelay(intz);//延時(shí)函數(shù)聲明

voidmain(){inti;P2=0xfe;//開(kāi)段選,打開(kāi)第一位數(shù)碼管

while(1)//進(jìn)入大循環(huán),開(kāi)始動(dòng)態(tài)掃描

{for(i=0;i<8;i++)//依次掃描8位數(shù)碼管

{P1=table[i+1];//給段選端P0送字型碼

delay(5000);P2=_crol_(P2,1);//循環(huán)右移

}}}/*定義延時(shí)函數(shù)*/voiddelay(intz){intx,y;for(x=z;x>0;x--)for(y=50;y>0;y--);}任務(wù)四手動(dòng)計(jì)數(shù)器實(shí)現(xiàn)【任務(wù)描述】單片機(jī)P3.2引腳接一按鍵,最開(kāi)始顯示全0,按下一次按鍵加1,把加的和用8位數(shù)碼管顯示出來(lái)。【任務(wù)分析】按鍵按下后,執(zhí)行加1操作,把該和送數(shù)碼管顯示之前,分離出個(gè)位、十位、百位......等。假若這個(gè)和是n,可以用下面代碼分離出個(gè)位、十位、百位。

i=n/100;/*分解出百位*/;

j=n/10%10;/*分解出十位*/;

k=n%10;/*分解出個(gè)位*/?!鞠嚓P(guān)知識(shí)】狀態(tài)機(jī)是軟件編程中的一個(gè)重要概念。比這個(gè)概念更重要的是對(duì)它的靈活應(yīng)用。在一個(gè)思路清晰而且高效的程序中,必然有狀態(tài)機(jī)的身影浮現(xiàn)。比如說(shuō)一個(gè)按鍵命令解析程序,就可以被看做狀態(tài)機(jī):本來(lái)在A狀態(tài)下,觸發(fā)一個(gè)按鍵后切換到了B狀態(tài);再觸發(fā)另一個(gè)鍵后切換到C狀態(tài),或者返回到A狀態(tài)。這就是最簡(jiǎn)單的按鍵狀態(tài)機(jī)例子。實(shí)際的按鍵解析程序會(huì)比這更復(fù)雜些,但這不影響我們對(duì)狀態(tài)機(jī)的認(rèn)識(shí)。1.狀態(tài)機(jī)的要素狀態(tài)機(jī)可歸納為4個(gè)要素,即現(xiàn)態(tài)、條件、動(dòng)作、次態(tài)。這樣的歸納,主要是出于對(duì)狀態(tài)機(jī)的內(nèi)在因果關(guān)系的考慮?!艾F(xiàn)態(tài)”和“條件”是因,“動(dòng)作”和“次態(tài)”是果。詳解如下:(1)現(xiàn)態(tài):是指當(dāng)前所處的狀態(tài)。(2)條件:又稱為“事件”。當(dāng)一個(gè)條件被滿足,將會(huì)觸發(fā)一個(gè)動(dòng)作,或者執(zhí)行一次狀態(tài)的遷移。(3)動(dòng)作:條件滿足后執(zhí)行的動(dòng)作。動(dòng)作執(zhí)行完畢后,可以遷移到新的狀態(tài),也可以仍舊保持原狀態(tài)。動(dòng)作不是必需的,當(dāng)條件滿足后,也可以不執(zhí)行任何動(dòng)作,直接遷移到新?tīng)顟B(tài)。(4)次態(tài):條件滿足后要遷往的新?tīng)顟B(tài)?!按螒B(tài)”是相對(duì)于“現(xiàn)態(tài)”而言的,“次態(tài)”一旦被激活,就轉(zhuǎn)變成新的“現(xiàn)態(tài)”了。如果我們進(jìn)一步歸納,把“現(xiàn)態(tài)”和“次態(tài)”統(tǒng)一起來(lái),而把“動(dòng)作”忽略(降格處理),則只剩下兩個(gè)最關(guān)鍵的要素,即:狀態(tài)、遷移條件。【任務(wù)實(shí)施】手動(dòng)計(jì)數(shù)器任務(wù)對(duì)應(yīng)的程序代碼如下:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitkeyport=P3^2;#definekeystate00 //按鍵第一次按下?tīng)顟B(tài)#definekeystate11 //按鍵按下確認(rèn)狀態(tài)#definekeystate22charkeystate=2; //按鍵狀態(tài)初始化為按鍵無(wú)動(dòng)作狀態(tài)uintnum1=0,num2=0;ucharweixuan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位選代碼uchartemp[8]=0; //從高位到低位對(duì)應(yīng)數(shù)碼管從左到右voiddelayms(uintx) //1ms{ uinty,z; for(y=x;y>0;y--) for(z=111;z>0;z--);}ucharcodetable[]={ //共陽(yáng)數(shù)碼管0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voidsmg(){uchari;for(i=0;i<8;i++){P2=weixuan[i];P1=table[temp[i]];delayms(1);P2=0xff;}}voidproc()//分離出萬(wàn)位、千位、百位、十位以及個(gè)位等待顯示{ temp[0]=num1%10; temp[1]=num1%100/10; temp[2]=num1%1000/100; temp[3]=num1/1000; temp[4]=num2%10; temp[5]=num2%100/10; temp[6]=num2%1000/100; temp[7]=num2/1000;}charkeyscan(){ switch(keystate) { casekeystate0: //keystate0,第一次檢測(cè)到按鍵按下?tīng)顟B(tài),下一狀態(tài)為keystate1(按鍵按下確認(rèn)狀態(tài)) keystate=keystate1; return0; casekeystate1: //keystate1,按鍵按下確認(rèn)狀態(tài),下一狀態(tài)為keystate2(按鍵無(wú)動(dòng)作狀態(tài))if(!keyport)

{ keystate=keystate2; while(!keyport); return1; } else keystate=keystate2; return0; casekeystate2: //keystate2,按鍵無(wú)動(dòng)作狀態(tài),下一狀態(tài)為keystate0(第一次檢測(cè)到按鍵按下?tīng)顟B(tài))if(!keyport) { keystate=keystate0; } else keystate=keystate2; return0; }}voidmain(){while(1) { if(keyscan())

{ num1++; if(num1>=10000) { num1=0; num2++; if(num2>=10000) { num2=0; } } proc(); } smg();

}}【進(jìn)階提高】單片機(jī)P3.2引腳接一按鍵,功能為加1按鍵,點(diǎn)一下加1;單片機(jī)P3.3引腳接一按鍵,功能為減一按鍵,點(diǎn)一下減1,在前面任務(wù)基礎(chǔ)上,請(qǐng)用狀態(tài)機(jī)編程的方法實(shí)現(xiàn)點(diǎn)加1按鍵實(shí)現(xiàn)加1,點(diǎn)減1按鈕實(shí)現(xiàn)減1。

狀態(tài)機(jī)實(shí)現(xiàn)手動(dòng)計(jì)數(shù)器電路對(duì)應(yīng)的程序代碼如下:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineKEYP3#definekeystate00 //按鍵無(wú)動(dòng)作狀態(tài) #definekeystate11 //按鍵按下?tīng)顟B(tài) #definekeystate22 //按鍵釋放狀態(tài)charucKeyStatus=0; //按鍵狀態(tài)初始化為按鍵無(wú)動(dòng)作狀態(tài)unsignedcharkeyvalue;uintnum1=0,num2=0;ucharweixuan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};uchartemp[8]=0; //從高位到低位對(duì)應(yīng)數(shù)碼管從左到右voiddelayms(uintx) //1ms{ uinty,z; for(y=x;y>0;y--) for(z=111;z>0;z--);}ucharcodetable[]={ //共陽(yáng)數(shù)碼管0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};voidsmg(){uchari;for(i=0;i<8;i++){P2=weixuan[i]; //位選

P1=table[temp[i]]; //送段碼

delayms(1);P2=0xff;//消隱

}}voidproc()//待顯示數(shù)據(jù)的分離{ temp[0]=num1%10; temp[1]=num1%100/10; temp[2]=num1%1000/100; temp[3]=num1/1000; temp[4]=num2%10;temp[5]=num2%100/10; temp[6]=num2%1000/100; temp[7]=num2/1000;}ucharkeyscan() //按鍵掃描程序{switch(ucKeyStatus)//

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論