1. C51單片機的數碼管(帶小數點)哪一位對應哪一段
一般是從上面一橫(8位的最低位)開始,順時針轉abcdef再一間一橫為g,小數點為最高位。
2. 51單片機低四位數碼管位選不影響高四位
什麼是單片機?怎樣學習單片機?這是單片機初學者的靈魂拷問。
下面以我個人經驗來總結一下單片機入門容易掉的3個坑
第一個坑,我們傳統的講法是一開始就講單片機內部結構,什麼運算器、控制器、寄存器、RAM、ROM 、IO口等等,這種想法沒有錯,但是,我認為也不是很對,因為對於大多數初學者是聽不懂的,反而增加了畏難情緒,甚至還容易帶坑裡去。
第二個坑,把二進制和單片機天然聯系在一起,學到的是單片機,認識二進制,這對於已經入門的朋友來說不要緊,你可以這樣理解,但是對於門外的同學,我認為這也是往坑裡帶,我們同學就會一直糾結,它就怎麼認識二進制了呢?從本質上講,二進制和單片機沒有任何關系,所以在這里我要給單片機初學者一個忠告,同學們,忘掉二進制吧,只有忘掉二進制你才能重新開始並真正理解單片機。
第三個坑,幾乎100%的學校是將C語言,單片機作為兩門獨立課程開設的,這人為增加的難度,非計算機專業的學習C語言都應該放到單片機環境中去學習。
很多初學者想學習單片機,但是卻不知道怎麼入門,該從何學起。
其實學習單片機可從以下四個階段開展入門學習
第一階段,學會C語言的常用語法,熟悉51單片機開發平台、軟體keil的操作,了解單片機的大概原理特性,能讀懂按鍵、數碼管、跑馬燈、串口的簡單程序,能熟悉幾個常用的外圍晶元驅動。
第二階段,這個階段是四個階段中最重要的階段,很多初學者完成了第一階段的學習,真正去面對一個小項目的時候還是無從下手,它們不知道按鍵、顯示、通訊、應用程序之間是如何關聯起來的,一旦遇到多任務項目的時候,不知道如何並行處理,它們最缺的是程序的框架思路,網上有很多熱心牛人分享的程序框架思想都值得大家學習和借鑒,就是用定時中斷計時,再用四位置豫劇來實現多任務的切換。
第三階段,大家在做項目時,除了寫單片機的軟體,還不可避免地要跟整個電路的硬體打交道,掌握一些常用的硬體電路知識就顯得尤其重要。電阻、電容、電感、二極體、三極體的應用,電壓差和參考地的關系,常見的變壓整流電路、常見的外圍驅動電路等等,這方面優秀的電子基礎教程很多,大家應該主動找這方面的資料來學習學習。
第四階段,有了前面三個階段的主動學習和積累,就可以去做項目了。在項目中學習,根據工作的需要來選擇學習哪個廠家的單片機,根據工作的需要來決定是否需要學習匯編語言。有一些廠家的單片機並不能用C語言開發,只能用匯編語言。根據工作的需要來深入研究相關行業所需的硬體電路知識,根據工作的需要來學習相關的外圍晶元驅動程序。以上就是新手入門學習單片機的四個階段。
喜歡的幫忙收藏點個贊哦,文章內容僅代表個人觀點,不喜勿噴,謝謝大家的支持與鼓勵!
學習單片機,我華維林北是認真的,童鞋們有什麼疑問都可以來找我,及時回復林北能得到非常實用的干貨資料,能幫助輔導大家學到一些單片機相關知識而成長,華維林北會得到很大的滿足感!好了,這期就說到這,我們下期見!
華維林北
3. 51單片機數碼管顯示8位二進制數程序,第6、7位永遠都只顯示0,其他位顯示正常。
MOV 26H,20H ;二進制數第6位送26H單元
MOV 20H,A
RR A
ANL 20H,#01H
MOV 27H,20H ;二進制數第7位送27H單元
這26H,27H是保存第6,7位數據的,但是延時慧粗子程序又用頃鬧26H,27H單元了,延時結束,這兩個單元永遠是0了。
DELAY: MOV 26H,#4 ;延時服務子程序
DLY1: MOV 27H,#250
DJNZ 27H,$
DJNZ 26H,DLY1
RET
這延時子程序要用29H,2AH,兩個單元就好雀碧罩了,還不如用R4,R5更方便呢,也不會出錯。這樣的
DELAY: MOV R4,#4 ;延時服務子程序
DLY1: MOV R5,#250
DJNZ R5,$
DJNZ R4,DLY1
RET
這多好哇
4. 51單片機怎麼控制四位數碼管,有沒有匯編程序我只能控制兩位!求詳解!
display:;顯廳叢團示子程序
mov dptr,#numtab;送數據表
mov a,a_bit;送個位
movc a,@a+dptr;查表
mov p1,a;送p0顯示 30
setb p3.7;選中第一個數碼管
lcall d1ms;顯示1ms
cpl p3.7;關顯示
mov a,b_bit;送10位數據 35
movc a,@a+dptr;查表
mov p1,a;送p0顯示
setb p3.5;選中第2個數碼管
acall d1ms;顯示1ms
cpl p3.5;關顯扮橘示
mov a,c_bit;送100位數據
movc a,@a+dptr;查表
mov p1,a;送p0顯示
setb p3.3;選中第3個數碼管
acall d1ms;顯示1ms 45
cpl p3.3;關顯示
mov a,d_bit;送1000位數據鄭盯
movc a,@a+dptr;查表
mov p1,a;送p0顯示
setb p3.2;選中第3個數碼管 50
acall d1ms;顯示1ms
cpl p3.2;關顯示
mov a,e_bit;送10000位數據
movc a,@a+dptr;查表
mov p1,a;送p0顯示 55
setb p3.1;選中第3個數碼管
acall d1ms;顯示1ms
cpl p3.1;關顯示
mov a,f_bit;送100位數據
movc a,@a+dptr;查表 60
mov p1,a;送p0顯示
setb p3.0;選中第3個數碼管
acall d1ms;顯示1ms
cpl p3.0;關顯示
ljmp c6
這個是我從我的IO驅動LCD中移植來的6位顯示
5. 51單片機6位數碼管顯示時間
C51單片機六位數碼管時鍾
用數碼管dot分隔時分秒
用三個按鍵設置時間:
SET鍵:小時設定->分鍾設定->結束設定,小時設定狀態時表示小時的兩位數碼管閃爍,分鍾設定時表示分鍾的兩位數碼管閃爍
CHANGE鍵:在小時設定狀態和分鍾設定狀態改變數值
SET S鍵:秒置零
C語言代碼:
//main.c
#include <REGX52.H>
typedef unsigned int UINT ;
typedef unsigned char UCHAR ;
#define KEY P2
#define KEYMASK 0x07
sbit LE1 = P2^6; //定義位控口
sbit LE2 = P2^7; //定義段控口
UCHAR KeyPressDown = 0x00;
UCHAR KeyRelease = 0x00;
UCHAR LastKey = 0x00;
UCHAR MODE ;
extern UCHAR HH;
extern UCHAR MM;
extern UCHAR SS;
extern bit T_CYCLE ;
extern void T0_Init(void); //初始化定時器,函數定義在Timer.c
UCHAR code NUM[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(UINT t) //延時t時鍾周期
{
while (t--) ;
}
void H_Increase(void) //小時增1
{
if(HH<23) HH++;
else
{
HH = 0;
}
}
void M_Increase(void) //分鍾增1
{
if(MM<59) MM++;
else
{
MM = 0;
H_Increase();
}
}
void S_Increase(void) //秒增1
{
if(SS<59) SS++;
else
{
SS = 0;
M_Increase();
}
}
void display(UCHAR SEG,UCHAR Digi) //顯示一位數碼管,SEG = 0-9數字,Digi = 第0-6位
{
LE2 = 1;
P0 = (0x01<<Digi) ;
LE2 = 0;
P0 = 0x00;
LE1 = 1;
P0 = NUM[SEG];
if (Digi==1||Digi==3) P0 &= 0x7f ; //顯示分隔符
delay(50);
P0 = 0xff;
LE1 = 0;
}
void main(void)
{
P0 = 0xff;
LE1 = 0;
LE2 = 0;
T0_Init();
while(1)
{
if(MODE != 1 || T_CYCLE)
{
display(HH/10,0); //顯示小時十位數
display(HH%10,1); //顯示小時個位數
}
if(MODE != 2 || T_CYCLE)
{
display(MM/10,2); //顯示分鍾十位數
display(MM%10,3); //顯示分鍾個位數
}
display(SS/10,4); //顯示秒十位數
display(SS%10,5); //顯示秒個位數
}
}
void key_Process(void) //按鍵處理程序
{
UCHAR CurrKey;
KEY |= KEYMASK; //將按鍵對應的IO設置為輸入狀態
CurrKey = (~KEY) & KEYMASK;
KeyPressDown = (~LastKey) & CurrKey;
KeyRelease = LastKey & (~CurrKey);
LastKey = CurrKey;
switch(KeyRelease)
{
case 1:
if(MODE == 2) MODE = 0;
else MODE ++;
break;
case 2:
if(MODE == 1) H_Increase() ;
if(MODE == 2) M_Increase() ;
break;
case 4:
SS = 0;
break;
default: break;
}
}
//Timer.c
#include <reg52.h>
typedef unsigned int UINT ;
typedef unsigned char UCHAR ;
UCHAR HH = 14; //小時初始值
UCHAR MM = 2; //分鍾初始值
UCHAR SS = 55; //秒初始值
UINT u_10ms = 0; //10ms計數
bit T_CYCLE = 0;
extern void key_Process(void);
extern void S_Increase(void);
void T0_Init(void)
{
TMOD &= 0xf0;
TMOD |= 0x01;
//定時器賦初始值,定時時間為10ms。
TH0 = 0xd8;
TL0 = 0xf0;
TR0 = 1;
IE = 0x82;
}
void T0_INTSrv(void) interrupt 1
{
//定時器重新開始計時。
TH0 = 0xd8;
TL0 = 0xf0;
u_10ms ++;
if (u_10ms%20==0) // 200 ms
{
T_CYCLE = ! T_CYCLE; //閃爍循環
}
if (u_10ms>99) // 1000 ms = 1 second
{
u_10ms = 0;
S_Increase();
}
key_Process(); //SET按鍵處理
}
Proreus模擬電路:
6. 51單片機數碼管顯示五位數Z
1,你的數組裡面的數有問題,
xx[1]=z/10000;
xx[2]=z%10000/1000;
xx[3]=z%1000/100;
xx[4]=z%100/10;
xx[5]=z%10;
2,全部顯示0,也埋李雹可能是你的段位送的順序有誤,如果是鎖存器的話,應該先送位,再送段,
你試下,看能不能正常顯示。
3,數碼管的顯擾渣示,必彎帆須的一位一位的來,你想想數碼管是動態掃描,不一位一位的送肯定不能正常顯示地的。
希望能幫到你。
7. 51單片機靜態顯示可以實現6位數碼管123456的顯示嗎
多位數碼管無法實現靜態顯示,物理上正備它們就存在沖突。除非每一位顯示的內容都相同……
如果執著於用靜態顯示,行卜可以用6個1位數碼管,缺點是需要大量的舉帶毀管腳來控制(可以用串擴並方案或地址映射擴展方案,成本上得不償失)。
8. 51單片機控制數碼管顯示不正常問題,為什麼後面4位數碼管1234和5678都是顯示亂碼呢該怎麼改
授人以魚不如授之以漁。先建立程序的一般結構,然後定義一個code數組,里邊存放數碼管顯示0~9的數據,之後定義一個display顯示函數,傳遞參數但不返回參數,然後將傳遞的參數(1234或5678)分解成4哥單個數,然後依次選擇要顯示的數碼管和數據,緊接消影和簡單暫時,這樣一個數碼管顯示就完成了,之後三個跟這個一樣。最後在主函數里調用這個顯示函數並傳遞參數。
希望我的回答能幫助到你。