㈠ 51單片機的共陰數碼管怎麼顯示數字(c語言)
要讓51單片機共陰數碼管顯示數字,只需要將單片機的P2埠輸出數字對應的段碼即可。
以顯示數字「0」為例,c語言程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//數碼管的段碼編碼
Uchar table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(){//主函數
P0 = table[0];//顯示0,大家可以修改裡面的數據。
while(1);//程序不再執行其他步驟;
}
(1)c51單片機顯示數字25擴展閱讀:
數字0-9的對應段碼:
數字0 0x3f
數字1 0x06
數字2 0x5b
數字3 0x4f
數字4 0x66
數字5 0x6d
數字6 0x7d
數字7 0x07
數字8 0x7f
數字9 0x6f
㈡ 在c51單片機的顯示管上顯示四個數字的c語言程序怎麼寫
sbit la=P2^6;//段鎖存器鎖存湍
sbit wela=P2^7;;//位鎖存器鎖存湍
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void display(shiwan_c,wan_c,qian_c,_c,shi_c,ge_c)//6位顯示子程序
{
P0=table[shiwan_c]; //顯示十萬位
la=1;
la=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
P0=table[wan_c]; //顯示萬位
la=1;
la=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
P0=table[qian_c]; //顯示千位
la=1;
la=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
P0=table[_c]; //顯示百位
la=1;
la=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
P0=table[shi_c]; //顯示十位
la=1;
la=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
P0=table[ge_c]; //顯示個位
la=1;
la=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
P0=0xff; //顯示完畢後關閉最後一位顯示
wela=1;
wela=0;
}
以上程序需放在循環程序中,數碼管需反復顯示
如果其中兩位不需顯示,可賦值為16
㈢ 51單片機的共陰數碼管怎麼顯示數字(c語言)知道
共陰極數碼管也就是說,當控制信號為1時該段LED點亮,8段數碼管的數字0~9定義為:
3FH,06H,5BH,4FH,66H
;01234
6DH,7DH,07H,7FH,6fh
;56789
以下為簡易8路搶答器的常式:
#include<reg51.h>
#define
uchar
unsigned
char
uchar
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
sbit
rstkey=P2^2;
sbit
speaker=P2^0;
void
delay()//延時約400毫秒
{
uchar
i,j;
for(i=0;i<200;i++)
for(j=0;j<250;j++);
}
main()
{
uchar
i,key;
P2=0xff;
while(1)
{
i=0;
P1=table[i];
while(1)
{
key=P3;
if(key!=0)break;
}
switch(key)
{
case
0x01:i=1;break;
case
0x02:i=2;break;
case
0x04:i=3;break;
case
0x08:i=4;break;
case
0x10:i=5;break;
case
0x20:i=6;break;
case
0x40:i=7;break;
case
0x80:i=8;break;
default:break;
}
P1=table[i];//顯示按下搶答器的號
P0=key;//顯示按下鍵號的LED
while(1)
{
if(rstkey==0)break;//主持人按下復位鍵則重新開始
speaker=~speaker;//否則蜂鳴器報警
delay();
}
}
}
㈣ C51單片機12864怎樣按順序顯示數字
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitCS=P2^5;//片選信號
sbitSID=P2^6;//數據信號
sbitSCLK=P2^7;//時鍾信號
sbitRST=P2^2;//復位信號
sbitCH=P2^4;//並行、串列選擇信號
/********************************************************************
*名稱:delay()
*功能:延時,延時時間為100us*t。這是通過軟體延時,有一定誤差。
*輸入:t
*輸出:無
***********************************************************************/
voiddelay(unsignedintt)
{
unsignedinti,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/********************************************************************
*名稱:sendbyte()
*功能:按照液晶的串口通信協議,發送數據
*輸入:zdata
*輸出:無
***********************************************************************/
voidsendbyte(unsignedcharzdata)
{
unsignedinti;
for(i=0;i<8;i++)
{
if((zdata<<i)&0x80)
{
SID=1;
}
else
{
SID=0;
}
SCLK=0;
SCLK=1;
}
}
/********************************************************************
*名稱:write_com()
*功能:寫串口指令
*輸入:cmdcode
*輸出:無
***********************************************************************/
voidwrite_com(unsignedcharcmdcode)
{
CS=1;
sendbyte(0xf8);
sendbyte(cmdcode&0xf0);
sendbyte((cmdcode<<4)&0xf0);
delay(2);
}
/********************************************************************
*名稱:write_data()
*功能:寫串口指令
*輸入:cmdcode
*輸出:無
***********************************************************************/
voidwrite_data(unsignedcharDispdata)
{
CS=1;
sendbyte(0xfa);
sendbyte(Dispdata&0xf0);
sendbyte((Dispdata<<4)&0xf0);
delay(2);
}
/********************************************************************
*名稱:lcdinit()
*功能:初始化函數
*輸入:cmdcode
*輸出:無
***********************************************************************/
voidlcdinit()
{
RST=0;
delay(100);
RST=1;
delay(20000);
write_com(0x30);
delay(50);
write_com(0x0c);
delay(50);
}
/********************************************************************
*名稱:hzkdis()
*功能:顯示字元串
*輸入:*s
*輸出:無
***********************************************************************/
voidhzkdis(unsignedcharcode*s)
{
while(*s>0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
*名稱:Test()
*功能:顯示子函數
*輸入:無
*輸出:無
***********************************************************************/
voidTest()
{
write_com(0x03);
delay(50);
write_com(0x81);
hzkdis("HOT-51");
write_com(0x91);
hzkdis("單片機開發板");
write_com(0x89);
hzkdis("");
write_com(0x98);
hzkdis("東流電子");
}
/********************************************************************
*名稱:Main()
*功能:主函數
*輸入:無
*輸出:無
***********************************************************************/
voidMain()
{
CH=0;
delay(1);
lcdinit();
delay(10);
while(1)
{
Test();
delay(5000);
}
}
㈤ 51單片機顯示數字問題
這個問題我在初學單片機的時候也碰到過,因為數碼管是一個一個掃描的,在你這個程序中只要把延時加長就可以了
for(i=0;i<15;i++)
{
P0=tablewei[i]; P1=0x7f;
delay(500);
}
把delay延時加長,直到人的肉眼可以分辨出來
㈥ 在51單片機中用數碼管可不可以單獨顯示超過255的三位數字
當然可以了,你把temp定義成unsigned int
unsigned int temp=999;
=temp/100;
temp=temp%100;
shi=temp10;
ge=temp%10;
㈦ 用51單片機編寫程序實現數碼管的時鍾數字顯示
KEYVAL EQU30H
KEYTM EQU31H
KEYSCAN EQU32H
DAT EQU33H
SCANLED EQU39H
CLK EQU77H
SEC EQU78H
MIN EQU79H
HOUR EQU7AH
PAUSE BIT00H
DOT BIT01H
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0ISR ;50ms定時
ORG001BH
LJMPT1ISR ;掃描顯示
ORG0030H
MAIN:
MOVSP,#5FH
MOVTMOD,#11H
MOVTH0,#03CH
MOVTL0,#0B0H
MOVTH1,#0ECH
MOVTL1,#078H
MOVKEYVAL,#0
MOVSCANLED,#0
MOV33H,#10H
MOV34H,#10H
MOV35H,#10H
MOV36H,#10H
MOV37H,#10H
MOV38H,#10H
MOVSEC,#0
MOVMIN,#0
MOVHOUR,#0
MOVCLK,#0
CLRPAUSE
SETBEA
SETBET1
SETBTR1
LOOP:
LCALLKEYSEL
MOVA,KEYVAL
CJNEA,#0FFH,LOOP1
SJMPLOOP
LOOP1:
CJNEA,#10,LOOP2 ;「ON」啟動
SETBTR0
SETBET0
SETBPAUSE
SJMPLOOP
LOOP2:
CJNEA,#11,LOOP3 ;「=」清零
MOVSEC,#0
MOVMIN,#0
MOVHOUR,#0
LCALLDISCHG
SJMPLOOP
LOOP3:
CJNEA,#15,LOOP4 ;「+」暫停
CLRTR0
CLRET0
CLRPAUSE
SJMPLOOP
LOOP4:
CJNEA,#14,LOOP5 ;「-」清顯示暫停
MOV33H,#10H
MOV34H,#10H
MOV35H,#10H
MOV36H,#10H
MOV37H,#10H
MOV38H,#10H
CLRTR0
CLRET0
CLRPAUSE
SJMPLOOP
LOOP5:
CJNEA,#10,LOOP6 ;數字鍵
LOOP6:
JCLOOP7
LJMPLOOP
LOOP7:
JNBPAUSE,LOOP8 ;暫停狀態可以輸入數字鍵
LJMPLOOP
LOOP8:
MOV33H,34H
MOV34H,35H
MOV35H,36H
MOV36H,37H
MOV37H,38H
MOV38H,KEYVAL
MOVA,33H
SWAPA
ORLA,34H
LCALLBCDH
MOVHOUR,A
MOVA,35H
SWAPA
ORLA,36H
LCALLBCDH
MOVMIN,A
MOVA,37H
SWAPA
ORLA,38H
LCALLBCDH
MOVSEC,A
LJMPLOOP
;------------------
;BCD轉換為十六進制
BCDH:
MOVB,#10H
DIVAB
MOVR7,B
MOVB,#10
MULAB
ADDA,R7
RET
;------------------
;十六進制轉換為BCD
HBCD:
MOVB,#10
DIVAB
SWAPA
ORLA,B
RET
;------------------
KEYSEL:
MOV KEYVAL,#0
MOV KEYSCAN,#0EFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS1
MOV KEYVAL,A
SJMP KEYRTN
KEYS1:
MOV KEYSCAN,#0DFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS2
CLR C
ADD A,#4
MOV KEYVAL,A
SJMP KEYRTN
KEYS2:
MOV KEYSCAN,#0BFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS3
CLR C
ADD A,#8
MOV KEYVAL,A
SJMP KEYRTN
KEYS3:
MOV KEYSCAN,#7FH
LCALL GETKEY
MOV A,KEYTM
JZ KEYRTN
CLR C
ADD A,#12
MOV KEYVAL,A
KEYRTN:
LCALLCHGKEY
RET
;--------------------
GETKEY:
MOVKEYTM,#0
MOV A,KEYSCAN
MOV P3,A
NOP
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOVR2,#10
LCALLDELAY
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOV A,P3
ANL A,#0FH
MOV R7,A
SF:
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ SF
MOV A,R7
CJNE A,#0EH,NK1
MOV KEYTM,#1
SJMP NOKEY
NK1:
CJNE A,#0DH,NK2
MOV KEYTM,#2
SJMP NOKEY
NK2:
CJNE A,#0BH,NK3
MOV KEYTM,#3
SJMP NOKEY
NK3:
CJNE A,#07H,NOKEY
MOV KEYTM,#4
NOKEY: RET
;--------------------
DELAY:
MOVR3,#50
DELAY1:
MOVR4,#100
DJNZR4,$
DJNZR3,DELAY1
DJNZR2,DELAY
RET
;--------------------
T0ISR:
PUSHACC
CLRTR0
MOVTH0,#3CH
MOVTL0,#0B0H
SETBTR0
INCCLK
MOVA,CLK
CJNEA,#20,T0ISRE
MOVCLK,#0
INCSEC
MOVA,SEC
CJNEA,#60,T0ISRE
MOVSEC,#0
INCMIN
MOVA,MIN
CJNEA,#60,T0ISRE
MOVMIN,#0
INCHOUR
MOVA,HOUR
CJNEA,#24,T0ISRE
MOVSEC,#0
MOVMIN,#0
MOVHOUR,#0
T0ISRE:
LCALLDISCHG
POPACC
RETI
;--------------------
DISCHG:
MOVA,HOUR
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV34H,A
POPACC
ANLA,#0F0H
SWAPA
MOV33H,A
MOVA,MIN
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV36H,A
POPACC
ANLA,#0F0H
SWAPA
MOV35H,A
MOVA,SEC
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV38H,A
POPACC
ANLA,#0F0H
SWAPA
MOV37H,A
RET
;--------------------
T1ISR:
PUSHACC
CLRTR1
MOVTH1,#0ECH
MOVTL1,#78H
SETBTR1
MOVDPTR,#LEDTAB
T100:
MOVR0,#DAT
MOVA,SCANLED
ADDA,R0
MOVR0,A
MOVA,SCANLED
JNZT101
MOVP2,#01H
CLRDOT
SJMPT1DIS
T101:
DECA
JNZT102
MOVP2,#02H
SETBDOT
SJMPT1DIS
T102:
DECA
JNZT103
MOVP2,#04H
CLRDOT
SJMPT1DIS
T103:
DECA
JNZT104
MOVP2,#08H
SETBDOT
SJMPT1DIS
T104:
DECA
JNZT105
MOVP2,#10H
CLRDOT
SJMPT1DIS
T105:
MOVP2,#20H
CLRDOT
T1DIS:
MOVA,@R0
MOVCA,@A+DPTR
JNBDOT,T1DIS1
ORLA,#01H
T1DIS1:
CPLA
MOVP0,A
INCSCANLED
MOVA,SCANLED
CJNEA,#6,T1END
MOVSCANLED,#0
T1END:
POPACC
RETI
;--------------------
CHGKEY:
MOVA,KEYVAL
JZKV16
DECA
JNZKV01
MOVKEYVAL,#7
RET
KV01:
DECA
JNZKV02
MOVKEYVAL,#4
RET
KV02:
DECA
JNZKV03
MOVKEYVAL,#1
RET
KV03:
DECA
JNZKV04
MOVKEYVAL,#10
RET
KV04:
DECA
JNZKV05
MOVKEYVAL,#8
RET
KV05:
DECA
JNZKV06
MOVKEYVAL,#5
RET
KV06:
DECA
JNZKV07
MOVKEYVAL,#2
RET
KV07:
DECA
JNZKV08
MOVKEYVAL,#0
RET
KV08:
DECA
JNZKV09
MOVKEYVAL,#9
RET
KV09:
DECA
JNZKV10
MOVKEYVAL,#6
RET
KV10:
DECA
JNZKV11
MOVKEYVAL,#3
RET
KV11:
DECA
JNZKV12
MOVKEYVAL,#11
RET
KV12:
DECA
JNZKV13
MOVKEYVAL,#12
RET
KV13:
DECA
JNZKV14
MOVKEYVAL,#13
RET
KV14:
DECA
JNZKV15
MOVKEYVAL,#14
RET
KV15:
DECA
JNZKV16
MOVKEYVAL,#15
RET
KV16:
MOVKEYVAL,#0FFH
RET
;--------------------
LEDTAB: DB0FCH ;"0" 00H
DB60H ;"1" 01H
DB0DAH ;"2" 02H
DB0F2H ;"3" 03H
DB66H ;"4" 04H
DB0B6H ;"5" 05H
DB0BEH ;"6" 06H
DB0E0H ;"7" 07H
DB0FEH ;"8" 08H
DB0F6H ;"9" 09H
DB0EEH ;"A" 0AH
DB3EH ;"B" 0BH
DB9CH ;"C" 0CH
DB7AH ;"D" 0DH
DB9EH ;"E" 0EH
DB8EH ;"F" 0FH
DB00H ;"" 10H
;--------------------
END
㈧ C51單片機的數碼管顯示問題
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,t,num,xms;
sbit wela=P2^7;
sbit la=P2^6;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar xms)//這里最好把uchar改為uint,當然不改應該也沒問題,你下面的i跟xms類型不一樣,在這里應該是沒問題,最好還是統一一下
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)
{
shi=num/10;
ge=num%10;
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
wela=1;
P0=0xfd;
wela=0;
//delay(5);
la=1;
P0=table[ge];
la=0;
delay(5);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(key1==0)
{
delay(10);//這里消抖也是,也就是說,用按鍵的話,數碼管就是會閃
因為時間有點長對吧,數碼管來不及立刻顯示,此時用肉眼就能看到閃,所以應該避免不了吧,除非你消抖時間也改短一點,你試試看。看看效果
if(key1==0)
num++;
if(num==60)
num=0;
while(!key1);
delay(10); //按一下十位閃一下就是這里延時太長了,可以不用延時,
數碼管動態顯示要求掃描很快,你上面就是延時了5ms,如果時間再長一點,那你就能看到數碼管不停的閃。所以這里10ms太長了,可以不用。
但為什麼個位沒閃,應該是在display時,先是現實十位,然後把十位滅掉,再顯示個位,一直等到在顯示十位時,個位才滅,就是說在這支前,個位是亮的,由於你這延時了10ms,導致此時十位沒有很快的顯示出來,所以等過了10ms之後,十位才由暗變亮,你就可以看到十位閃了一下。
當你按住key1時,key1一直是0,那麼!key1=1;所以程序一直執行while(!key1);這句語句,那麼結合上面所說十位就亮不了了,只有個位亮。
你可以試著改改delay函數中的值大小,自己觀察一下,display中的delay值可以更小的,3ms,2ms,自己試試吧
}
if(key2==0)
{
delay(10);
if(key2==0)
num--;
if(num==-1)
num=59;
while(!key2);
delay(10);
}
if(key3==0)
{
delay(10);
if(key3==0)
num=0;
while(!key1);
delay(10);
}
if(key4==0)
{
if(key4==0)
{
TR0=~TR0;
}
while(!key4);
}
display(shi,ge);
}
}
void time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
num++;
if(num==60)
num=0;}}
㈨ 如何用51單片機用一位數碼管顯示對應數字
首先你要把0到9的數字對應的七段碼放在一個數組中,然後用一個變數計按鍵的次數或序號,把該序號的七段碼輸出到對應的埠即可。