c语言跑马灯实验报告,单片机跑马灯实验
一、實驗目的
1、 熟悉HNIST-2型單片機系統相關硬件電路,程序下載方法;
2、 掌握采用匯編語言與C語言開發單片機系統的程序結構;
3、 掌握51系列單片機通用I/O口的使用。
二、實驗前準備
1、 完成作業3;
2、 根據實驗內容編寫好相關程序,并進行Proteus仿真。
三、實驗內容
實驗內容為3項,其中第1、2項必做。
1、基本的流水燈。
根據圖1電路,編寫一段程序,使8個發光二極管D1、D2、D3、D4、D5、D6、D7、D8順序(正序)點亮:先點亮D1,再點亮D2、D3……D8、D1……,循環點亮。每點亮一個LED,采用軟件延時一段時間。
2、簡單鍵控的流水燈。
不按鍵,按正序點亮流水燈;按下K1不松手,按倒序點亮流水燈,即先點亮D8,再順序點亮D7、D6……D1、D8……。松手后,又按正序點亮流水燈。
3、鍵控的流水燈。
上電,不點亮LED,按一下K1鍵,按正序點亮流水燈。按一下K2鍵,按倒序點亮流水燈,按一下K3鍵,全部關閉LED。
四、實驗原理圖
如圖3.1所示。
電路原理圖如圖3.1,AT89S52的P0.0~P0.7作為輸出連接8個發光二極管,輸出低電平0時對應發光二極管發光;由于發光二極管的導通電壓為1.7V,所以HNIST-2型實驗裝置在電源與二極管之間加一個阻值為1K限流電阻保護二極管。
AT89S52的P2.0、P2.1作為輸入連接2個按鍵K1、K2,若檢測到P2.0=0,則說明K1鍵按下。
圖3.1.png
五. 方案設計
概要設計:
A. 硬件設計
用stc89c52rc單片機在HNIST-2開發板上實驗,單片機P0.0到P0.7連接8個小燈泡,P2口P2.0到P2.3連接4個開關。
仿真電路圖.png
B. 軟件設計思想
1、基本的流水燈
軟件延時采用例題程序delay( j ),可調整延時時間。流水燈采用while(1)死循環保持,用循環左移函數crol(P0,1)控制流水燈流動。
2、簡單鍵控的流水燈。
根據P2.0口的狀態來判斷是否按下K1開關,用if和while()來保持流水燈循環工作,if判斷是否開關按下,然后點亮 D0或D7一個小燈泡,用while和循環左(右)移保持流水燈持續工作。
3、鍵控的流水燈
按一下鍵后馬上松手,所以需要設置一個變量a保留按鍵鍵值,寫一個單獨檢測開關狀態的函數,在每一次延時后檢測開關的狀態并將狀態保留在a中,然后根據a的值來實現不同的功能,功能實現和題2相似。
六、源代碼
1、基本的流水燈
#include "reg52.h"
#include
#define uchar unsigned char
#define uint unsigned int
void delay(uint i){ //延時函數
uchar t;
while(i--){
for(t=0;t<120;t++) ;
}
}
void main()
{
P0=0xfe; //亮一個小燈泡
while(1)
{
delay(500);
P0=_crol_(P0,1); //循環左移
}
}
2、簡單鍵控的流水燈。
#include "reg52.h"
#include
#define uchar unsigned char
#define uint unsigned int
sbit key=P2^0;
void delay(uint i){ //延時函數
uchar t;
while(i--){
for(t=0;t<120;t++) ;
}
}
void main()
{
while(1){
if(key==0){ //按住k1
P0=0xfe;
while(key==0){
delay(500);
P0=_crol_(P0,1);
}
}
if(key==1){ //k1沒有按下
P0=0x7f;
while(key==1){
delay(500);
P0=_cror_(P0,1);
}
}
}
}
3、鍵控的流水燈
#include "reg52.h"
#include
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^0; //k1按鍵
sbit key2=P2^1;//k2按鍵
sbit key3=P2^2;//k3按鍵
uint a=0;//記錄按鍵鍵值
void delay(uint i){ //延時
uchar t;
while(i--){
for(t=0;t<120;t++) ;
}
}
void key(){ //判斷哪一個按鍵被按并用a記錄
if(key1==0) a=1;
if(key2==0) a=2;
if(key3==0) a=3;
}
void main()
{
P0=0xff;
while(1){
key();
if(a==1){
P0=0xfe;
while(a==1){
key();
delay(500);
P0=_crol_(P0,1);
}
}
if(a==2){
P0=0x7f;
while(a==2){
key();
delay(500);
P0=_cror_(P0,1);
}
}
if(a==3){
P0=0xff;
}
}
}
七、實驗思考題
1、采用I/O口作為輸出口時要考慮哪些因素?為什么實驗裝置中LED要串聯一個電阻?
答:作為輸出口,要通過程序控制I/O口引腳的電平。LED是二極管,串聯電阻做限流,防止二極管被擊穿。
2、采用I/O口作為輸入口時要注意什么?鍵控的流水燈時為什么要在延時程序中檢測是否按鍵?
答:作為輸入口,要先將相應端口的電平置1才能準確讀取相應的狀態。鍵控的流水燈在延時程序中檢測是否按鍵是為了防止在延時過程中有鍵按下而導致未能檢測到,
3、為什么延時程序要做一個函數?
答:延時函數使用頻繁,做成一個函數方便調用。
八、實驗總結心得體會收獲
通過這一次的實驗,確實接觸到了許多新知識,首先就是單片機的工作原理和燒錄過程以及仿真軟件的使用,這是在這個實驗中能夠熟練掌握的,這個跑馬燈的實驗就是一個基礎的單片機實驗,實驗的過程中要解決流水燈的問題,以及按鍵和流水燈之間的配合,是將硬件和軟件結合的一次實驗,為了讓按鍵按下后流水燈依舊能持續循環的工作,我進行了多次調試,進一步理解了開關檢測和流水燈的循環移動,還有就是在項目三中,如何按一次鍵就實現一個功能的問題,讓我知道了將鍵值保存的方法,實驗很成功,收益匪淺。
總結
以上是生活随笔為你收集整理的c语言跑马灯实验报告,单片机跑马灯实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言pta按等级统计学生成绩,第九周作
- 下一篇: 山谷序列C语言,通达信 山谷独创 主升黑