電子系統(tǒng)設(shè)計(jì)-第5章以單片機(jī)為核心的智能型電子系統(tǒng)設(shè)計(jì)1(講稿)課件_第1頁(yè)
電子系統(tǒng)設(shè)計(jì)-第5章以單片機(jī)為核心的智能型電子系統(tǒng)設(shè)計(jì)1(講稿)課件_第2頁(yè)
電子系統(tǒng)設(shè)計(jì)-第5章以單片機(jī)為核心的智能型電子系統(tǒng)設(shè)計(jì)1(講稿)課件_第3頁(yè)
電子系統(tǒng)設(shè)計(jì)-第5章以單片機(jī)為核心的智能型電子系統(tǒng)設(shè)計(jì)1(講稿)課件_第4頁(yè)
電子系統(tǒng)設(shè)計(jì)-第5章以單片機(jī)為核心的智能型電子系統(tǒng)設(shè)計(jì)1(講稿)課件_第5頁(yè)
已閱讀5頁(yè),還剩84頁(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)介

電子系統(tǒng)設(shè)計(jì)——第5章以單片機(jī)為核心的智能型電子系統(tǒng)設(shè)計(jì)1(講稿)ppt課件1、AT89S5x單片機(jī)開(kāi)發(fā)板應(yīng)用1、AT89S5x單片機(jī)開(kāi)發(fā)板應(yīng)用1、AT89S5x單片機(jī)開(kāi)發(fā)板設(shè)計(jì)及應(yīng)用(1)任務(wù):點(diǎn)亮LED燈在Keil軟件編輯窗口輸入以下程序:#include<AT89x51.H>sbitP3_0=P3^0;voidmain(void){while(1){P3_0=0;}}1、AT89S5x單片機(jī)開(kāi)發(fā)板設(shè)計(jì)及應(yīng)用(1)任務(wù):點(diǎn)亮LEEasy51Prov2.0

軟件的使用——硬件連接Easy51Prov2.0軟件的使用——硬件連接Easy51Prov2.0

軟件的使用——軟件操作Easy51Prov2.0軟件的使用——軟件操作(2)AT89S51單片機(jī)最小系統(tǒng)介紹單片機(jī)要工作必須具備以下條件:(1)+5V電源;(2)起振電路;(3)復(fù)位電路;(4)一塊正常的單片機(jī)。注意:另外P0口要加上拉電阻,才有足夠的驅(qū)動(dòng)能力驅(qū)動(dòng)外圍器件工作;EA接高電平,表示單片機(jī)使用的是片內(nèi)FLASHROM。(2)AT89S51單片機(jī)最小系統(tǒng)介紹單片機(jī)要工作必須具備以(3)任務(wù):閃爍燈#include<AT89X51.H>voiddelay02s(void){unsignedchari,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}voidmain(void){while(1){P3_0=0;delay02s();P3_0=1;delay02s();}}要求:前面例子是讓LED燈亮,現(xiàn)在實(shí)現(xiàn)LED燈的閃爍。(3)任務(wù):閃爍燈#include<AT89X51.H>(4)任務(wù):流水燈要求:做廣告燈的左移右移,八個(gè)發(fā)光二極管分別接在單片機(jī)的P3.0-P3.7接口上,輸出“0”時(shí),發(fā)光二極管亮,左移右移按D1→D2→D3→D4→┅→D8→D7→D6→┅→D1亮,重復(fù)循環(huán)。(4)任務(wù):流水燈要求:做廣告燈的左移右移,八個(gè)發(fā)光二極管分(4)任務(wù):流水燈程序:#include<AT89X52.H>unsignedchari;unsignedchartemp;voiddelay(void)//延時(shí)子程序{ unsignedcharm,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--);}voidmain(void)//主程序{ while(1)//循環(huán)條件永遠(yuǎn)為真,以下程序一直執(zhí)行下去。

{

(4)任務(wù):流水燈程序:續(xù)前頁(yè):temp=0x7f; P3=temp;//直接對(duì)I/O口P3賦值,使P3.0輸出低點(diǎn)平。

delay();//延時(shí)

for(i=1;i<8;i++)//實(shí)現(xiàn)廣告燈的從D1到D7移動(dòng)

{ temp=(temp>>1)|0x80;

P3=temp; delay(); } temp=0xfe; P3=temp; delay(); for(i=1;i<8;i++)//實(shí)現(xiàn)廣告燈的從D7到D1移動(dòng)

{ temp=(temp<<1)|0x01;

P3=temp; delay(); } }}

續(xù)前頁(yè):思考:如何實(shí)現(xiàn)更為復(fù)雜的花樣燈?參考程序:#include"reg51.h"#defineucharunsignedcharconstuchartab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//下移

0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,//上移

0xef,0xbd,0xdb,0xfe,//兩邊向中間移

0xdb,0xbd,0xef,//中間向兩邊移

0xaa,0x55,0xaa,0x55,0xaa,0x55,//1357,2468交替3次

0xf0,0x0f,0xf0,0x0f,//1234,5678交替2次

0x33,0xcc,0x33,0xcc,0x33,0xcc,//1256,3478交替3次

0x00};//結(jié)束碼

uchart=0;////以下初始化子函數(shù)////voidsys_init(void){TMOD=0x01;TH0=0xd8;思考:如何實(shí)現(xiàn)更為復(fù)雜的花樣燈?參考程序:續(xù)前頁(yè):TL0=0xef;ET0=1;EA=1;TR0=1;}////以下主函數(shù)////voidmain(void){uchari=0;P3=tab[i];i++;sys_init();while(1){while(t<100);t=0;if(tab[i]==0x00){i=0;}P3=tab[i];i++;}}續(xù)左頁(yè):////以下定時(shí)器0中斷函數(shù)////voidtimer0(void)interrupt1{TR0=0;TH0=0xd8;TL0=0xef;t++;TR0=1;}續(xù)前頁(yè):續(xù)左頁(yè):(5)任務(wù):按鍵識(shí)別要求:通過(guò)按下一次按鍵INT0,使小燈D1亮滅交替變換。實(shí)驗(yàn)原理:只要判斷P3.2的電平就可以知道按鍵是否被按下;而在按鍵按下的過(guò)程中,由于機(jī)械抖動(dòng),將產(chǎn)生干擾,電平高低變化??梢圆捎密浖V波的方法去除這些干擾信號(hào),在程序設(shè)計(jì)時(shí),一旦發(fā)現(xiàn)P3.2為低電平,進(jìn)入按鍵判斷狀態(tài),軟件延時(shí)10-20ms,從而避開(kāi)了干擾信號(hào)區(qū)域,再重新檢測(cè)P3.2狀態(tài),看按鍵是否真的已經(jīng)按下。(5)任務(wù):按鍵識(shí)別要求:通過(guò)按下一次按鍵INT0,使小燈D參考程序:include<AT89X52.H>sbitINT_0=P3^2;//定義按鍵的輸入端sbitD1=P3^0;

//D1小燈定義voiddelay10ms(void)//延時(shí)程序{

unsignedchari,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);}key(

)

//按鍵判斷程序{ if(INT_0==0)//判斷是否按下鍵盤(pán) { delay10ms(

);//延時(shí),軟件去干擾 if(INT_0==0)//確認(rèn)按鍵按下 {

D1=!D1;//D1亮滅交替變化 }

while(INT_0==0);//按鍵鎖定,每按一次D1只變化一次 }參考程序:續(xù)前頁(yè):}main(){while(1)

//永遠(yuǎn)循環(huán),掃描判斷按鍵是否按下 { key();

//對(duì)于此處CPU只按鍵判斷一直掃描; }}

課后請(qǐng)實(shí)踐:1.用兩個(gè)按鍵來(lái)控制D1的亮滅;2.使用一個(gè)按鍵,控制小燈亮的順序D1→D2→D3→D4→┅→D8→D7→→┅D0亮重復(fù)循環(huán);續(xù)前頁(yè):課后請(qǐng)實(shí)踐:(6)任務(wù):數(shù)碼管靜態(tài)顯示要求:用數(shù)碼管LED的個(gè)位,靜態(tài)顯示數(shù)字“4”字樣;注意:因采用共陰數(shù)碼顯示管,故此圖P0口還應(yīng)接1K或10K的排阻作為上拉電阻。(6)任務(wù):數(shù)碼管靜態(tài)顯示要求:用數(shù)碼管LED的個(gè)位,靜態(tài)參考程序:#include<AT89X52.H>sbitGE=P1^3;codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//顯示段碼main(){ unsignedchardisplay_date=4;//定義并賦值要顯示的數(shù)據(jù) while(1) { P0=seg7code[display_date];

//查表,輸出 GE=0;//P1^3為低電平,相當(dāng)于把數(shù)碼管的4H端接地 }}課后請(qǐng)實(shí)踐:1.讓顯示的數(shù)據(jù)動(dòng)起來(lái),比如做一個(gè)0到9的秒表(用軟件延時(shí));2.和按鍵判斷程序結(jié)合,用按鍵控制數(shù)字變化;參考程序:課后請(qǐng)實(shí)踐:(7)任務(wù):數(shù)碼管動(dòng)態(tài)顯示要求:用數(shù)碼管LED的顯示四位數(shù)據(jù),比如顯示數(shù)字“1234”;參考程序:#include<AT89X52.H>sbitqian=P1^0;sbitbai=P1^1;sbitshi=P1^2;sbitge=P1^3;codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示段碼voidDelay(unsignedinttc)//延時(shí)程序{ while(tc!=0) //如果tc為0則終止延時(shí) { unsignedinti; //局部正整數(shù)變量i for(i=0;i<100;i++); //執(zhí)行400次將耗時(shí)1毫秒 tc--; //tc計(jì)數(shù)減一 }}(7)任務(wù):數(shù)碼管動(dòng)態(tài)顯示要求:用數(shù)碼管LED的顯示四位數(shù)續(xù)前頁(yè):voidLed(intdate)//顯示函數(shù){ qian=0;//P1.0輸出低電平,選通千位數(shù) P0=seg7code[date/1000];//取出千位數(shù),查表,輸出。 Delay(10);//延時(shí) qian=1;//銷(xiāo)隱 bai=0;//P1.1輸出低電平,選通百位數(shù) P0=seg7code[date%1000/100];//取出百位數(shù),查表,輸出。 Delay(10);//延時(shí) bai=1;//銷(xiāo)隱 shi=0;//P1.2輸出低電平,選通十位數(shù) P0=seg7code[date%100/10];//取出十位數(shù),查表,輸出。 Delay(10);//延時(shí) shi=1;//銷(xiāo)隱 ge=0; //P1.3輸出低電平,選通十位數(shù) P0=seg7code[date%10];//取出個(gè)位數(shù),查表,輸出。 Delay(10); ge=1;}

續(xù)前頁(yè):續(xù)前頁(yè):main(){intdisplay_date=1234;//定義并賦值要顯示的數(shù)據(jù)while(1){Led(display_date);//調(diào)用顯示函數(shù)顯示數(shù)據(jù)display_date}}

續(xù)前頁(yè):上述數(shù)碼管動(dòng)態(tài)顯示程序的另一種寫(xiě)法參考程序:#include<AT89X51.H>unsignedchardatebit[]={0xfe,0xfd,0xfb,0xf7};//存儲(chǔ)數(shù)碼管的位選值unsignedchartvdate[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,};unsignedintdisdata;//定義要顯示的數(shù)據(jù)unsignedchardisdat[4];//存儲(chǔ)要顯示的四位數(shù)據(jù)voiddelay(time){unsignedchari,j;for(j=0;j<time;j++)for(i=0;i<250;i++);}display(void){ unsignedchark; disdata=1234;//顯示1234

上述數(shù)碼管動(dòng)態(tài)顯示程序的另一種寫(xiě)法參考程序:續(xù)前頁(yè):

disdat[0]=disdat/1000; //取出千位 disdat[1]=disdat%1000/100;

//取出百位 disdat[2]=disdat%100/10; //取出十位 disdat[3]=disdat%10; //取出個(gè)位 for(k=0;k<4;k++)

//顯示四位數(shù)據(jù) { P0=tvdate[disdat[k]];

//送出要顯示數(shù)據(jù)的段碼 P1=datebit[k]; //P2位選 delay(10); //延時(shí) }}main(){while(1){display();}}

這種寫(xiě)法比上一種復(fù)雜,占用空間要多一些.但是使用方便,可以在此基礎(chǔ)上方便的加上比如顯示小數(shù)點(diǎn),指定某位數(shù)碼管閃爍等。課后思考:如何用軟件延時(shí)來(lái)做一個(gè)0到60秒的計(jì)數(shù)器嗎?續(xù)前頁(yè):這種寫(xiě)法比上一種復(fù)雜,占用空間要多一些.但是使(8)任務(wù):4X4矩陣鍵盤(pán)識(shí)別要求:用AT89S51的并行口P2接4×4矩陣鍵盤(pán),以P3.0-P3.3作輸入線(xiàn),以P3.4-P3.7作輸出線(xiàn);在每一個(gè)數(shù)碼管上顯示每個(gè)按鍵的“0-F”序號(hào)。[實(shí)驗(yàn)原理]每個(gè)按鍵有它的行值和列值,行值和列值的組合就是識(shí)別這個(gè)按鍵的編碼。矩陣的行線(xiàn)和列線(xiàn)分別通過(guò)兩并行接口和CPU通信。鍵盤(pán)處理程序的任務(wù)是:確定有無(wú)鍵按下,判斷哪一個(gè)鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開(kāi)時(shí)的抖動(dòng)。兩個(gè)并行口中,一個(gè)輸出掃描碼,使按鍵逐行動(dòng)態(tài)接地,另一個(gè)并行口輸入按鍵狀態(tài),由行掃描值和回饋信號(hào)共同形成鍵編碼而識(shí)別按鍵,通過(guò)軟件查表,查出該鍵的功能。(8)任務(wù):4X4矩陣鍵盤(pán)識(shí)別要求:用AT89S51的并行鍵盤(pán)識(shí)別的兩種方法逐行掃描法:(1)首先判斷有無(wú)鍵按下:令矩陣行線(xiàn)輸出全0信號(hào),檢測(cè)列線(xiàn)狀態(tài),若有一列電平為低,則有鍵按下。(2)確定閉合鍵位置:依次將各行線(xiàn)置為低電平,逐行檢測(cè)各列線(xiàn)的電平狀態(tài),若某列為低,則該行線(xiàn)和列線(xiàn)交叉處按鍵就是閉合鍵。線(xiàn)反轉(zhuǎn)法:(1)令矩陣鍵盤(pán)列線(xiàn)輸出全0信號(hào),行線(xiàn)作為輸入接口接收信號(hào),可判斷按鍵處于哪一行。(2)令矩陣鍵盤(pán)行線(xiàn)輸出全0信號(hào),列線(xiàn)作為輸入接口接收信號(hào),可判斷按鍵處于哪一列。(3)將輸入信號(hào)相或后形成鍵盤(pán)的唯一鍵碼。鍵盤(pán)識(shí)別的兩種方法逐行掃描法:程序:(線(xiàn)反轉(zhuǎn)法)#include<reg52.h>unsignedcharcodeseg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchark;voiddelay10ms(void)//延時(shí)程序{ unsignedchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--);}voidGetch(){ unsignedcharX,Y,Z;

P2=0xff;

P2=0x0f;

//先對(duì)P2置數(shù)行掃描 if(P2!=0x0f)//判斷是否有鍵按下 {

delay10ms();//延時(shí),軟件去干擾

if(P2!=0x0f)

//確認(rèn)按鍵按下X=P2;

{

程序:(線(xiàn)反轉(zhuǎn)法)續(xù)前頁(yè):

X=P2;//保存行掃描時(shí)有鍵按下時(shí)狀態(tài) P2=0xf0;//列掃描 Y=P2;//保存列掃描時(shí)有鍵按下時(shí)狀態(tài) Z=X|Y;//取出鍵值 switch(Z)//判斷鍵值(那一個(gè)鍵按下) { case0x77:k=0;break;//對(duì)鍵值賦值 case0x7b:k=1;break; case0x7d:k=2;break; case0x7e:k=3;break; case0xb7:k=4;break; case0xbb:k=5;break; case0xbd:k=6;break; case0xbe:k=7;break; case0xd7:k=8;break; case0xdb:k=9;break; case0xdd:k=10;break; case0xde:k=11;break; case0xe7:k=12;break; case0xeb:k=13;break; 續(xù)前頁(yè):續(xù)前頁(yè):

case0xed:k=14;break;

case0xee:k=15;break; } } }}voidmain(void){while(1){P2=0xff;Getch(

);P0=seg7code[k];//查表LED輸出P1=0xf0;//輸出相同的四位數(shù)據(jù)。}}

續(xù)前頁(yè):(9)任務(wù):按鍵中斷識(shí)別要求:采用中斷技術(shù),每按一下按鍵,計(jì)數(shù)器加1,并用LED顯示出來(lái),注意只顯示2位十進(jìn)制數(shù)。原理:以上的兩個(gè)關(guān)于按鍵識(shí)別的實(shí)驗(yàn)的程序都是采用掃描的方式來(lái)實(shí)現(xiàn)的,CPU的利用率比較低;按鍵判斷還可以用中斷方式來(lái)判斷。中斷方式可以滿(mǎn)足快速響應(yīng)的要求。(9)任務(wù):按鍵中斷識(shí)別要求:采用中斷技術(shù),每按一下按鍵,計(jì)程序:#include<AT89X51.H>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedchardispcount=0;//計(jì)數(shù)sbitgewei=P1^3;//個(gè)位選通定義sbitshiwei=P1^2;//十位選通定義voidDelay(unsignedinttc)//延時(shí)程序{while(tc!=0){unsignedinti;for(i=0;i<100;i++);tc--;}}voidExtInt0()interrupt0//中斷服務(wù)程序{程序:續(xù)前頁(yè):dispcount++;//每按一次中斷按鍵,計(jì)數(shù)加一if(dispcount==100)//計(jì)數(shù)范圍0-99{dispcount=0;}}voidLED()//LED顯示函數(shù){if(dispcount>=10)//顯示兩位數(shù){shiwei=0;P0=table[dispcount/10];Delay(8);shiwei=1;gewei=0;P0=table[dispcount%10];Delay(5);gewei=1;}else//顯示一位數(shù){

續(xù)前頁(yè):續(xù)前頁(yè):shiwei=1;gewei=0;P0=table[dispcount];Delay(8);}}

voidmain(){TCON=0x01;

//下降沿觸發(fā)

IE=0x81;

//開(kāi)總中斷和允許外部中斷

while(1)

//循環(huán)執(zhí)行{LED(

);}

//調(diào)用顯示函數(shù)}/*******************************************************************課后思考:在程序在硬件運(yùn)行過(guò)程中,有時(shí)候按一下鍵會(huì)加幾個(gè)數(shù),是因?yàn)闆](méi)有去除按鍵干擾請(qǐng)您想一想怎么消除抖動(dòng)./***************************************************************************************/

續(xù)前頁(yè):(10)任務(wù):定時(shí)器T0的應(yīng)用——9.9秒計(jì)時(shí)設(shè)計(jì)要求:開(kāi)始時(shí),顯示“00”,第1次按下INT0后就開(kāi)始計(jì)時(shí)。第2次按INT0后,計(jì)時(shí)停止。第3次按INT0后,計(jì)時(shí)歸零。(10)任務(wù):定時(shí)器T0的應(yīng)用——9.9秒計(jì)時(shí)設(shè)計(jì)要求:開(kāi)始程序:#include<AT89X51.H>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};unsignedcharsec;//定義計(jì)數(shù)值,每過(guò)1/10秒,sec加一unsignedcharkeycnt=1;//鍵值判斷unsignedinttcnt;//中斷次數(shù)計(jì)數(shù)器

sbitgewei=P1^3;//個(gè)位選通定義sbitshiwei=P1^2;//十位選通定義sbitINT_0=P3^2;//按鍵定義位voidDelay(unsignedinttc)//延時(shí)程序{while(tc!=0){unsignedinti;for(i=0;i<100;i++);tc--;}}程序:續(xù)前頁(yè):voidLED(

)//LED顯示函數(shù){shiwei=0;P0=table[sec/10]|0x80;//十位加上小數(shù)點(diǎn)Delay(5);shiwei=1;gewei=0;P0=table[sec%10];Delay(5);gewei=1;}voidKEY()//按鍵掃描程序{unsignedchari,j;if(INT_0==0){for(i=20;i>0;i--)//延時(shí)去干擾for(j=248;j>0;j--);續(xù)前頁(yè):續(xù)前頁(yè):if(INT_0==0){switch(keycnt)

//按下次數(shù)判斷{case1:

//第一次按下TH0=0x06;

//對(duì)TH0TL0賦值TL0=0x06;TR0=1;

//開(kāi)始定時(shí)keycnt=2;

//為第二次做準(zhǔn)備break;case2:

//第二次按下TR0=0;

//定時(shí)結(jié)束keycnt=3;

//為第三次按下做準(zhǔn)備break;case3:

//第三次按下keycnt=1;

//重新開(kāi)始判斷鍵值sec=0;

//計(jì)數(shù)重新從零開(kāi)始break;}

續(xù)前頁(yè):續(xù)前頁(yè):while(INT_0==0);}}}voidt0(void)interrupt1using0//定時(shí)中斷服務(wù)函數(shù){tcnt++;//每過(guò)250us,tcnt加一if(tcnt==400)//計(jì)滿(mǎn)400次(0.1秒)時(shí){tcnt=0;//重新再計(jì)sec++;if(sec==100)//定時(shí)10秒,在從零開(kāi)始計(jì)時(shí){sec=0;}}}續(xù)前頁(yè):續(xù)前頁(yè):voidmain(void){TMOD=0x02;//定時(shí)器工作在方式2自動(dòng)重裝方式ET0=1;//允許T0產(chǎn)生中斷EA=1;//開(kāi)總中斷sec=0;while(1){KEY();LED();}}續(xù)前頁(yè):電子鐘電路及程序示例:電路原理圖:電子鐘電路及程序示例:電路原理圖:C語(yǔ)言源程序:#include<AT89X52.h>unsignedcharcodedis_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};unsignedchardatadis[5];sec=0,min=11,hou=17,cou=0,sec_flag=0,sansuo_flag=0,dis_r=0;//***voidmain(){P0=0x00;P2=0xff;TMOD=0x11;TH0=0xec;TL0=0x78;//T0十毫秒定時(shí)TH1=0xfe;TL1=0x0c;//T1一毫秒定時(shí)

EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1){if(sec_flag==1)sec_flag=0;}}C語(yǔ)言源程序:#include<AT89X52.h>續(xù)前頁(yè):voidtime0(void)interrupt1{cou++;if(cou==50)sansuo_flag=~sansuo_flag;if(cou==100){sec_flag=1;cou=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hou++;if(hou==23){hou=0;}}}}TH0=0xec;TL0=0x78;}續(xù)前頁(yè):續(xù)前頁(yè):voidtime1(void)interrupt3{dis[0]=min%10;dis[1]=min/10;dis[2]=10;dis[3]=hou%10;dis[4]=hou/10;P0=dis_code[dis[dis_r]];switch(dis_r){case0:P2=0xef;dis_r++;break;case1:P2=0xdf;dis_r++;break;case2:if(sansuo_flag==0){P2=0xcf;}else{P2=0xff;}dis_r++;break;case3:P2=0xbf;dis_r++;break;case4:P2=0x7f;dis_r++;break;default:dis_r=0;P2=0xff;}TH1=0xfe;TL1=0x0c;}續(xù)前頁(yè):如何加入按鍵校時(shí)程序并用Proteus軟件仿真如何加入按鍵校時(shí)程序并用Proteus軟件仿真含校時(shí)功能的數(shù)字電子鐘完整C語(yǔ)言源程序代碼#include<AT89X52.h>unsignedcharcodedis_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedchardatadis[4];unsignedcharsec=0,min=59,hou=22,cou=0,sansuo_flag=0,dis_r=0;unsignedcharint0_flag,int1_flag;//以下10ms延時(shí)函數(shù)///voiddelay10ms(void){unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}//以下為主函數(shù)///voidmain(void){P0=0x00;P2=0xff;TMOD=0x11;TH0=0xec;TL0=0x78;//T0十毫秒定時(shí)

TH1=0xfe;TL1=0x0c;//T1一毫秒定時(shí)碼EA=1;EX0=1;EX1=1;IT0=1;IT1=1;ET0=1;ET1=1;TR0=1;TR1=1;含校時(shí)功能的數(shù)字電子鐘完整C語(yǔ)言源程序代碼#include<續(xù)前頁(yè):while(1){//先判斷是否有分鐘校時(shí)鍵按下//if(int0_flag==1){EX0=0;int0_flag=0;delay10ms();if(P3_2==0){min++;EX0=1;if(min==60){min=0;}}}//再判斷是否有小時(shí)校時(shí)鍵按下//if(int1_flag==1){EX1=0;int1_flag=0;delay10ms();if(P3_3==0){hou++;EX1=1;if(hou==24){hou=0;}}}}}續(xù)前頁(yè):續(xù)前頁(yè):voidint0(void)interrupt0

//外部中斷0函數(shù)//{int0_flag=1;}voidtime0(void)interrupt1//定時(shí)器0中斷函數(shù)//{cou++;if(cou==50)sansuo_flag=~sansuo_flag;if(cou==100){cou=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hou++;if(hou==24){hou=0;}}}}TH0=0xec;TL0=0x78;}續(xù)前頁(yè):續(xù)前頁(yè):voidint1(void)interrupt2//外部中斷1函數(shù)//{int1_flag=1;}//以下為定時(shí)器1中斷函數(shù)//voidtime1(void)interrupt3{dis[0]=min%10;dis[1]=min/10;dis[2]=hou%10;dis[3]=hou/10;switch(dis_r){case0:P2=0xef;P0=dis_code[dis[dis_r]];dis_r++;break;case1:P2=0xdf;P0=dis_code[dis[dis_r]];dis_r++;break;case2:P2=0xbf;if(sansuo_flag==0){P0=dis_code[dis[dis_r]]|0x80;}else{P0=dis_code[dis[dis_r]];}dis_r++;break;case3:P2=0x7f;P0=dis_code[dis[dis_r]];dis_r++;break;default:dis_r=0;P2=0xff;}TH1=0xfe;TL1=0x0c;}續(xù)前頁(yè):(11)任務(wù):PC機(jī)與單片機(jī)通信要求:?jiǎn)纹瑱C(jī)串口通信的應(yīng)用,通過(guò)串口,電腦和單片機(jī)系統(tǒng)進(jìn)行通信。電腦作為上位機(jī),向下位機(jī)單片機(jī)系統(tǒng)發(fā)送十六進(jìn)制或者ASCLL碼,單片機(jī)系統(tǒng)接收后,用LED顯示接收到的數(shù)據(jù)和向上位機(jī)發(fā)回原樣數(shù)據(jù)。(11)任務(wù):PC機(jī)與單片機(jī)通信要求:?jiǎn)纹瑱C(jī)串口通信的應(yīng)用,單片機(jī)串口相關(guān)知識(shí)回顧(1)MCS-51串行口的原理結(jié)構(gòu)圖

單片機(jī)串口相關(guān)知識(shí)回顧(1)MCS-51串行口的原理結(jié)構(gòu)圖單片機(jī)串口相關(guān)知識(shí)回顧(2)串行口控制寄存器SCON

SM0SM1SM2RENTB8RB8TIRI

D7D6D5D4D3D2D1D0

SMODGF1GF0PDIDL

D7D6D5D4D3D2D1D0

(3)特殊功能寄存器PCON

單片機(jī)串口相關(guān)知識(shí)回顧(2)串行口控制寄存器SCONSM單片機(jī)串口相關(guān)知識(shí)回顧(4)串口通信的波特率

對(duì)于方式0,波特率是固定的,為單片機(jī)時(shí)鐘的1/12,即fosc/12。對(duì)于方式2,波特率有兩種可供選擇,即fosc/32和fosc/64。對(duì)應(yīng)于以下公式:

波特率=fosc×(2^SMOD)/64對(duì)于方式1和方式3,波特率都由定時(shí)器T1的溢出率來(lái)決定,對(duì)應(yīng)于以下公式:

波特率=(2^SMOD/32)×(定時(shí)器T1的溢出率)

而定時(shí)器T1的溢出率則和所采用的定時(shí)器工作方式有關(guān),并可用以下公式表示:

定時(shí)器T1的溢出率=fosc/12×(2^n-X)單片機(jī)串口相關(guān)知識(shí)回顧(4)串口通信的波特率對(duì)于方式0,程序:#include<AT89X51.H>unsignedchardat;//用于存儲(chǔ)單片機(jī)接收發(fā)送緩沖寄存器SBUF里面的內(nèi)容sbitgewei=P1^3;//個(gè)位選通定義sbitshiwei=P1^2;//十位選通定義unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voidDelay(unsignedinttc)//延時(shí)程序{while(tc!=0){unsignedinti;for(i=0;i<100;i++);tc--;}}voidLED()//LED顯示接收到的數(shù)據(jù)(十進(jìn)制){shiwei=0;P0=table[dat/10];Delay(5);程序:續(xù)前頁(yè):shiwei=1;gewei=0;P0=table[dat%10];Delay(5);gewei=1;}voidInit_Com(void)//功能:串口初始化,波特率9600,方式1{TMOD=0x20;PCON=0x00;SCON=0x50;TH1=0xFd;TL1=0xFd;TR1=1;}續(xù)前頁(yè):續(xù)前頁(yè):voidmain()//實(shí)現(xiàn)接收數(shù)據(jù)并把接收到的數(shù)據(jù)原樣發(fā)送回去///////{Init_Com();//串口初始化while(1){if(RI)//掃描判斷是否接收到數(shù)據(jù),{dat=SBUF;//接收數(shù)據(jù)SBUF賦與datRI=0;//RI清零(必須用軟件清零)SBUF=dat;//再原樣把數(shù)據(jù)發(fā)送回去}LED();//顯示接收到的數(shù)據(jù)}}續(xù)前頁(yè):(12)任務(wù):數(shù)模轉(zhuǎn)換器ADC0804的應(yīng)用(擴(kuò)展)要求:從ADC0804的通道IN+輸入0-5V之間的模擬量,通過(guò)ADC0804轉(zhuǎn)換成數(shù)字量在數(shù)碼管上以十進(jìn)制形成顯示出來(lái)。(12)任務(wù):數(shù)模轉(zhuǎn)換器ADC0804的應(yīng)用(擴(kuò)展)要求:從程序:#include<reg52.h>codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示段碼sbitint1=P3^3;//定義管腳功能sbitcs=P3^2;sbitwr=P3^6;sbitrd=P3^7;voidDelay(unsignedinttc)//顯示延時(shí)程序{while(tc!=0){unsignedinti;for(i=0;i<100;i++);tc--;}}unsignedcharadc0804(void)//讀AD0804子程序{unsignedcharaddata,i;rd=1;wr=1;int1=1;//讀ADC0804前準(zhǔn)備P1=0xff;//P1全部置一準(zhǔn)備cs=0;wr=0;wr=1;//啟動(dòng)ADC0804開(kāi)始測(cè)電壓while(int1==1);//查詢(xún)等待A/D轉(zhuǎn)換完畢產(chǎn)生的INT(低電平有效)信號(hào)rd=0;//開(kāi)始讀轉(zhuǎn)換后數(shù)據(jù)程序:續(xù)前頁(yè):i=i;i=i;//無(wú)意義語(yǔ)句,用于延時(shí)等待ADC0804讀數(shù)完畢addata=P1;//讀出的數(shù)據(jù)賦與addatard=1;cs=1;//讀數(shù)完畢return(addata);//返回最后讀出的數(shù)據(jù)}unsignedintdatpro(void)

//ADC0804讀出的數(shù)據(jù)處理{unsignedcharx;unsignedintdianyah,dianyal;

//用于存儲(chǔ)讀出數(shù)據(jù)的高字節(jié)和低字節(jié)unsignedintdianya=0;

//存儲(chǔ)最后處理完的結(jié)果注意數(shù)據(jù)類(lèi)型for(x=0;x<10;x++)

//將10次測(cè)得的結(jié)果存儲(chǔ)在dianya中{dianya=adc0804()+dianya;}dianya=dianya/10;

//求平均值dianyah=dianya&0xf0;

//屏蔽低四位dianyah=dianyah>>4;

//右移四位取出高四位dianyal=dianya&0x0f;

//屏蔽高四位取出低四位dianya=dianyal*20+dianyah*320;

//最后的結(jié)果是一個(gè)四位數(shù),便于顯示return(dianya);//返回最后處理結(jié)果}續(xù)前頁(yè):續(xù)前頁(yè):voidLed(){unsignedintdate;date=datpro();//調(diào)用數(shù)據(jù)處理最后結(jié)果P2=P2&0xef;P0=seg7code[date/1000]|0x80;//輸出個(gè)位數(shù)和小數(shù)點(diǎn)Delay(8);P2=P2|0xf0;P2=P2&0xdf;P0=seg7code[date%1000/100];//輸出小數(shù)點(diǎn)后第一位Delay(8);P2=P2|0xf0;P2=P2&0xbf;P0=seg7code[date%100/10];//輸出小數(shù)點(diǎn)后第二位Delay(8);P2=P2|0xf0;P2=P2&0x7f;P0=seg7code[date%10];//輸出小數(shù)點(diǎn)后第三位Delay(8);P2=P2|0xf0;}main(){while(1){Led();//只需調(diào)用顯示函數(shù)}}續(xù)前頁(yè):(13)任務(wù):模數(shù)轉(zhuǎn)換器DAC0832的應(yīng)用要求:用兩個(gè)按鍵通過(guò)單片機(jī)控制DAC0832的輸出,使OUT端可以輸出0—5V的幅值,頻率為1KHZ的鋸齒波和三角波兩種波形。通上電源后;按下INT1則輸出三角波,再按下INT0輸出鋸齒波。(13)任務(wù):模數(shù)轉(zhuǎn)換器DAC0832的應(yīng)用要求:用兩個(gè)按鍵[實(shí)驗(yàn)原理]DAC0832是8位全MOS中速D/A轉(zhuǎn)換器,采用R—2RT形電阻解碼網(wǎng)絡(luò),轉(zhuǎn)換結(jié)果為一對(duì)差動(dòng)電流輸出,轉(zhuǎn)換時(shí)間大約為1us。使用單電源+5V―+15V供電。參考電壓為-10V-+10V。在此我們直接選擇+5V作為參考電壓。DAC0832有三種工作方式:直通方式,單緩沖方式,雙緩沖方式;在此我們選擇直通的工作方式,將XFER、WR1、WR2和CS管腳全部接數(shù)字地。管腳8接參考電壓,在此我們接的參考電壓是+5V。那么經(jīng)過(guò)第一級(jí)運(yùn)放后,輸出電壓將是-5V-0V,在經(jīng)過(guò)第二級(jí)運(yùn)放反相放大1倍以后將可以輸出0V—5V了。再控制P1口輸出數(shù)據(jù)有規(guī)律的變化將可以產(chǎn)生三角波,鋸齒波,梯型波等波形了。[實(shí)驗(yàn)原理]程序:#include<AT89X51.H>unsignedcharkeycnt=0;//波形標(biāo)志unsignedchartcnt=0;//鍵值判斷bitsjz=0;//產(chǎn)生三角波時(shí)上升、下降用到的標(biāo)志voiddelayl()

//延時(shí)子程序{unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}voidKEY()

//按鍵掃描程序{if(P3_2==0){delayl();//延時(shí)跳過(guò)按下時(shí)的抖動(dòng)if(P3_2==0){keycnt=0;

//定時(shí)器產(chǎn)生鋸齒波標(biāo)志TR0=0;

//暫時(shí)停止波形輸出TH0=0x256-40;

//對(duì)TH0TL0賦值TL0=0x256-40;TR0=1;

//開(kāi)始定時(shí),產(chǎn)生鋸齒波程序:續(xù)前頁(yè):while(P3_2==0);//如果一直按著鍵,則等待鍵松開(kāi)delayl();//延時(shí)跳過(guò)松開(kāi)后的抖動(dòng)}}if(P3_3==0){delayl();//延時(shí)跳過(guò)按下時(shí)的抖動(dòng)if(P3_3==0){keycnt=1;//定時(shí)器產(chǎn)生三角波標(biāo)志TR0=0;//暫時(shí)停止波形輸出TH0=0x256-40;//對(duì)TH0、TL0賦值TL0=0x256-40;TR0=1;//開(kāi)始定時(shí)產(chǎn)生三角波}while(P3_2==0);//如果一直按著鍵,則等待松鍵開(kāi)delayl();//延時(shí)跳過(guò)松開(kāi)后的抖動(dòng)}}續(xù)前頁(yè):續(xù)前頁(yè):voidt0(void)interrupt1using0//定時(shí)中斷服務(wù)函數(shù){if(keycnt==0)//產(chǎn)生鋸齒波{P0=tcnt;tcnt=+0x0a;//步進(jìn)0.2V/一次中斷if(tcnt==0xfb){tcnt=0;}}if(keycnt==1)//產(chǎn)生三角波{if(sjz==0){P0=tcnt;tcnt=+0x0a;//步進(jìn)0.2V/一次中斷if(tcnt==0xfa){sjz=1;}}if(sjz==1)續(xù)前頁(yè):續(xù)前頁(yè):{P0=tcnt;tcnt=-0x0a;if(tcnt==0){sjz=0;}}}}voidmain(void){TMOD=0x02;//定時(shí)器工作在方式2ET0=1;EA=1;while(1){KEY();}}續(xù)前頁(yè):(14)任務(wù):24C08的讀寫(xiě)操作要求:利用24C08斷電以后存儲(chǔ)的數(shù)據(jù)不消失的特點(diǎn),可以做一個(gè)斷電保護(hù)裝置。首先利用單片機(jī)做一個(gè)0—99秒的自動(dòng)計(jì)時(shí)器。然后隨機(jī)關(guān)斷電源,在通電以后計(jì)時(shí)器接著斷電前的狀態(tài)繼續(xù)計(jì)時(shí)。(14)任務(wù):24C08的讀寫(xiě)操作要求:利用24C08斷電以[實(shí)驗(yàn)原理——引腳圖][實(shí)驗(yàn)原理——引腳圖][實(shí)驗(yàn)原理——總線(xiàn)協(xié)議][實(shí)驗(yàn)原理——總線(xiàn)協(xié)議][實(shí)驗(yàn)原理——寫(xiě)周期時(shí)序和起始、停止時(shí)序][實(shí)驗(yàn)原理——寫(xiě)周期時(shí)序和起始、停止時(shí)序][實(shí)驗(yàn)原理——器件尋址][實(shí)驗(yàn)原理——器件尋址][實(shí)驗(yàn)原理——器件尋址][實(shí)驗(yàn)原理——器件尋址][實(shí)驗(yàn)原理——寫(xiě)操作]注意:I2C總線(xiàn)數(shù)據(jù)都是高位在前,低位在后!?。蹖?shí)驗(yàn)原理——寫(xiě)操作]注意:I2C總線(xiàn)數(shù)據(jù)都是高位在前,低位[實(shí)驗(yàn)原理——寫(xiě)操作][實(shí)驗(yàn)原理——寫(xiě)操作][實(shí)驗(yàn)原理——讀操作][實(shí)驗(yàn)原理——讀操作][實(shí)驗(yàn)原理——讀操作][實(shí)驗(yàn)原理——讀操作][實(shí)驗(yàn)原理——讀操作][實(shí)驗(yàn)原理——讀操作]程序:#include<AT89X52.H>#include<stdio.h>#include<absacc.h>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharsec;//定義計(jì)數(shù)值,每過(guò)1秒,sec加1unsignedinttcnt;//定時(shí)中斷次數(shù)bitwrite=0;//寫(xiě)24C08的標(biāo)志;sbitgewei=P1^3;//個(gè)位選通定義sbitshiwei=P1^2;//十位選通定義/////////24C08讀寫(xiě)驅(qū)動(dòng)程序開(kāi)始////////////////////sbitscl=P3^6;//24c08SCLsbitsda=P3^7;//24c08SDAvoiddelay1(unsignedcharx){unsignedinti;for(i=0;i<x;i++);;}voidflash()

//延時(shí)2us{;;}程序:voidx24c08_init()//24c08初始化子程序{scl=1;flash();sda=1;flash();}voidstart()//啟動(dòng)I2C總線(xiàn){sda=1;flash();scl=1;flash();sda=0;flash();scl=0;flash();}voidstop()//停止I2C總線(xiàn){sda=0;flash();scl=1;flash();sda=1;flash();}voidwritex(unsignedcharj)//寫(xiě)一個(gè)字節(jié){unsignedchari,temp;temp=j;for(i=0;i<8;i++){temp=temp<<1;scl=0;flash();sda=CY;flash();scl=1;flash();}scl=0;flash();sda=1;flash();}voidx24c08_init()unsignedcharreadx()//讀一個(gè)字節(jié){unsignedchari,j,k=0;scl=0;flash();sda=1;for(i=0;i<8;i++){flash();scl=1;flash();if(sda==1)j=1;elsej=0;k=(k<<1)|j;scl=0;}flash();return(k);}voidclock()//I2C總線(xiàn)時(shí)鐘,確認(rèn)應(yīng)答信號(hào){unsignedchari=0;scl=1;flash();while((sda==1)&&(i<255))i++;scl=0;flash();}unsignedcharreadx()////////從24c08的地址address中讀取一個(gè)字節(jié)數(shù)據(jù)/////unsignedcharx24c08_read(unsignedcharaddress){unsignedchari;//先發(fā)寫(xiě)命令、寫(xiě)地址start();writex(0xa0);clock();writex(address);clock();//再發(fā)讀命令,讀數(shù)據(jù)start();writex(0xa1);clock();i=readx();stop();delay1(10);return(i);}//////向24c08的address地址中寫(xiě)入一字節(jié)數(shù)據(jù)info/////voidx24c08_write(unsignedcharaddress,unsignedcharinfo){EA=0;start();

溫馨提示

  • 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)論