1. 51單片機如何利用4個七段數碼管採用動態顯示顯示4位數字,如2035
不停地利用人的視覺暫留,在一個合適的速度下依次顯示1個2,1個0,1個3,1個5.
當顯示一個「2」的時候,其他三位都是空的,以此類推。
但人眼是看不到短時間內這些變化的,假如這個行為不斷循環,那麼人看到的就是「2035」,而不是單個的數字。
比如說吧:
...
P1=num[2];//假設num[2]是0x5b,即"2"
P20=1;//假設使能端是高有效,按實際情況來。
delay();//延長50ms應該可以把,不能太長(過0.1秒就能看出來了),最好也不要太短
P1=num[0];
P21=1;
delay();
...
2. 51單片機低四位數碼管位選不影響高四位
什麼是單片機?怎樣學習單片機?這是單片機初學者的靈魂拷問。
下面以我個人經驗來總結一下單片機入門容易掉的3個坑
第一個坑,我們傳統的講法是一開始就講單片機內部結構,什麼運算器、控制器、寄存器、RAM、ROM 、IO口等等,這種想法沒有錯,但是,我認為也不是很對,因為對於大多數初學者是聽不懂的,反而增加了畏難情緒,甚至還容易帶坑裡去。
第二個坑,把二進制和單片機天然聯系在一起,學到的是單片機,認識二進制,這對於已經入門的朋友來說不要緊,你可以這樣理解,但是對於門外的同學,我認為這也是往坑裡帶,我們同學就會一直糾結,它就怎麼認識二進制了呢?從本質上講,二進制和單片機沒有任何關系,所以在這里我要給單片機初學者一個忠告,同學們,忘掉二進制吧,只有忘掉二進制你才能重新開始並真正理解單片機。
第三個坑,幾乎100%的學校是將C語言,單片機作為兩門獨立課程開設的,這人為增加的難度,非計算機專業的學習C語言都應該放到單片機環境中去學習。
很多初學者想學習單片機,但是卻不知道怎麼入門,該從何學起。
其實學習單片機可從以下四個階段開展入門學習
第一階段,學會C語言的常用語法,熟悉51單片機開發平台、軟體keil的操作,了解單片機的大概原理特性,能讀懂按鍵、數碼管、跑馬燈、串口的簡單程序,能熟悉幾個常用的外圍晶元驅動。
第二階段,這個階段是四個階段中最重要的階段,很多初學者完成了第一階段的學習,真正去面對一個小項目的時候還是無從下手,它們不知道按鍵、顯示、通訊、應用程序之間是如何關聯起來的,一旦遇到多任務項目的時候,不知道如何並行處理,它們最缺的是程序的框架思路,網上有很多熱心牛人分享的程序框架思想都值得大家學習和借鑒,就是用定時中斷計時,再用四位置豫劇來實現多任務的切換。
第三階段,大家在做項目時,除了寫單片機的軟體,還不可避免地要跟整個電路的硬體打交道,掌握一些常用的硬體電路知識就顯得尤其重要。電阻、電容、電感、二極體、三極體的應用,電壓差和參考地的關系,常見的變壓整流電路、常見的外圍驅動電路等等,這方面優秀的電子基礎教程很多,大家應該主動找這方面的資料來學習學習。
第四階段,有了前面三個階段的主動學習和積累,就可以去做項目了。在項目中學習,根據工作的需要來選擇學習哪個廠家的單片機,根據工作的需要來決定是否需要學習匯編語言。有一些廠家的單片機並不能用C語言開發,只能用匯編語言。根據工作的需要來深入研究相關行業所需的硬體電路知識,根據工作的需要來學習相關的外圍晶元驅動程序。以上就是新手入門學習單片機的四個階段。
喜歡的幫忙收藏點個贊哦,文章內容僅代表個人觀點,不喜勿噴,謝謝大家的支持與鼓勵!
學習單片機,我華維林北是認真的,童鞋們有什麼疑問都可以來找我,及時回復林北能得到非常實用的干貨資料,能幫助輔導大家學到一些單片機相關知識而成長,華維林北會得到很大的滿足感!好了,這期就說到這,我們下期見!
華維林北
3. 單片機上8個數碼管這樣是讓他循環顯示,怎樣讓它靜態顯示呢
/**52單片機,12MHz晶振,8位共陰數碼管,P0口段選,P2口低電平位選,P20最高位,P27最低位**/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define TRUE 1
#define FALSE 0
#define th0 0xfe
#define tl0 0x0c //500us at 12MHz(定時器工作模式1 狀態)
#define DisTimeAt500usCount 5 //單'位'數碼管顯示時間,數碼管刷新頻率f=1/(4t),其中 t 為單'位'數碼管顯示時間,單位 s,頻率f 單位 Hz
#define SEG_Num 8 //數碼管位數
uchar code LoveYouList[SEG_Num]={0x38,0x3f,0x3e,0x79,0x40,0x6e,0x3f,0x3e};//LOVE-YOU
#define SEG_Data P0 //數碼管段驅動介面
#define SEG_En P2 //數碼管位驅動介面
#define SEG_AllOff SEG_En=0xff //關閉所有數碼管(位驅動)
bit DisplayFlag; //顯示標志位
void Timer0() interrupt 1 //定時器0中斷函數
{
static uchar t500us; //定義靜態變數 t500us 定時計數寄存空間
TL0=tl0;
TH0=th0; //重賦 1ms 定時初值
t500us=++t500us%DisTimeAt500usCount; //先計數值加1,後對計數范圍進行限制0~(DisTimeAt500usCount-1)
if(!t500us) DisplayFlag=TRUE; //若定時計數值歸0,則表示計數值曾到達 單'位'顯示時間(DisTimeAt500usCount),顯示標志 置位
}
void SystemInit() //系統初始化函數
{
TMOD=0x01; //關閉定時器1,開啟定時器0,且工作在模式1(16位定時器)
TH0=th0;
TL0=tl0; //裝定時初值(1ms at 12MHz)
TR0=1; //啟動計時
ET0=1; //允許定時器0中斷
EA=1; //開啟系統中斷功能
}
void Display() //顯示函數
{
static dis_loca; //定義靜態變數 顯示位置
dis_loca=++dis_loca%SEG_Num; //先對 顯示位置 加1,後對變數范圍進行限制 0~(SEG_Num-1)
SEG_AllOff; //關閉所有數碼管顯示(位驅動)
SEG_Data=LoveYouList[dis_loca]; //將本次顯示位上的內容轉成代碼,並送到數據埠
SEG_En&=~(1<<dis_loca); //開啟本次需要顯示的位驅動
}
void main() //主函數
{
SystemInit(); //調用 系統初始化函數
while(1) //循環系統
{
if(DisplayFlag) //若顯示標志位為真(單'位'顯示時間結束),則執行以下任務
{
DisplayFlag=FALSE; //清顯示標志位
Display(); //調用 顯示函數
}
}
}
很多設定好的參數可以在 宏定義的時候修改,包括數碼管位數、數碼管刷新率等,如果LZ的晶振不是12MHz,那麼只需要將宏定義中 TH0,TL0的初值修改正常即可,如24MHz,就改成FC18,總體效果我沒實物測試,看LZ造化了。
4. 關於7段數碼管顯示問題
7段數碼管其實是八段,有時小數點沒有使用,所以常說7段,
顯示原理是這樣的
數碼管首先從上到右,到下到左,到中間,最後到小數點分別標記為abcdefgdp八段其中小數點位DP為最高位,a段為最低位,要想顯示什麼字告祥纖符只需要使對應的段發光即可,一般的習慣是單片機的埠的最低位接a段,次低位接b段,...最高位(如p0.7)接dp,顯示碼宴歷從高往低表示為為dpgfedcba
如要顯示「1」,只需要將b、c段點亮即可,若是共陰極,片選是低電平選中,某一段輸出高電平點亮,即顯襪仿示碼為00000110即0x06,其他的依照該方法類推
你給的碼表為共陰極的。
共陽極的恰巧相反!
數碼管的示意圖如下圖所示