藍橋杯單片機led流水燈學習

大一零基礎搞藍橋杯單片機組,多天以來,感覺上手挺難的,將自己的學習筆記拿出來分享
首先是建工程,我用的單片機是IAP15F2K61S2型號的,建的工程是IA89C52的
新建一個文檔,保存名稱是main.c,接下來一個曾經困擾我的一個設置就是hex文件的生成,我們可以這樣設置在這裏插入圖片描述
點上去後我開始寫第一個程序,點亮我的開發板上第一個led燈:


#include "reg52.h"
sbit led0 = P0^0;//定義led0,也就是P0的零號引腳
sbit led1 = P0^1;
int main(){
   
   
	P2=0xa0;P0=0x00;
	P2=0x80;P0=0xff;//初始化,暫時不講了,這裏意思是關掉蜂鳴器,P0口轉向led燈並全部關閉
	led0=0;//點亮led0,這裏1爲關閉0爲開
	while(1);
}

結果圖:在這裏插入圖片描述
下面講一下16進制
也就是滿16進一,對應關係:

1 1
2 2
3 3
4 4
10 A/a
11 B/b
12 C/c
13 D/d
14 E/e
15 F/f

然後下面再寫一個前面4個燈一起亮的程序
我們知道0,1代表的是燈亮滅,那麼四位的二進制數字代表的就是四個燈,也就是爲什麼使用十六進制
有很多器件也是8個引腳,所以0X**十六進制可以廣泛應用於單片機

#include "reg52.h"
sbit led0 = P0^0;
sbit led1 = P0^1;
int main(){
   
   
	P2=0xa0;P0=0x00;
	P2=0x80;P0=0xff;
	P0=0xf0;//11110000對應的燈
	while(1);
}

效果圖:
在這裏插入圖片描述

以此推的話P0=0x55就是偶數燈亮,0xaa就是奇數燈亮

接下來我們開始寫流水燈

先介紹一下延時的方法,要麼就是計數器,中斷程序,要麼就是延時函數
計數器和中斷程序後面寫,先講個最簡單的也就是延時函數,通過空循環,讓程序延時,原理就是處理每條語句cpu都需要一定時間處理,通過空循環那麼可以輕鬆延時
以下是計算循環次數的方法

1.先計算你單片機的振盪(時鐘)週期 T= 1/晶振(11.0592MHZ)

2.一次 i - -操作爲12T

3.忽略變量定義,上述延時函數共需時間:921z12T

4.帶入T:92112T*z 約爲 z ms

可以輕鬆計算。那麼實現延時流水燈的方法已經浮現了
以下是最初的程序

#include "reg52.h"
sbit led0 = P0^0;
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;
sbit led5 = P0^5;
sbit led6 = P0^6;
sbit led7 = P0^7;
void delayms(unsigned int ms){
   
   
	unsigned int i;
	while(ms--){
   
   
		for(i=0;i<628;i++);
	}
}
int main(){
   
   
	P2=0xa0;P0=0x00;
	P2=0x80;P0=0xff;
	while(1){
   
   
		led7=1;
		led0=0;
		delayms(500);
		led1=0;
		led0=1;
		delayms(500);
		led2=0;
		led1=1;
		delayms(500);
		led3=0;
		led2=1;
		delayms(500);
		led4=0;
		led3=1;
		delayms(500);
		led4=1;
		led5=0;
		delayms(500);
		led5=1;
		led6=0;
		delayms(500);
		led6=1;
		led7=0;
		delayms(500);
	}
}

效果視頻就不播放了
但是這個程序是不是有點冗長呢?
那麼看這樣
led0顯示是P0狀態是11111110
led1顯示是P0狀態是11111101
led2顯示是P0狀態是11111011

那麼我們想到左移右移運算符
我們只需要讓1往左移i位是不是就可以瞭然後取反就是我們所要的情況
下面上碼!








#include "reg52.h"
sbit led0 = P0^0;
sbit led1 = P0^1;
sbit led2 = P0^2;
sbit led3 = P0^3;
sbit led4 = P0^4;
sbit led5 = P0^5;
sbit led6 = P0^6;
sbit led7 = P0^7;
void delayms(unsigned int ms){
   
   
	unsigned int i;
	while(ms--){
   
   
		for(i=0;i<628;i++);
	}
}
int main(){
   
   
	unsigned int i;
	P2=0xa0;P0=0x00;
	P2=0x80;P0=0xff;
	while(1){
   
   
		for(i=0;i<8;i++){
   
   
			P0=~(1<<i);
			delayms(500);
		}
	}
}

好了,這樣流水燈就做出來了
今天就到這吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章