STC89C52单片机 LED灯闪烁
LED閃爍
循環語句
循環語句
(1)while(條件表達式){語句}
只有當 while 后面圓括號內條件表達式的值為真時,程序才會重復執行花括號內語句,當條件表達式為假時則不執行花括號內語句。
(2)for([初值設定表達式];[循環條件表達式];[更新表達式])
{語句}
花括號內語句會被執行100次后才退出。
變量的定義
變量
變量是在程序執行過程中其值能不斷變化的量。在使用一個變量之前必須進行定義,用一個標識符作為變量名,并指出它的數據類型。
注意:C語言中每條語句必須用分號結束。
常用定義格式如下:
數據類型 變量名;
例如:
變量作用域
全局變量:在函數體外定義的變量通常為全局變量,作用范圍: 從定義開始的整個程序
局部變量:在函數體內定義的變量通常為局部變量,作用范圍:函數體內
軟件延時
當單片機在處理某些事件的時候用戶希望它處理完后間隔一段時間再去處理下一個事件,這時就需要用到延時。
常用的延時方法:
- 軟件延時:優點使用簡單;缺點浪費CPU資源
- 定時器延時:需要操作內部寄存器,節省CPU資源
IO口與一個字節位的數據對應關系
如果把一個字節的數據賦值給一組10口,其中數據的最低位對應此組10口的最低位,數據的最高位對應此組10口最高位。
例如
把十六進制數0xfe賦值給P1口他們的對應關系如下圖所示
總結:
每個LED燈對應著 2進制位置 1111 1111
每次寫入程序需要通過十六進制數對變量進行賦值
例如:
點亮 LED2 LED3 LED5 的LED燈
需要 P1 = 0xe9;
對 0xe9 解析
在程序員計算器中
當轉為二進制后,單片機加載該程序,會根據二進制組對相應的LED燈進行點亮,1110 1001 從高到低排列,
-
1110 第一個 1 代表P1^7 1為高電平 所以不亮
-
1110 第二個 1 代表P1^6 1為高電平 所以不亮
-
1110 第三個 1 代表P1^5 1為高電平 所以不亮
-
1110 第四個 0 代表P1^4 0為低電平 所以燈亮
-
1001 第一個 1 代表P1^3 1為高電平 所以不亮
-
1001 第二個 0 代表P1^2 0為低電平 所以燈亮
-
1001 第三個 0 代表P1^1 0為低電平 所以燈亮
-
1001 第四個 1 代表P1^0 1為高電平 所以不亮
點亮 LED6 燈
需要打開程序員計算器 對 二進制位置 1101 1111 進行換算
對應的16進制為 DF
所以 P1 = 0xdf;
即可只點亮 LED6 燈
程序部分
1.使 LED6 燈閃爍
#include <reg52.h>unsigned int i; // 0~65535 全局變量void main(){ // main 函數自身會循環while(1){ // 一般在執行程序的時候需要 寫出一個while的循環體來執行代碼 // P1 = 0; // 點亮P1口8個LED // P1 = 0xe9; // 點亮 LED2 LED3 LED5燈P1 = 0xdf; // 點亮 LED6 燈i = 65535;while(i--); // 自定義的軟件延時P1 = 0xff; // 1111 1111 熄滅P1口 8個LED 不能直接使用 P1 = 1; 來熄滅8個LED燈i= 65535;while(i--);}}// while(1){ // P1 = 0; // P1 = 0xff; // 1111 1111 熄滅P1口 8個LED 不能直接使用 P1 = 1; 來熄滅8個LED燈 // } // 當去掉軟件延時器的時候,軟件在執行的過程中會不斷的循環,LED會反復的開啟和關閉,所以通過人眼是無法辨別出來的 // 但是與常開啟的LED相比亮度會相對較暗2.使 LED1 燈閃爍
#include <reg52.h>/*==================================== 函數 : delay(uint z) 參數 :z 延時毫秒設定,取值范圍0-65535 返回值 :無 描述 :12T/Fosc11.0592M毫秒級延時 ====================================*/void delay(unsigned int z){ // 毫秒級延時函數定義unsigned int x, y;for (x = z; x > 0; x--){for (y = 114; y > 0; y--){}} }void main(){ // main函數自身會循環delay(100);while(1){P1 = 0XFE; // 點亮 LED1 燈delay(100); // 延時 100毫秒 通過增加延時的時間或減少延時的時間,來控制燈的閃爍間隔 P1 = 0xff; // 關閉所有的LED 燈 delay(100); // 延時 100毫秒 通過增加延時的時間或減少延時的時間,來控制燈的閃爍間隔 } }3.使 LED1、3、5、7 燈亮,使 LED2、4、6、8 燈閃爍;
#include <reg52.h>void delay(unsigned int z){ // 毫秒級延時函數定義unsigned int x, y;for (x = z; x > 0; x--){for (y = 114; y > 0; y--){}} }void main(){ // main函數自身會循環delay(100);while(1){P1 = 0; // 0000 0000 // 使 LED1、2、3、4、5、6、7、8 燈亮delay(500); // 延時 500毫秒 通過增加延時的時間或減少延時的時間,來控制流水燈的速度 P1 = 0XAA; // 1010 1010 // 關閉 2、4、6、8 燈delay(500); // 延時 500毫秒 通過增加延時的時間或減少延時的時間,來控制流水燈的速度 } }總結
以上是生活随笔為你收集整理的STC89C52单片机 LED灯闪烁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 多项式求和
- 下一篇: STC89C52单片机 数码管静态显示