第一篇:單片機外部中斷實驗報告
實驗三 外部中斷
實驗報告
班級:
學號:
姓名:
教師:
一、實驗目的 1、掌握單片機外部中斷的原理及過程。
2、掌握單片機外部中斷程序的設計方法。
3、掌握單片機外部中斷時中斷方式的選擇方法。
二、實驗內容 如下圖所示,P3.2 設為輸入,P2 設為輸出位,連有 8 個發光二極管 D1~D8。每當發生外部中斷時,發光二極管以向下流水燈的方式點亮。分別選擇邊沿觸發外部中斷放是和電平觸發外部中斷方式兩種。
三、編程提示 1、P3 口是 8 位準雙向口,具有雙重功能:
第一功能和 P1 口一樣,作為輸入輸出口,也有字節操作和位操作兩種方式,每一位可分別定義為輸入或輸出;第二功能定義如下 :
P3.0
RXD 串行輸入口 P3.1
TXD 串行輸出口
P3.2
INT0 外部中斷 0 請求輸入線 P3.3
INT1 外部中斷 1 請求輸入線 P3.4
T0 定時器/計數器 T0 外部計數器脈沖輸入線 P3.5
T1 定時器/計數器 T1 外部計數器脈沖輸入線 P3.6
WR 外部數據存貯器寫脈沖輸出線 P3.7
RD 外部數據存貯器讀脈沖輸出線
2、各中斷服務程序入口地址:
外部中斷 0
03H 定時器/計數器 T1 溢出中斷
0BH 外部中斷 1
13H
定時器/計數器
1BH 串行口中斷
23H 3、外部中斷的產生條件 中斷允許寄存器 IE:
EA
ES ET1 EX1 ET0 EX0
(1)外部中斷源允許中斷(中斷 0:EX0=1;中斷 1:EX1=1)。
(2)CPU 開中斷(EA=1)。
(3)外部中斷方式 CPU 發出中斷申請。
4、外部中斷方式的選擇 控制 TCON:
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IT0 是選擇文字則外部中斷 0 請求(INT0)邊沿觸發方式或電平觸發方式的控制位。前一方式 IT0=1,后一方式 IT0=0。
IT1 是選擇外部中斷 1 請求(INT1)為邊沿觸發方式或電平觸發方式的控制位。前一方式IT1=1,后一方式 IT1=0。
當 8031 復位后,TCON 被清 0。
5、外部中斷電路 負脈沖作為中斷請求信號時,為了保證中斷的唯一性,必須加上消除開關抖動的電路或
者去抖動延時程序,保證每次只產生單脈沖,構成邊沿觸發方式外部中斷電路。邊沿觸發的最大優點在于不會丟失中斷。只要中斷請求負跳變的寬度大于 1 個機器周期,單片機就能夠采樣到中斷請求信號,單片機將采樣到的信號瑣存到中斷請求標志寄存器中,硬件自動置IE0 為 1,即使單片機暫時不響應,這個標志也不會丟失,只有在外部中斷響應之后,硬件才將 IE0 清除。
低電平觸發的外部中斷與邊沿觸發的外部中斷,其中斷過程基本相似。唯一不同在于中斷請求信號的保持與撤消。在邊沿觸發中,單片機 TCON 寄存器專門有一位作它的請求標志,當負跳變后,單片機將中斷請求標志 IE1(INT1 中斷為 IE1,INT0 中斷為 IE0)自動置1,由 IE1 請求中斷,在響應中斷時,又由單片機自動清除 IE1。但是對于電平觸發方式,單片機中沒有專門的請求標志,響應中斷時也不能自動清除請求信號。在實際應用中,常常是在單片機外增加一個觸發器作為中斷請求標志,當中斷請求發生時置觸發器為 0,使 INT1為低電平,在單片機響應這個中斷后,利用軟件(占用另一根 I/O 線,例如 P3.1)發出復位脈沖,使該觸發器置 1,撤消中斷請求。這種電路使請求中斷的低電平能夠保持足夠的時間,一直到中斷發生為止,因而不會丟失中斷請求。低電平的時間又不致太長,只要進入中斷服務程序,在返回之前,就撤消請求信號,因而也不會產生多余的中斷動作。
四、實驗器材 仿真器、目標系統實驗板、直流電源
五、實驗步驟 1、邊沿觸發式外部中斷 0 實驗(1)
P3.2 設為邊沿觸發方式,連接外部復位開關,編程使每次中斷流水燈向下移位一次,中斷程序中不延時去抖動,觀察結果。
(2)P3.2 設為邊沿觸發方式,連接外部復位開關,編程使每次中斷流水燈向下移位一次,中斷程序中采用延時去抖動,觀察結果。
(3)P3.3 設為邊沿觸發方式,連接外部 RS 觸發器硬件去抖動的開關,編程使每次中斷流水燈向下移位一次,中斷程序中不延時去抖動,觀察結果。
2、電平觸發式外部中斷實驗 P3.3 設為電平觸發方式,連接外部 RS 觸發器硬件去抖動的開關,編程使每次中斷流水燈向下移位一次,中斷程序中不延時去抖動,觀察結果。
六、C C 源程序清單
#include
#define uchar unsigned char
uchar i=0;uchar
numi[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay(uchar k);
void main(){
EA=1;
EX0=1;
IT0=1;
while(1)
{
if(EX0==0)
{
//delay(100);
IE0=0;
EX0=1;
}
} } void int0()interrupt 0
{
EX0=0;
P2=~numi[i];
i++;
if(i>8)
{
i=0;
} } void delay(uchar k){
uchar x,y,z;
for(x=k;x>0;x--)
for(y=20;y>0;y--)
for(z=250;z>0;z--);}
七、總結
1、邊沿觸發和電平觸發兩種方式中斷響應的原理與區別 邊沿觸發:當從高至低電平或從低至高電平轉變時,觸發產生;電平保持多久都只產生一次。所以,邊沿觸發適合與以負脈沖形式輸入的外部中斷請求。
電平觸發:那么在電平時間內中斷一直有效;因此如果在電平沒有恢復之前中斷程序就已經執行完成從而退出,那么會在退出后又再次進入中斷;但只要中斷沒有退出是不會重復觸發的。所以,電平觸發方式適合于外部中斷以電平輸入而且中斷服務能清除外部中斷源的情況。
2、實驗現象 1、(1)實驗現象是,按鍵一次就會跳過幾個燈,也就是說按鍵一次并不是向后移一位而是好幾位,這是因為按鍵沒有去抖動,所以會進入多次中斷導致。
1、(2)按鍵一次,燈就向下移一位,這是通過軟件去抖動之后,按鍵按下后延時一段時間,再來判斷中斷有沒有打開,所以按鍵一次只進入一次中斷。
1、(3)按鍵一次,燈就向下移一位,雖然沒有用按鍵去抖動,但是這個鍵在硬件上已經去抖,所以按鍵一次也是只進入一次中斷程序,所以會有這種現象。
2、(1)由于是電平觸發,所以在按下按鍵的時候,會有好多燈一起亮,比如低電平,在低電平這段時間里,會不斷地請求中斷,所以就會進入很多次中斷,在加上請求中斷的速度快和 LED 燈有一定的的余暉,所以肉眼看起來就好像燈全是亮的。
第二篇:51單片機中斷學習
51單片機中斷學習
一、中斷的概念
CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);
待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷
二、中斷源
在51單片機中有5個中斷源
中斷號優先級中斷源中斷入口地址
01(最高)外部中斷00003H12定時器0000BH
23外部中斷10013H
34定時器10018H
45串口總段0023H
三、中斷寄存器
單片機有10個寄存器主要與中斷程序的書寫控制有關
1.中斷允許控制寄存器IE
2.定時器控制寄存器TCON
3.串口控制寄存器SCON
4.中斷優先控制寄存器IP
5.定時器工作方式控制寄存器TMOD
6.定時器初值賦予寄存器(TH0/TH1,TL0/TL1)T
第三篇:單片機實驗報告
目錄
第一章單片機簡介....................................................2 第二章
實驗要求..................................................3 第三章實驗設備......................................................3 第四章實驗安排......................................................4 第五章實驗內容......................................................4
LED燈實驗.......................................................4 步進馬達試驗....................................................5 獨立按鍵控制LED實驗............................................7 矩陣鍵盤實驗....................................................9 靜態數碼管實驗.................................................12 動態數碼管實驗.................................................14 NE555脈沖發生器實驗(定時/計數器).............................16 RS232串口通信實驗(接收與發送)..................................21 第六章收獲體會.....................................................25
單片機實驗報告
第一章單片機簡介
單片機也被稱為微控制器(Microcontroller),是因為它最早被用在工業控制領域。單片機由芯片內僅有CPU的專用處理器發展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個芯片中,使計算機系統更小,更容易集成進復雜的而對體積要求嚴格的控制設備當中。INTEL的Z80是最早按照這種思想設計出的處理器,從此以后,單片機和專用處理器的發展便分道揚鑣。單片機是靠程序運行的,并且可以修改。通過不同的程序實現不同的功能,尤其是特殊的獨特的一些功能,這是別的器件需要費很大力氣才能做到的,有些則是花大力氣也很難做到的。一個不是很復雜的功能要是用美國50年代開發的74系列,或者60年代的CD4000系列這些純硬件來搞定的話,電路一定是一塊大PCB板!但是如果要是用美國70年代成功投放市場的系列單片機,結果就會有天壤之別!只因為單片機的通過你編寫的程序可以實現高智能,高效率,以及高可靠性!
單片機誕生于20世紀70年代末,經歷了SCM、MCU、SoC三大階段。
1.SCM即單片微型計算機(Single Chip Microcomputer)階段,主要是尋求最佳的單片形態嵌入式系統的最佳體系結構。“創新模式”獲得成功,奠定了SCM與通用計算機完全不同的發展道路。在開創嵌入式系統獨立發展道路上,Intel公司功不可沒。
2.MCU即微控制器(Micro Controller Unit)階段,主要的技術發展方向是:不斷擴展滿足嵌入式應用時,對象系統要求的各種外圍電路與接口電路,突顯其對象的智能化控制能力。它所涉及的領域都與對象系統相關,因此,發展MCU的重任不可避免地落在電氣、電子技術廠家。從這一角度來看,Intel逐漸淡出MCU的發展也有其客觀因素。在發展MCU方面,最著名的廠家當數Philips公司。
Philips公司以其在嵌入式應用方面的巨大優勢,將MCS-51從單片微型計算機迅速發展到微控制器。因此,當我們回顧嵌入式系統發展道路時,不要忘記Intel和Philips的歷史功績。
3.單片機是嵌入式系統的獨立發展之路,向MCU階段發展的重要因素,就是尋求
單片機實驗報告
應用系統在芯片上的最大化解決;因此,專用單片機的發展自然形成了SoC化趨勢。隨著微電子技術、IC設計、EDA工具的發展,基于SoC的單片機應用系統設計會有較大的發展。因此,對單片機的理解可以從單片微型計算機、單片微控制器延伸到單片應用系統。
MCS51系列微控制器應用廣泛,在家電、汽車甚至航空等領域都有其活躍的身影。然而,普通51系列微控制器內部資源有限,像我用Proteus構建微控制器虛擬實驗室選用的AT89C52只有三個定時器、一個全雙工的串行口和中斷控制,并且其數據處理能力有限,不適合對大量數據進行復雜分析和運算。
因此,在不重新選型(可選用SoC)的前提下,為實現我們所需要的功能,就需要進行外圍擴展。針對微控制器的特點,我們首先考慮串行擴展,因為微控制器的I/O引腳有限,并行擴展一則外圍芯片面積比較大,二則對抑制EMI不利。
第二章 實驗要求
1.學習Keil C51集成開發工具的操作及調試程序的方法,包括:仿真調試與脫機運行間的切換方法
2.熟悉TD-51單片機系統板及實驗系統的結構及使用
3.進行MCS51單片機指令系統軟件編程設計與硬件接口功能設
4. 學習并掌握Keil C51軟件聯機進行單片機接口電路的設計與編程調試
5.完成指定MCS51單片機綜合設計題
第三章實驗設備
1.HC600S-51單片機開發板 2.Keil C51 3.普中自動下載軟件
第四章 實驗安排
1.LED燈實驗
單片機實驗報告
2.步進馬達試驗
3.獨立按鍵控制LED實驗 4.矩陣鍵盤實驗 5.靜態數碼管實驗 6.動態數碼管實驗
7.NE555脈沖發生器實驗(定時/計數器)8.RS232串口通信實驗(接收與發送)
第五章 實驗內容
一、LED燈實驗
1.基本要求
利用位移循環指令實現LED燈的閃爍 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖
4.電路原理圖
單片機實驗報告
5.程序
#include
main(){unsigned int i;while(1)
{for(i=0,P0=1;i<4;i++){d(500);P0=(P0<<2);}}}
二、步進馬達試驗
1.基本要求
編程實現馬達的正反轉,調速等功能 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)
單片機實驗報告
圖一 圖二
4.電路原理圖
上圖圖二 5.程序
#include “reg52.h” #define speed 2 sbit PH1 = P1^0;
//定義管腳 sbit PH2 = P1^1;sbit I01 = P1^2;sbit I11 = P1^3;sbit I02 = P1^4;sbit I12 = P1^5;
void delay(int time);
void Go(){ //A
PH1 = 0;//PH1為0 則A線圈為反向電流
I01 = 0;I11 = 0;
//以最大電流輸出
PH2 = 0;//PH2為0 則B線圈為反向電流
I02 = 1;I12 = 1;
//輸出0 delay(speed);//圈為反向電流
I01 = 1;//輸出0 I11 = 1;
PH2 = 1;//PH2為1 則B線圈為正向電流
I02 = 0;//以最大電流輸出
I12 = 0;
delay(speed);//B PH1 = 1;
//PH1為1 則A線圈為
正向電流
I01 = 0;
//以最大電流輸出
I11 = 0;
PH2 = 1;//PH2為1 則B線圈為正
向電流
I02 = 1;//輸出0 I12 = 1;
delay(speed);
PH1 = 1;
//PH1為1 則A線圈為正向電流
I01 = 1;I11 = 1;
PH2 = 0;
//PH2為0 則B線圈為反向電流
I02 = 0;I12 = 0;delay(speed);}
void delay(int time){
int i,j;
for(j=0;j <= time;j++)
for(i =0;i <= 120;i++);}
void main(){
while(1)
{
Go();//步進電機運行
} }
單片機實驗報告
三、獨立按鍵控制LED實驗
1.基本要求
通過編程控制8個獨立按鍵分別控制8個LED燈的開關 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)
圖一 圖二
4.電路原理圖 上圖圖二 5.程序
#include
P1口
#define uchar unsigned char #define uint unsigned int
void Delayms(unsigned int c);
//延時10ms uchar Key_Scan();void main(void){
unsigned char ledValue, keyNum;
ledValue = 0x01;
while(1)
{
keyNum = Key_Scan();//掃描鍵
盤
switch(keyNum)
{
case(0xFE):
//返回按
鍵K1的數據
ledValue = 0x01;
break;
單片機實驗報告
case(0xFD):
ledValue = 0x02;
break;case(0xFB):
ledValue = 0x04;
break;case(0xF7):
ledValue = 0x08;
break;case(0xEF):
ledValue = 0x10;
break;case(0xDF):
ledValue = 0x20;
break;case(0xBF):
ledValue = 0x40;
break;case(0x7F):
ledValue = 0x80;
//返回按鍵K2的數據
//返回按鍵K3的數據
//返回按鍵K4的數據
//返回按鍵K5的數據
//返回按鍵K6的數據
//返回按鍵K7的數據
//返回按鍵K8的數據
break;default:
break;
}
GPIO_LED = ledValue;//點亮LED燈
}
}
uchar Key_Scan(void)//鍵盤掃描函數 { uchar i,n=0xff;
if(P1==0xff)goto Scan_r;//無鍵按
下,返回
goto Scan_r;Scan_1:
while(P1!=0xff);//等待鍵釋放
Delayms(10);Scan_r:
return n;}
void Delayms(uint x){
uint n;
for(;x>0;x--)
{
for(n=0;n<123;n++)
{;}
} }
四、矩陣鍵盤實驗
1.基本要求
編程由16個矩陣按鍵控制數碼管顯示相應的數值 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。
3.接線圖
單片機實驗報告
見下圖圖一
圖一 圖二
4.電路原理圖
見上圖圖二 5.程序
#include
uchar ScanKey(void);void Delayms(uint x);main(){ unsigned char ledValue;uchar i;ledValue = 0x01;loop: i = ScanKey();
switch(i)
{ case 0xee:
ledValue = ~0x3F;
break;
case 0xde:
ledValue = ~0x06;
break;
case 0xbe:
ledValue = ~0x5B;
break;
case 0x7e:
ledValue = ~0x4F;
break;
case 0xed:
ledValue = ~0x66;
break;
case 0xdd:
ledValue = ~0x6D;
break;
單片機實驗報告
case 0xbd:
ledValue = ~0x7D;
break;
case 0x7d:
ledValue = ~0x07;
break;
case 0xeb:
ledValue = ~0x7F;
break;
case 0xdb:
ledValue = ~0x6F;
break;
case 0xbb:
ledValue = ~0x77;
break;
case 0x7b:
ledValue = ~0x7C;
break;
case 0xe7:
ledValue = ~0x39;
break;
case 0xd7:
ledValue = ~0x5E;
break;
case 0xb7:
ledValue = ~0x79;
break;
case 0x77:
ledValue = ~0x71;
break;
}
GPIO_LED = ledValue;i=0;goto loop;}
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
uchar ScanKey(void)//鍵盤掃描函數 { uchar i,n=0xff;
P1=0xf0;
if(P1==0xf0)goto Scan_r;//無鍵按下,返回
for(i=0,P1=0xfe;i<4;i++)
{ if((P1&0xf0)!=0xf0)
{ Delayms(10);
if((P1&0xf0)!=0xf0)
{ n=
P1;
goto
Scan_1;}
}
P1=(P1<<1)+1;
//掃描下
一行
} goto Scan_r;Scan_1:
單片機實驗報告
P1=0xf0;while((P1&0xf0)!=0xf0);//等待鍵
釋放
Delayms(10);
Scan_r:
P1=0xff;return n;} }
五、靜態數碼管實驗
1.基本要求
編程使數碼管顯示字符0-F 2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線框圖(圖一)
圖一
單片機實驗報告
圖二
4.電路原理圖
見上圖圖二 5.程序
#include
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D, ~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){
unsigned int LedNumVal;//定義變量 while(1)
{
// 將字模送到P0口顯示
LedNumVal++;
P0 = LED7Code[LedNumVal%16];
Delayms(1000);
//調用延時程序
}
}
單片機實驗報告
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
六、動態數碼管實驗
1.基本要求
編程實現8個數碼管的動態掃描。通過P22、P23、P24控制3-8譯碼器來對數碼管進行位選,通過P0口經過573的驅動控制數碼管的段選,通過P13控制573的使能端,為低電平時573才會有輸出。2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)
圖一 圖二
單片機實驗報告
圖三
4.電路原理圖
見上圖圖
二、圖三 5.程序
#define uint unsigned int void Dsplay();void Delayms(uint x);uchar mDS[6];uchar code cDsCode[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main(){ uchar i;
for(i=0;i<6;i++)mDS[i]=i+1;
loop:
Dsplay();
goto loop;}
void Dsplay()//動態掃描顯示
{uchar i;
for(i=0,P2=0x01;i<6;i++)
{ P1=cDsCode[mDS[i]];//輸出段
Delayms(1000);
P2=P2<<1;
//選通下一位
}
P2=0x00;
//關閉位選通 }
void Delayms(uint x){uint n;for(;x > 0;x--)
{ for(n=0;n<123;n++)
{;}
} }
七、NE555脈沖發生器實驗(定時/計數器)
1.基本要求
2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖
4.電路原理圖
5.程序
#include
CYMOMETER
”};uchar code EN_CHAR2[16]={“FREQ:
HZ”};
單片機實驗報告
void TIMER_Configuration();//初始化定時器 ulong Freq;
//用來存放要顯示的頻率值 ulong TimeCount;//用于計算1S鐘的
void main(){ uchar i, freqValue[6];
LcdInit();TIMER_Configuration();for(i=0;i<16;i++){
LcdWriteData(EN_CHAR1[i]);}
LcdWriteCom(0xc0);//第二行顯示
for(i=0;i<16;i++){
LcdWriteData(EN_CHAR2[i]);}
while(1){
if(TR0==0)
//當計數器停下的時候,表明計數完畢
{
Freq = Freq + TL1;
//讀取TL的值
Freq = Freq +(TH1 * 256);//讀取TH的值
LcdWriteCom(0xc8);
//--求頻率的個十百千萬十萬位--//
freqValue[0]='0'+Freq%1000000/100000;
freqValue[1]='0'+Freq%100000/10000;
freqValue[2]='0'+Freq%10000/1000;
freqValue[3]='0'+Freq%1000/100;
freqValue[4]='0'+Freq%100/10;
freqValue[5]='0'+Freq%10;
for(i=0;i<5;i++)//從最高位開始查找不為0的數開始顯示(最低位為0顯示0)
{
if(freqValue[i]==0x30)
{
freqValue[i]=0x20;//若為0則賦值空格鍵
}
else
單片機實驗報告
{
break;
}
}
for(i=0;i<6;i++)
{
LcdWriteData(freqValue[i]);
}
Freq=0;//將計算的頻率清零
TH1=0;//將計數器的值清零
TL1=0;
TR0=1;//開啟定時器
TR1=1;//開啟計數器
} } }
void TIMER_Configuration(){ TMOD=0x51;TH0=0x3C;TL0=0xB0;ET0=1;ET1=1;EA=1;TR0=1;TR1=1;} void Timer0()interrupt 1 { TimeCount++;if(TimeCount==20)//計時到1S {
TR0=0;
TR1=0;
TimeCount=0;
}
//--12MHZ設置定時50ms的初值--// TH0=0x3C;TL0=0xB0;} void Timer1()interrupt 3 {
單片機實驗報告
//--進入一次中斷,表明計數到了65536--// Freq=Freq+65536;
}
#include“lcd.h”
void Lcd1602_Delay1ms(uint c)
//誤差 0us {
uchar a,b;for(;c>0;c--){
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
} #ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時 void LcdWriteCom(uchar com)
//寫入命令 { LCD1602_E = 0;
//使能
LCD1602_RS = 0;
//選擇發送命令
LCD1602_RW = 0;
//選擇寫入
LCD1602_DATAPINS = com;
//放入命令
Lcd1602_Delay1ms(1);//等待數據穩定
LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);
//保持時間
LCD1602_E = 0;} #else
void LcdWriteCom(uchar com)
//寫入命令 { LCD1602_E = 0;//使能清零
LCD1602_RS = 0;//選擇寫入命令
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = com;// Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);
單片機實驗報告
LCD1602_DATAPINS = com << 4;//發送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
//寫入數據 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//選擇輸入數據
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = dat;//寫入數據
Lcd1602_Delay1ms(1);
LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);
//保持時間
LCD1602_E = 0;} #else void LcdWriteData(uchar dat)
//寫入數據 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;
//選擇寫入數據
LCD1602_RW = 0;
//選擇寫入
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//寫入低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x38);//開顯示
單片機實驗報告
LcdWriteCom(0x0c);//開顯示不顯示光標
LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//設置數據指針起點 } #else void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x32);//將8位總線轉為4位總線
LcdWriteCom(0x28);//在四位線下的初始化
LcdWriteCom(0x0c);//開顯示不顯示光標
LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//設置數據指針起點 } #endif
八、RS232串口通信實驗(接收與發送)
1.基本要求
a.通過實驗了解串口的基本原理及使用,理解并掌握對串口進行初始化; b.使用串口調試助手(Baud 9600、數據位
8、停止位
1、效驗位無)做為上位機來做收發試驗;
c.利用串口調試助手中字符串輸入進行數據發送,接受窗口顯示收到的數據。2.實驗內容
在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖
單片機實驗報告
4.電路原理圖
5.程序
#include
LcdWriteData(ChCode[i]);} UsartConfiguration();while(1){
if(RI == 1)
//查看是否接收到數據
{
receiveData = SBUF;//讀取數據
單片機實驗報告
RI = 0;
//清除標志位
LcdWriteCom(0xC0);
LcdWriteData('0' +(receiveData / 100));
// 百位
LcdWriteData('0' +(receiveData % 100 / 10));// 十位
LcdWriteData('0' +(receiveData % 10));
// 個位
} } } void UsartConfiguration(){ SCON=0X50;
//設置為工作方式1 TMOD=0X20;//設置計數器工作方式2 PCON=0X80;
//波特率加倍
TH1=0XF3;
//計數器初始值設置,注意波特率是4800的TL1=0XF3;TR1=1;
//打開計數器 }
#include“lcd.h”
void Lcd1602_Delay1ms(uint c)
//誤差 0us {
uchar a,b;for(;c>0;c--){
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
} #ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時 void LcdWriteCom(uchar com)
//寫入命令 { LCD1602_E = 0;
//使能
LCD1602_RS = 0;
//選擇發送命令
LCD1602_RW = 0;
//選擇寫入
LCD1602_DATAPINS = com;
//放入命令
Lcd1602_Delay1ms(1);//等待數據穩定
LCD1602_E = 1;
//寫入時序
單片機實驗報告
Lcd1602_Delay1ms(5);
//保持時間
LCD1602_E = 0;} #else
void LcdWriteCom(uchar com)
//寫入命令 { LCD1602_E = 0;//使能清零
LCD1602_RS = 0;//選擇寫入命令
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4;//發送低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif
#ifndef LCD1602_4PINS
void LcdWriteData(uchar dat)
//寫入數據 { LCD1602_E = 0;//使能清零
LCD1602_RS = 1;//選擇輸入數據
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = dat;//寫入數據
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);
//保持時間
LCD1602_E = 0;} #else void LcdWriteData(uchar dat)
//寫入數據 { LCD1602_E = 0;
//使能清零
LCD1602_RS = 1;
//選擇寫入數據
LCD1602_RW = 0;//選擇寫入
LCD1602_DATAPINS = dat;
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);
單片機實驗報告
LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//寫入低四位
Lcd1602_Delay1ms(1);LCD1602_E = 1;
//寫入時序
Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif
#ifndef LCD1602_4PINS void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x38);//開顯示
LcdWriteCom(0x0c);//開顯示不顯示光標
LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//設置數據指針起點 } #else void LcdInit()
//LCD初始化子程序 { LcdWriteCom(0x32);//將8位總線轉為4位總線
LcdWriteCom(0x28);//在四位線下的初始化
LcdWriteCom(0x0c);//開顯示不顯示光標
LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏
LcdWriteCom(0x80);//設置數據指針起點 } #endif
單片機實驗報告
第六章 收獲體會
本次微控制器綜合設計基本上使用了所選微控制器的所有資源,進一步熟悉和加深了對中斷、定時器和串行通信的理解和使用。我覺得軟件實驗就是讓我們初學者熟悉keil的使用,然后復習下匯編的思想和掌握程序的流程,所以軟件實驗可以很快的完成,并且慢慢熟悉調試的強大功能。硬件設計中,仿真讓我很有感觸,感覺蠻好玩的,可以摒棄麻煩的實驗硬件自己在寢室玩而且不受硬件狀態的限制,即便出錯了也不會損壞。當然更重要的是這種好習慣,仿真完后再去在實驗板上驗證會比直接要來的確切而且便捷,至少不要老是去插拔線。在做實驗中在同學指導下我試用C語言來編寫程序,確實發現比匯編語言容易編寫也容易理解,以前的實驗還是有參考資料的習慣,現在什么都開始自己寫感覺還是很有成就感的,當然這是基于程序本身就那么幾行很容易編寫,也不是說參考不好。總而言之,這學期的單片機實驗還是收獲頗豐的。相信在以后的實驗學習實踐工作中都會有個潛移默化的作用的。
第四篇:單片機實驗報告
單片機實驗報告
一、實驗目的
1.熟練使用Keil、Protues兩款軟件 2.通過上機操作,增強個人動手實踐能力 3.加深對理論知識的理解
4.培養運用匯編語言進行初步編寫程序的能力
二、實驗內容
1.將片外RAM3050-306FH中數據轉移至片內70-8FH中。
要求:可以從Keil或Protues上看到RAM的數據轉移結果。2.設計一個外部中斷觸發流水燈系統:當外部中斷來臨時,啟動流水燈,即令P2口的LED輪流循環點亮。
要求:開發板或Prrotues演示
3.將片內存儲器80H中存放的BCD碼轉換為ASCII碼,要求使用表格查詢技術。
要求:在Keil或Protues上看到數據轉換結果。
4.各使用中斷方式和查詢方式設計一個方波發生器,頻率為50HZ。
要求:Protues使軟件間示波器顯示方波。
三、實驗程序
1.將片外RAM3050-306FH中數據轉移至片內70-8FH中
ORG 0000H AJMP MAIN 上電,轉向主程序
ORG 0030H 主程序入口
MAIN: MOV DPTR,#3050H 數據指針指向地址3050H MOV A,#04H 將立即數04H送A寄存器
MOV R0,#20H NEXT: MOVX @DPTR,A INC DPTR 數據指針DPTR自加一
DJNZ R0,NEXT 判斷是否跳轉到NEXT或繼續向下執行
MOV DPTR,#3050H MOV R0,#70H MOV R2,#20H NEXT1: MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 DJNZ R2,NEXT1
SJMP $ 等待
END 2.設計一個外部中斷觸發流水燈系統:當外部中斷來臨時,啟動流水燈,即令P2口的LED輪流循環點亮 ORG 0000H SJMP MAIN 上電,轉向主程序
ORG 0003H 外部中斷0向量入口
AJMP INSER ORG 0030H 主程序入口
MAIN: SETB EX0 SETB IT0
SETB EA CPUHERE: SJMP HERE ORG 0200H INSER: MOV R2,#08H MOV A,#01H NEXT: MOV P2,A LCALL DELAY RL A DJNZ R2,NEXT NEXT或繼續向下執行
RETI DELAY: MOV R3,#0FFH DEL2: MOV R4,#0FFH DEL1: NOP
允許外部中斷0中斷 選擇邊沿觸發方式 開中斷 等待中斷 設置循環次數 賦初值,設置高電平亮 將初值送往P2口 延時 左移一位
判斷循環次數,是否跳轉到中斷返回 延時程序 DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 3.將片內存儲器80H中存放的BCD碼轉換為ASCII碼,要求使用表格查詢技術 ORG 0000H LJMP MAIN ORG 0030H主程序起始地址 MAIN: MOV 80H,#05H 將立即數50H轉送內存單元80H MOV A,80H 將內存單元80H中的內容送寄存器A MOV DPTR,#TAB MOVC A,@A+DPTR A寄存器內容加指針偏移量后送A寄存器 MOV 80H,A RET TAB: DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H 4.1中斷方式產生50HZ方波
ORG 0000H
AJMP MAIN
ORG 0030H 主程序入口 MAIN: MOV TMOD,#10H 設置定時器工作模式為模式1 MOV TH1,#0D8H 裝入T1計數初值
MOV TL1,#0F0H
SETB ET1 開中斷
SETB EA CPU開中斷
SETB TR1 啟動定時器T1 HERE: SJMP HERE 等待中斷 ORG 001BH T1中斷向量地址
CLR TF1 將TF1清零
CPL P2.0 P2.0取反輸出
MOV TH1,#0D8H 重裝初值
MOV TH0,#0F0H
RETI;中斷返回
END 4.2 查詢方式產生50HZ方波
ORG 0000H
AJMP MAIN
ORG 0030H 主程序入口
MAIN: MOV TMOD,#10H 設置定時器的工作模式為模式1 SETB TR1 啟動定時器T1 LOOP: MOV TH1,#0D8H 裝入T1計數初值
MOV TH0,#0F0H JNB TF1,$ T1沒有溢出則等待
CLR TF1
產生溢出,清標志位
CPL P2.0 P2.0取反輸出
SJMP LOOP 循環
END
四、實驗結果截圖
1.2
3.4.1
4.2
第五篇:單片機實驗報告
實驗
四、中斷交通燈實驗
林立強
1000850116
一、實驗目的
1、了解MCS-51單片機的組成、中斷原理,中斷處理過程、外部中斷的中斷方式。
2、掌握中斷響應及處理的編程方法。
二、實驗原理
MCS-51的中斷系統中有5個中斷源:外部中斷INTO,INT1,定時器/計數器TO、T1中斷和串口UART中斷,它們對應不同的中斷矢量。如表:
IE是中斷允許寄存器,其中EXO,ETO,EX1,ET1,ES分別是上述5個中斷的允許控制位,EA位是中斷總允許位,每個中斷只有在相應中斷允許且總中斷也允許的情況下,才能得到中斷響應。80XX51的5個中斷都可以設為高低2個優先級,IP是中斷優先級寄存器,其中PXO,PTO,PX1,PT1,PS位分別對應5個中斷的優先級設置,置“1”時設為高優先級中斷,為“0”時是低優先級中斷。在有中斷嵌套要求時,低優先級中斷可被高優先級所中斷。當同一級的中斷同時到來時,先響應中斷矢量排在前面的中斷。
三、實驗電路
電路原理圖如下,所需元件為:AT89C51、SW-SPDT、LED-RED、LED-GREEN、LED-YELLOW、RES、TRAFFICLIGHTS
四、實驗內容
參照實驗電路,設計交通燈控制系統。模擬交通信號燈控制:一般情況下正常顯示,東西-南北交替放行,各方向通行時間為30秒。有救護車或警車到達時,兩個方向交通信號燈全為紅色,以便讓急救車或警車通過,設通行時間為10秒,之后交通恢復正常。用單次脈沖模擬急救車或警車申請外部中斷。
1、在生成HEX文件后,用Proteus軟件對電路圖進行計算機仿真;
2、程序下載到單片機實驗板上驗證;(實驗板數碼管的驅動程序見附件)。
五、程序流程圖
仿真圖:
緊急情況:
源程序:
ORG 0000H
AJMP START
ORG 0023H //串口中斷地址
AJMP SBR1
START:MOV TMOD,#00100000B
//定時器方式2
MOV TL1,#0FDH //9600bps/11.0592MHz
MOV TH1,#0FDH
SETB TR1
MOV SCON,#01100000B //方式1
MOV R0,#20H
MOV R1,#40H
ACALL SOUT
SJMP $
SBR1: JNB RI,SEND
ACALL SIN
SJMP NEXT SEND: ACALL SOUT NEXT: RETI
SOUT: MOV A,@R0
MOV C,P
CPL C
MOV ACC.7,C
INC R0
MOV SBUF,A
CLR TI
RET
SIN: MOV A,SBUF
MOV C,P
CPL C
ANL A,#7FH
MOV @R1,A
INC R1
CLR RI
RET
PLAY: MOV A,R7
MOV B,#10
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
// 0
A B C D E F
END