1. 程式人生 > >51微控制器學習之LED流水燈

51微控制器學習之LED流水燈

LED模組硬體原理圖
點亮LED的原理很簡單,只要讓P20-P27接入低電平即可。
在此主要記錄此實驗過程中遇到的問題和注意事項:

1.
#include “reg52.h”

#include “intrins.h”

typedef unsigned char u8;

#define led P2

void delay(u8 i)
{
while(i–);
}
void main()
{
u8 i;
led=0xfe;
delay(50000);
while(1)
{
for(i=0;i<7;i++)
{
led=crol(led,1);
delay(50000);
}
for(i=0;i<7;i++)
{
led=cror

(led,1);
delay(50000);
}
}
}
這時實驗現象為所有的LED小燈同是點亮,沒有流水的效果。
解決方法:是“typedef unsigned char u8;”出了錯誤,經查閱,unsigned char 的取值範圍是0-255,unsigned int 的取值範圍是0-65535.而上面程式碼的delay()中出現了50000,超出了unsigned char的取值範圍,所以在定義delay函式時,要將“u8 i”改為“u16 i”.這樣就可以實現流水的效果了。
2.
延時函式,i=1時,大約延時10us.
本實驗中i=50000;延遲大概是450000us(微妙)=450ms(毫秒)=0.45s
3.
crol
(led,1) //led=0xfe=1111 1110*
迴圈一次led=0xfd=1111 1101
迴圈二次led=0xfb=1111 1011
和位運算不一樣。
左移運算子(<<)規則
  按二進位制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。
語法格式:
需要移位的數字 << 移位的次數
  例如: 3 << 2,則是將數字3左移2位
計算過程:
3 << 2
  首先把3轉換為二進位制數字0000 0000 0000 0000 0000 0000 0000 0011,然後把該數字高位(左側)的兩個零移出,其他的數字都朝左平移2位,最後在低位(右側)的兩個空位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 1100,則轉換為十進位制是12。
數學意義:
在數字沒有溢位的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方。
右移運算子(>>)規則:
按二進位制形式把所有的數字向右移動對應位移位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1。
語法格式:
需要移位的數字 >> 移位的次數
  例如11 >> 2,則是將數字11右移2位
計算過程:
11的二進位制形式為:0000 0000 0000 0000 0000 0000 0000 1011,然後把低位的最後兩個數字移出,因為該數字是正數,所以在高位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 0010。轉換為十進位制是2。
數學意義:
右移一位相當於除2,右移n位相當於除以2的n次方。
總結:相當於右移2位就把這個二進位制數的最右側2位拿掉,在最左端補0;
左移2位就把這個二進位制數的最左端2位拿掉,在最右端補0.