《單片機C語言程序設計》課件第七部分 單片機實驗指導書_第1頁
《單片機C語言程序設計》課件第七部分 單片機實驗指導書_第2頁
《單片機C語言程序設計》課件第七部分 單片機實驗指導書_第3頁
《單片機C語言程序設計》課件第七部分 單片機實驗指導書_第4頁
《單片機C語言程序設計》課件第七部分 單片機實驗指導書_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

單片機實驗指導書實驗一.LED閃爍控制實驗二.按鍵控制LED亮滅實驗三.流水燈設計實驗八.串口通信目錄實驗四.基于靜態(tài)顯示的倒計時設計實驗七.基于PWM的電機轉速控制設計實驗五.基于動態(tài)顯示的計分牌設計實驗六.外部中斷實驗實驗九.簡易電壓表設計實驗十.基于液晶的數(shù)字鐘設計實驗一:LED的閃爍控制一、實驗目的

(1)單片機基本I/O口的驅動方式、特點等。

(2)KEILC軟件對程序進行編譯調試及燒錄軟件的使用方法。

(3)C語言基本語句的編寫,對I/O口的基本操作。二、實驗電路圖及實驗任務實驗任務:編寫程序控制單片機的P1.0輸出周期性的方波,用于實現(xiàn)LED的閃爍。三、實驗步驟(1)根據(jù)第二部分單片機開發(fā)環(huán)境,新建一個Proteus工程如圖7.1并保存。(2)新建KEIL工程,命名為“LED閃爍控制”并添加“LED閃爍控制.C”。(3)編寫程序并生成“LED閃爍控制.hex”,下載到單片機點擊運行觀察現(xiàn)象。(4)根據(jù)發(fā)揮部分修改程序,完成實驗。四、實驗程序#include<REGX51.H>sbitLED=P1^0;voiddelay(){unsignedinta=50000;while(a--);}voidmain(){while(1){ LED=!LED;delay();}}五、發(fā)揮部分(1)修改程序改變LED閃爍頻率。(2)添加多個LED,編程使其同時閃爍。實驗二:按鍵控制LED亮滅一、實驗目的(1)單片機基本I/O口的驅動方式、特點等。(2)按鍵的防抖動編程。(3)掌握延時程序的編寫。二、實驗電路圖及實驗任務實驗任務:編寫程序當單片機的P1.7低電平時,控制P1.0取反。三、實驗步驟(1)新建一個Proteus工程如圖7.2并保存。(2)新建KEIL工程,命名為“按鍵控制LED亮滅”并添加“按鍵控制LED亮滅”。(3)編寫程序并生成“按鍵控制LED亮滅.hex”,下載到單片機點擊運行觀察現(xiàn)象。(4)將程序中的“while(KEY==0);”刪掉并重新下載,點擊運行長按按鍵觀察現(xiàn)象。根據(jù)發(fā)揮部分修改程序,完成實驗。四、實驗程序#include<REGX51.H>sbitLED=P1^0;sbitKEY=P1^7;#definedelay_time1000voiddelay(unsignedinta)voiddelay(unsignedinta){while(a--);}voidmain(){ while(1) { if(KEY==0)//按鍵檢測; { delay(delay_time);//防抖動; if(KEY==0)LED=!LED; while(KEY==0); } }}

五、發(fā)揮部分

(1)修改程序,每次按鍵按下后LED亮的時間比滅的時間長一倍。

(2)修改程序,每次按鍵按下后LED閃爍10次。實驗三:流水燈設計一、實驗目的(1)單片機基本I/O口的驅動方式、特點等。(2)掌握for、if語句的使用。(3)C語言基本語句的編寫,對I/O口基本操作。二、實驗電路圖及實驗任務實驗任務:編寫程序使P1的LED燈實現(xiàn)流水效果。三、實驗步驟(1)新建一個Proteus工程如圖7.3并保存。(2)新建KEIL工程,命名為“流水燈”并添加“流水燈.C”。(3)編寫程序并生成“流水燈.hex”,下載到單片機點擊運行觀察現(xiàn)象。四、實驗程序方法一:#include<REGX51.H>#definedelay_time50000voiddelay(unsignedinta){while(a--);}//主函數(shù)voidmain(){while(1) { P1=0XFE;delay(delay_time); P1=0XFD;delay(delay_time); P1=0XFB;delay(delay_time); P1=0XF7;delay(delay_time); P1=0XEF;delay(delay_time); P1=0XDF;delay(delay_time); P1=0XBF;delay(delay_time); P1=0X7F;delay(delay_time); }}方法二:#include<REGX51.H>#definedelay_time50000voiddelay(unsignedinta){while(a--);}voidmain(){unsignedchari,j; while(1) {j=0XFE;for(i=0;i<8;i++){P1=j;j=(j<<1)|0x01;delay(delay_time);}}}五、發(fā)揮部分(1)修改程序改變LED流水方向。(2)修改程序讓LED自動改變流水方向。實驗四:基于靜態(tài)顯示的倒計時設計一、實驗目的(1)掌握數(shù)碼管的電路連接方法。(2)了解數(shù)組的使用。(3)掌握C語言中自加、自減指令。二、實驗電路圖及實驗任務實驗任務:編寫程序實現(xiàn)P1的數(shù)碼管從9自減到0。三、實驗步驟(1)新建一個Proteus工程如圖7.4并保存。(2)新建KEIL工程,命名為“基于靜態(tài)顯示的倒計時設計”并添加“基于靜態(tài)顯示倒計時 顯示.C”。(3)編寫程序生成“基于靜態(tài)顯示的倒計時設計.hex”,下載到單片機點擊運行觀察現(xiàn)象。四、實驗程序方法一:#include<REGX51.H>#definedelay_time50000voiddelay(unsignedinta){while(a--);}voidmain(){ while(1) { P1=0X6f;delay(delay_time); P1=0X7f;delay(delay_time); P1=0X07;delay(delay_time); P1=0X7d;delay(delay_time); P1=0X6d;delay(delay_time); P1=0X66;delay(delay_time); P1=0X4f;delay(delay_time); P1=0X5b;delay(delay_time); P1=0X06;delay(delay_time); P1=0X3f;delay(delay_time); }}方法二:#include<REGX51.H>#definedelay_time50000unsignedcharcodenumtab[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};voiddelay(unsignedinta){while(a--);}voidmain(){ chari=9;//定義有符號字符型i; while(1) { P1=numtab[i--]; if(i<0)i=9;//判斷i是否小于0; delay(delay_time); }}五、發(fā)揮部分(1)修改程序讓數(shù)碼管從0加到9。(2)修改電路和程序實現(xiàn)按鍵控制數(shù)碼管加減。實驗五:基于動態(tài)顯示的計分牌設計一、實驗目的(1)掌握動態(tài)顯示的原理。(2)掌握動態(tài)顯示數(shù)碼管的硬件電路。(3)復習按鍵控制程序的編寫。二、實驗電路圖及實驗任務實驗任務:通過單片機P3.0和P3.1的按鍵控制P1端口上的數(shù)碼管顯示內容的加減。三、實驗步驟

(1)新建一個Proteus工程如圖7.5并保存。

(2)新建KEIL工程,命名為“基于靜態(tài)顯示的倒計時設計”并添加“基于動態(tài)顯示的計分牌設計.C”。

(3)編寫程序生成“基于動態(tài)顯示的計分牌設計.hex”,下載到單片機點擊運行觀察現(xiàn)象。四、實驗程序#include<REGX51.H>#defineseg_dataP1#definedelay_time1000//現(xiàn)實中此值要修改。#definedelay_display1000sbitkey_add=P2^0;sbitkey_reduce=P2^1;unsignedcharscore;unsignedcharcodenumtab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};voiddelay(unsignedinta){ while(a--);}voidkey_scan(){if(key_add==0)//加1;{delay(delay_time);if(key_add==0){if(score>=99)score=99;elsescore++; }while(key_add==0);}if(key_reduce==0)//減1{delay(delay_time);if(key_reduce==0){if(score==0)score=0;elsescore--; }while(key_reduce==0);}}voiddisplay()//顯示函數(shù);{ seg_data=numtab[score/10]; P3_0=0;P3_1=1;//選通個位; delay(delay_display);P3_0=1;P3_1=1;}P3_0=1;P3_1=1;//消影處理; seg_data=numtab[score%10]; P3_0=1;P3_1=0;//選通十位;delay(delay_display); P3_0=1;P3_1=1;}voidmain(){ while(1) {key_scan();//調用函數(shù); display(); }五、發(fā)揮部分

(1)修改電路和程序,多加兩個按鍵和兩位數(shù)碼管,做甲乙兩個計分牌。

(2)思考:當長按按鍵時數(shù)碼管為什么顯示不正常。實驗六:外部中斷實驗一、實驗目的(1)掌握外部中斷的工作原理。(2)掌握外部中斷相關寄存器的設置。(3)掌握外部中斷服務函數(shù)的編程。二、實驗電路圖及實驗任務實驗任務:開啟單片機外部中斷0(低電沿觸發(fā)),圖7.6中采用光敏電阻和NPN三極管觸發(fā)外部中斷0。一般情況下P0的數(shù)碼管從0到9加1循環(huán)顯示,當外部中斷觸發(fā)后,顯示停止加循環(huán)加1,當外部中斷0服務執(zhí)行完且外部中斷撤銷后數(shù)碼管恢復循環(huán)顯示。三、實驗步驟(1)新建一個Proteus工程如圖7.6并保存。(2)新建KEIL工程,命名為“外部中斷實驗”并添加“外部中斷實驗.C”。(3)編寫程序生成“外部中斷實驗.hex”,下載到單片機點擊運行觀察現(xiàn)象。四、實驗程序#include<REGX51.H>unsignedcharcodenumtab[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};#definedelay_time50000sbitled=P0^0;voiddelay(unsignedinta){ while(a--);}voidinit(){IT0=0;//電平觸發(fā);EX0=1;//使能外部中斷;EA=1;//開啟總中斷開關;}voidmain(){ unsignedchari; init(); while(1) { for(i=0;i<=9;i++) {P1=numtab[i]; delay(delay_time);}}}voidexternal_interrupt()interrupt0{led=!led;delay(50000);}五、發(fā)揮部分

(1)將外部中斷的觸發(fā)方式改為下降沿觸發(fā),執(zhí)行程序觀察現(xiàn)象。

(2)將EX0或EA賦值為0后,執(zhí)行程序觀察現(xiàn)象。

(3)修改程序和電路,將外部中斷0改變外部中斷1。實驗七:基于PWM的電機轉速控制設計一、實驗目的(1)掌握定時計數(shù)器中斷的工作原理。(2)掌握定時計數(shù)器中斷相關寄存器的設置。(3)掌握定時計數(shù)器中斷服務函數(shù)的編程。二、實驗電路圖及實驗任務實驗任務:開啟定時計數(shù)器0,使P2.2輸出2ms的矩形波。通過P1.5的按鍵控制矩形波的占空比。三、實驗步驟(1)新建一個Proteus工程如圖7.7并保存。(2)新建KEIL工程,命名為“基于PWM的電機轉速控制設計”并添加“基于PWM的電 機轉速控制設計.C”。(3)編寫程序生成“基于PWM的電機轉速控制設計.hex”,下載到單片機點擊運行觀察現(xiàn)象。四、實驗程序

#include<REGX51.H>

sbitUP=P1^5;//按鍵加速

sbitPWM_out=P2^2;用于PWM調速;

charPWM=5,counter;voiddelay(unsignedinta)//延時程序,用于按鍵防抖;{ while(a--);} voidINIT()//初始化定時計數(shù)器{TMOD=0X01;//設置定時計數(shù)器0工作于方式1;TH0=(65536-1000)>>8;TL0=(65536-1000);//定時1000us,即1ms;TR0=1;//啟動定時計數(shù)器0;ET0=1;//使能定時計數(shù)器0中斷;EA=1;//中斷總開關;}voidkey_scan()//按鍵掃描程序;{if(!UP){delay(1000);//防抖;if(!UP)//加快轉速;{PWM++;if(PWM>9)PWM=0;//轉速10級;}while(!UP);}}voidmain(){INIT();//調用初始化函數(shù),設置定時計數(shù)器0的工作狀態(tài);while(1){key_scan();//調用鍵盤掃描函數(shù);}}voidTimer0()interrupt1//定時計數(shù)器0中斷服務函數(shù);{TH0=(65536-1000)/256;TL0=(65536-1000)%256;counter++;//counter每1ms自加1;if(counter>=10){counter=0;}if(counter<PWM)PWM_out=1;//占空比調節(jié);if(counter>=PWM)PWM_out=0;}

五、發(fā)揮部分

(1)添加硬件電路,增加一個按鍵用于減少PWM占空比。修改程序并執(zhí)行程序觀察現(xiàn)象。

(2)修改程序,將定時計數(shù)器0改變定時計數(shù)器1。

(3)增加一個靜態(tài)顯示電路和程序用于指示電機轉速等級。實驗八:串口通信一、實驗目的(1)掌握定時串口中斷的工作原理。(2)掌握定時計數(shù)器和串口中斷相關寄存器的設置。(3)掌握串口中斷服務函數(shù)的編程。二、實驗電路圖及實驗任務實驗任務:開啟單片機串口中斷,波特率設為9600bps,并發(fā)送字符串到終端顯示。三、實驗步驟

(1)新建一個Proteus工程如圖7.8并保存。雙擊串口VIRTUALTERMINAL模塊,將波特率 設為9600bps、8位數(shù)據(jù)、無奇偶校驗、停止位1位(其它參數(shù)默認)。

(2)新建KEIL工程,命名為“串口中斷”并添加“串口中斷.C”。

(3)編寫程序生成“串口中斷.hex”,下載到單片機點擊運行觀察現(xiàn)象。四、實驗程序

#include<REGX51.H>#definelegth23//unsignedcharnum[]={"guilinuniversityofelectronictechnology"};unsignedcharnum[legth]={"Mynameisyejunming."};voiddelay(unsignedinta){while(a--);}voidINIT(){TMOD=0X20;//設置定時計數(shù)器1工作于方式2;TR1=1;TH1=0Xfd;TL1=0Xfd;//波特率為9600bpsSCON=0X40;//方式1,REN=0;ES=1; //使能串口中斷;EA=1; //中斷總開關開啟。}voidmain(){unsignedchari;INIT();while(1){for(i=0;i<legth;i++){SBUF=num[i];delay(1000);//等待;}while(1);// 停止發(fā)送;}}voidSerial()interrupt4{TI=0;//清零TI;}五、發(fā)揮部分(1)將學號循環(huán)發(fā)送到顯示端。(2)設置波特率為4800bps。(3)使用查詢法清零TI。實驗九:簡易電壓表設計一、實驗目的(1)復習動態(tài)顯示的電路和編程。(2)了解AD轉換的工作原理和編程。(3)了解SPI協(xié)議二、實驗電路圖及實驗任務實驗任務:將12位模數(shù)轉換芯片TLC2543轉換二進制數(shù)據(jù)(0-5v)進行處理后,并將實際電壓值顯示到2位動態(tài)數(shù)碼管上。三、實驗步驟(1)新建一個Proteus工程如圖7.9并保存。(2)新建KEIL工程,命名為“簡易電壓表設計”并添加“簡易電壓表設計.C”。(3)編寫程序生成“簡易電壓表設計.hex”,下載到單片機點擊運行觀察現(xiàn)象。四、實驗程序#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};sbitSDO=P1^3;sbitSDI=P1^4;sbitCS=P1^5;sbitCLK=P1^6;sbitEOC=P1^7;unsignedintad;floatvotage;//必須是浮點型;voiddelay(){unsignedinta=500;while(a--);}voiddisplay(){P2=num[ad/1000];//顯示模擬電壓P2_7=1;//小數(shù)點P3_0=0;P3_1=1;delay();P3_0=1;P3_1=1;//消影處理;P2=num[ad%1000/100];P3_0=1;P3_1=0;delay();P3_0=1;P3_1=1;}unsignedintread_ad(unsignedcharchannel)//AD轉換函數(shù);{ unsignedchari; unsignedintad=0; unsignedintad_value;unsignedcharCH_PORT; CS=0; CLK=0; CH_PORT=(channel<<4)|0x0c; for(i=0;i<16;i++) { if(SDO)ad|=0x01; SDI=(bit)(CH_PORT&0x80); CLK=1; CLK=0; CH_PORT<<=1; ad<<=1; }CS=1; ad_value=ad>>1; return(ad_value);}voidmain(){while(1){ votage=read_ad(0)/4095.0;//計算真實電壓值;ad=votage*5000;//計算顯示值;display();}}五、發(fā)揮部分(1)添加硬件電路和程序將顯示電壓的精度提高到4位,并執(zhí)行程序觀察現(xiàn)象。(2)修改程序,當電壓超過1.680V時LED閃爍。(3)將AD進行16次采樣并求平均值后顯示。(4)將AD采樣后的數(shù)據(jù)進行四舍五入算法并顯示。實驗十:基于液晶的數(shù)字鐘設計一、實驗目的(1)了解液晶的工作原理。(2)復習定時計數(shù)器的原理及編程。(3)掌握數(shù)字鐘的工作原理。二、實驗電路圖及實驗任務實驗任務:在液晶上第一行顯示“Clock:”,第二行顯示時鐘“23:59”。開啟定時計數(shù)器0工作于方式1,定時20ms。設計一個數(shù)字鐘程序,并使“:”閃爍。三、實驗步驟(1)新建一個Proteus工程如圖7.10并保存。(2)新建KEIL工程,命名為“基于液晶的數(shù)字鐘設計”并添加“基于液晶的數(shù)字鐘設計.C”。(3)編寫程序生成“基于液晶的數(shù)字鐘設計.hex”,下載到單片機點擊運行觀察現(xiàn)象。四、實驗程序#include<REGX51.H>#include<LCD1602.H>unsignedcharcount,hour=23,miniute=59,second;voiddisplay(){write_com(0x80);//第一行第1個地址;write_data('C');write_data('l');write_data('o');write_data('c');write_data('k');write_data(':');write_com(0xc6);write_data(num[hour/10]);write_data(num[hour%10]);if(second%2)write_data(':');

elsewrite_data('');write_data(num[miniute/10]);write_data(num[miniute%10]);}voidinit_interrupt(){TMOD=0X01;TH0=0X3C;

溫馨提示

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

評論

0/150

提交評論