前言
今天女朋友生日,除了禮物之外,一時想不到能給她點什么不一樣的,并且奈何自己不會寫詩,沒辦法從這方面入手。所以就用我會的方式吧。
既然最近自己琢磨琢磨單片機,也準備玩兒點陣LED的顯示實驗,這時我靈機一動,不如用LED做一個吧。(????????????老理工男了,怎么有的女朋友?)
好,下面就來看看我是怎么做的吧。
這篇文章(點擊閱讀)。二、硬件
這次用到的原件有80C51、MATRIX-8×8-RED、RESPACK-8,以及POWER和GROUND。
1.了解Matrix-8×8就像你需要了解女朋友
MATRIX-8×8-RED是8×8的紅色LED點陣(除了紅色還有其他顏色,也不止有8×8規格的),它共有16個引腳,8個陽極引腳控制列上的LED,8個陰極引腳控制行上的LED。通常我們把控制行上LED的八位二進制數稱為列值,控制列的二進制稱為列選信號。類似于數據與片選信號的關系。
上圖就是一個matrix-8×8的LED,我們無法從外觀上看出它的陰極和陽極,這時候我們就需要自己找出來。方法也很簡單,就是給它加電源。當列選端口為高電平,列值為低電平時LED點亮,利用這一特點,很容易找出陰極和陽極。如下圖:
我們只需要連接左邊或者右邊一種即可,這里為方便說明把兩端都測試了一遍。打開仿真,即可觀察到:
觀察左邊發現:上端輸入高電平的列有LED發光,說明上端是陽極(列選),下端是陰極(列值)。而右邊上端低電平下端高電平并沒有LED亮起,佐證了剛才的結論。
進一步,我們看到陰極輸入01111011,在一列中,從高到低是10000100B。發現了嗎?陰極低電平時對應的LED亮起,01111011就是列值。
2、正確地連接線路就像你需要以正確的方式讓她開心。
在對MATRIX8×8有了了解,測出了端口性質。接下來是連接電路。首先我們需要明確一點,80C51的P0口需要上拉電阻才能輸出高電平,具體原因是80C51芯片的設計結構,在這里就不解釋了(因為我也不甚了解,不獻丑了。有大佬可以評論區科普一下嗎?)
這里我們選用P0口做列選,用P2口作列值。于是得到如圖的電路圖:
其中,RESPACK-8是排阻,其八位端口接P0口,作為上拉電阻。Matrix-8×8-RED的陽極接P0口(列選),陰極接P2口(列值)。
三、軟件
1、思路就是有一個給她驚喜的想法
我的設計的是先顯示一顆跳動的愛心?,然后把她的名字首字母顯示出來。根據這個想法,我們就很好想到實現辦法了。
首先,我們需要設置在開始的一段時間內讓愛心跳動,再讓字母輪流出現。
愛心怎么跳動?我們可以用一大一小的愛心交替顯示表現這種效果。
怎么顯示?點陣LED可以用動態掃描法顯示,只需控制好循環就能顯示圖形。
下面開始編寫代碼:
2、頭文件就是準備工作
#include
上面的代碼,因為我想顯示一顆跳動的愛心,所以在這個8×8的點陣中設計了一個大愛心和一個小愛心,讓大小愛心交替顯示,表現出跳動的效果。
后面的字母是名字縮寫。列選則是每次選擇一列顯示。所有這些都是我一個一個畫出來再轉化的列值。
一開始是這樣的
把它整個畫出來了然后是這樣
把列中對應的二進制數寫出來,就是列值了。最后,還進行了修改,這都是在看到效果后對一些細節修改了。
讓大家見笑了。
3、點陣LED顯示就是把想法變成現實
這里采用的是動態掃描的方式,因為每一列顯示的列值都不一樣,所以用動態掃描每次顯示一列,只要循環的速度足夠快,就能看到一幅靜態的圖案,這利用的是人眼的視覺暫留現象。
1)跳動愛心的代碼:
int times=0;
while(times<1500){
P0=line[n];
if(times<=1000) P2=~Ledcode[0][n++];//循環顯示大愛心1000次。
else P2=~Ledcode[1][n++];//小愛心再顯示小愛心500次.
if(n==8) n=0;//讓列值在數組中的一行循環。
times++;
delayms(1);//延時程序。
}
先循環顯示大愛心約1秒,再顯示小愛心0.5秒,形成一次跳動效果。需要跳動多次只需要再嵌套一層for循環即可。:
int times,n=0;
for(i=0;i<3;i++){
times=0;
while(times<1500){
P0=line[n];
if(times<=1000) P2=~Ledcode[0][n++];
else P2=~Ledcode[1][n++];
if(n==8) n=0;
times++;
delayms(1);
}
}
這樣就跳動了三次。
然后,當愛心跳動了三次,就會交替顯示字母。利用同樣的方法就能實現。
2)顯示字母的代碼:
times=0;
n=0;
while(times<=6000){
P0=line[n];
if(times<=2000) P2=~Ledcode[2][n++];
else if(times>2000&×<=4000) P2=~Ledcode[3][n++];
else P2=~Ledcode[4][n++];//三個字母各顯示2000次,視覺上顯示了約2秒。
times++;
if(n==8) n=0;
delayms(1);
}
以上是一次的整個流程,現在需要一直循環顯示,只需要再嵌套一層大的循環即可。
如下:
void main(void)
{
int i;
int n=0;
while(1){
int times;
for(i=0;i<3;i++){
times=0;
while(times<1500){
P0=line[n];
if(times<=1000) P2=~Ledcode[0][n++];
else P2=~Ledcode[1][n++];
if(n==8) n=0;
times++;
delayms(1);
}
}
times=0;
n=0;
while(times<=6000){
P0=line[n];
if(times<=2000) P2=~Ledcode[2][n++];
else if(times>2000&×<=4000) P2=~Ledcode[3][n++];
else P2=~Ledcode[4][n++];
times++;
if(n==8) n=0;
delayms(1);
}
}
}
現在主程序完成了,這也只是一個簡單的小程序。但是剛才用到了延時程序,把延時程序補上就大功告成了。
void delayms(int n){
int i;
int j;
for(i=0;i } 3)附上完整代碼: int Ledcode[5][8]={ {0x0C,0x1E,0x3E,0x7C,0x7C,0x3E,0x1E,0x0C},//大愛心的列值 {0x00,0x0C,0x1C,0x38,0x38,0x1C,0x0C,0x00},//小愛心的列值 {0x32,0x73,0xdb,0xdb,0xdb,0xdb,0xce,0x64},//字母‘S’列值 {0x01,0x03,0x7f,0xff,0xc3,0xe1,0x60,0x00},//字母‘J’列值 {0x01,0x03,0x87,0xfc,0xfc,0x86,0x03,0x01}};//字母‘Y’列值 int line[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//列選 void delayms(int n){ int i; int j; for(i=0;i } void main(void) { int i; int n=0; while(1){ int times; for(i=0;i<3;i++){ times=0; while(times<1500){//顯示跳動愛心 P0=line[n]; if(times<=1000) P2=~Ledcode[0][n++];//顯示大愛心 else P2=~Ledcode[1][n++];//顯示小愛心 if(n==8) n=0; times++; delayms(1); } } times=0; n=0; while(1){//輪流顯示字母 P0=line[n]; if(times<=2000) P2=~Ledcode[2][n++];//顯示字母‘S’ else if(times>2000&×<=4000) P2=~Ledcode[3][n++];//顯示字母‘J’ else P2=~Ledcode[4][n++];//顯示字母‘Y’ times++; if(n==8) n=0; delayms(1); if(times==6000) break; } } } 代碼很簡單,程序也很簡單,但是重要的是心意嘛。她還是很喜歡的,當然,女生可能對硬件是沒多少興趣的,她更注重的是顯示的效果和我為了這個效果做的努力。四、效果——女朋友獲得愛意,你獲得女朋友
點陣太小,放大了看不清楚,所以縮小了看更能把圖形顯示清楚。總結
上一篇:51單片機學習筆記之基礎部分
下一篇:【51單片機】DAC0832制作信號發生器(方波,三角波,鋸齒波)
推薦閱讀最新更新時間:2025-06-12 16:30





設計資源 培訓 開發板 精華推薦
- AD8532ARUZ 單電源、立體聲耳機驅動器的典型應用
- AD8546ARMZ-RL反相運算放大器配置的典型應用電路
- LT6656ACDC-5、5V 電壓基準作為微功率穩壓器的典型應用
- 適用于STM32F042K6 MCU的STM32 Nucleo-32開發板,支持Arduino nano連接
- DN05113/D,采用 NCP786A 超高壓線性穩壓器的電源參考設計
- LTC3867EUF 高效同步降壓控制器的典型應用電路
- 擴展塢
- LT4256-3 演示板,正電壓熱插拔控制器
- 適用于工業應用的 C8051F540 MCU 的 C8051F540DK、8051 開發系統
- [Remix]FP6296核心,10A單鋰升壓快充模塊