當前位置:首頁 » 編程軟體 » 單片機數碼管編程

單片機數碼管編程

發布時間: 2022-08-23 16:09:55

『壹』 在51單片機中1位位數碼管顯示的編程怎麼寫啊,

下面這個程序是4x4距陣鍵盤,LED數碼管顯示,一共可以到0-F顯示,你可以稍微改一下就可以實現你的功能了,如還有問題請發信息,希望能幫上你!
#include<at89x52.h>
unsigned char code Dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //數碼管 0-F 代碼
unsigned char k; //設置全局變數k 為鍵盤的鍵值

/************************************鍵盤延時函數****************************/

void key_delay(void) //延時函數
{
int t;
for(t=0;t<500;t++);
}

/************************************鍵盤掃描函數******************************/
void keyscan(void) //鍵盤掃描函數
{
unsigned char a;
P2 = 0xf0; //鍵盤初始化
if(P2!=0xf0) //有鍵按下?
{
key_delay(); //延時
if(P2!=0xf0) //確認真的有鍵按下?
{
P2 = 0xfe; //使行線P2.4為低電平,其餘行為高電平
key_delay();
a = P2; //a作為緩存
switch (a) //開始執行行列掃描
{
case 0xee:k=15;break;
case 0xde:k=11;break;
case 0xbe:k=7;break;
case 0x7e:k=3;break;
default:P2 = 0xfd; //使行線P2.5為低電平,其餘行為高電平

a = P2;
switch (a)
{
case 0xed:k=14;break;
case 0xdd:k=10;break;
case 0xbd:k=6;break;
case 0x7d:k=2;break;
default:P2 = 0xfb; //使行線P2.6為低電平,其餘行為高電平

a = P2;
switch (a)
{
case 0xeb:k=13;break;
case 0xdb:k=9;break;
case 0xbb:k=5;break;
case 0x7b:k=1;break;
default:P2 = 0xf7; //使行線P2.7為低電平,其餘行為高電平

a = P2;
switch (a)
{
case 0xe7:k=12;break;
case 0xd7:k=8;break;
case 0xb7:k=4;break;
case 0x77:k=0;break;
default:break;
}
}
}
break;
}
}
}
}

/****************************** ***主函數*************************************/
void main(void)
{
while(1)
{
keyscan(); //調用鍵盤掃描函數
switch(k) //查找按鍵對應的數碼管顯示代碼
{
case 0:P0=Dig[0];break;
case 1:P0=Dig[1];break;
case 2:P0=Dig[2];break;
case 3:P0=Dig[3];break;
case 4:P0=Dig[4];break;
case 5:P0=Dig[5];break;
case 6:P0=Dig[6];break;
case 7:P0=Dig[7];break;
case 8:P0=Dig[8];break;
case 9:P0=Dig[9];break;
case 10:P0=Dig[10];break;
case 11:P0=Dig[11];break;
case 12:P0=Dig[12];break;
case 13:P0=Dig[13];break;
case 14:P0=Dig[14];break;
case 15:P0=Dig[15];break;
default:break; //退出
}
}
}

/**********************************end***************************************/

『貳』 單片機數碼管編程 匯編語言,急

U16INC	MACRO	U16,;;16位無符號型變數加1
LOCALZZ
INC U16+1
MOV A,U16+1
JNZ ZZ
MOV U16+1,#0
INC U16
ZZ:
ENDM

U16MOV MACRO U16,VAL;;16位無符號型變數賦值
MOV U16+1,#LOW(VAL)
MOV U16,#HIGH(VAL)
ENDM

U16DAYV MACRO U16,VAL,;;16位無符號型變數判斷大小,最後根據Cy判斷
MOV A,U16+1
CLR C
SUBB A,#LOW(VAL)
MOV A,U16
SUBB A,#HIGH(VAL)
ENDM

WX1 EQU P2.0
WX2 EQU P2.1
WX3 EQU P2.2
WX4 EQU P2.3

S4 EQU P1.3
S5 EQU P1.4

LED1 EQU P1.6;;兩個LED
LED2 EQU P1.7

JDQ EQU P1.5;;繼電器

SMGBZ1 EQU 0X30
DS1 EQU 0X31

ZT EQU DS1+4
JSBZ1 EQU ZT+1;0-39的計數
JSBZ2 EQU ZT+2;計時標志,用於閃爍和計時
JSBZ3 EQU JSBZ2+2;;繼電器通斷兩次的計時和計數

ORG 0
JMP MAIN
ORG 0XB
JMP TimeInterupt

MAIN:
MOV SP,#0X70
MOV R0,#0x70
CLR A
MA1: MOV @R0,A ;數據全清0
DJNZ R0,MA1
CALL JDQLC_STOP
CALL Time0Init

;主循環
LOOP: CALL AJPD
CALL RUN
JMP lOOP

;主運行函數
RUN: MOV A,ZT
CJNE A,#1,RR1
JMP RUN1
RR1: CJNE A,#2,RR2
JMP RUN2
RR2: RET

;;0-39循環
RUN1:
MOV DS1+0,#0X10
MOV DS1+1,#0X10
MOV A,JSBZ1
MOV B,#10
DIV AB
MOV DS1+2,A
MOV DS1+3,B

U16DAYV JSBZ2,1000
JC RUN1_1
U16MOV JSBZ2,0
INC JSBZ1
MOV A,JSBZ1
CJNE A,#39+1,RUN1_1
MOVJSBZ1,#0
RUN1_1:
RET

;;FFFF閃爍
RUN2: U16DAYV JSBZ2,500
JC RUN2_1
MOV DS1+0,#0X10
MOV DS1+1,#0X10
MOV DS1+2,#0X10
MOV DS1+3,#0X10
SETB LED1
SETB LED2
U16DAYV JSBZ2,1000
JC RUN2_2
U16MOV JSBZ2,0
JMP RUN2_2
RUN2_1:
MOV DS1+0,#0X0F
MOV DS1+1,#0X0F
MOV DS1+2,#0X0F
MOV DS1+3,#0X0F
CLR LED1
CLR LED2
RUN2_2:
CALL JDQLC

RET

;按鍵判斷
AJPD:
JNB S4,AJ1
JNB S5,AJ2
RET
AJ1: JNB S4,$
MOV ZT,#2
CALL JDQLC_START
RET
AJ2: CALL JDQLC_STOP
SETB LED1
SETB LED2
JNB S5,$
MOV ZT,#1
MOV JSBZ1,#0
U16MOV JSBZ2,0
RET

JDQLC_START:
U16MOV JSBZ3,0
RET
JDQLC_STOP:
U16MOV JSBZ3,30000
SETB JDQ
RET
;繼電器通斷兩次
JDQLC:
U16DAYV JSBZ3,1000
JNC JDQ_1
CLR JDQ;通1s
RET
JDQ_1: U16DAYV JSBZ3,1500
JNC JDQ_2
SETB JDQ;斷0.5s
RET
JDQ_2: U16DAYV JSBZ3,1500+1000
JNC JDQ_3
CLR JDQ;通1s
RET
JDQ_3: U16DAYV JSBZ3,3000
JNC JDQ_4
SETB JDQ;斷
JDQ_4: RET


;;定時器初始化
Time0Init:
MOV TMOD,#0X01
MOV TH0,#HIGH(65536-1000)
MOV TL0,#LOW(65536-1000)
SETB TR0
SETB ET0
SETB EA
RET

;;數碼顯示
SMXS:
INC SMGBZ1
MOV A,SMGBZ1
SUBB A,#4
JC SMXS1
MOV SMGBZ1,#0

SMXS1:
MOV P2,#0XF0
MOV A,SMGBZ1
ADD A,#DS1
MOV R0,A
MOV A,@R0
MOV DPTR,#TABD
MOVC A,@A+DPTR
MOV P0,A
MOV DPTR,#TABW
MOV A,SMGBZ1
MOVC A,@A+DPTR
MOV P2,A
RET

TABD:;段碼
DB0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
DB0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF,0XBF
TABW:;位碼
DB0xF1,0xF2,0xF4,0xF8


;;定時器0中斷
TimeInterupt:
PUSH PSW
PUSH ACC

MOV TH0,#HIGH(65536-1000)
MOV TL0,#LOW(65536-1000)
CALL SMXS
U16INC JSBZ2
U16DAYV JSBZ3,30000
JNC TimeOut
U16INC JSBZ3


TimeOut:
POP ACC
POP PSW
RETI

END

『叄』 關於單片機數碼管的C語言代碼,高分求詳解,先謝過

一、LedNumVal%10000/1000
%是模,取余數的意思,%10000,得到的數最大是四位數。
/是整除的意思不帶小數,如8/3=2
一個小於10000的數,整除1000結果一定是0到9之間的一個數
二、Disp_Tab
以及LedOut,
dispbit都是數組,根據相應的數可得到對應的字元數據,達到位選的功能。

『肆』 at89c51單片機的七段顯示數碼管和流水燈的編程

這個可以借鑒網上的一些資料,具體的看你的原理圖,可以仿寫
最重要的是自己掌握方法
可以到一些貼吧論壇討論,相互學習

#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit wela = P2^7; //數碼管位聲明
sbit la = P2^6; //數碼管段選聲明
sbit FM = P2^3;//蜂鳴器聲明
uchar counter = 0, counter1 = 0, j = 0, flag = 0, flag1 = 0;
uchar num = 6, num1 = 0;
//數碼管段選編碼
uchar code table_ [] = {
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄滅
0x00 //自定義
};
//數碼管位選編碼
uchar code table_we[] = {
0xfe,
0xfd,
0xfb,
0xf7,
0xef,
0xdf
};
void init();
void display();
void main()
{

init();
while(1)
{
if(counter1 == 30)
{
counter1 = 0;
display();
num--;
num1++;
if(num == 0)
{
num = 6;
}
if(num1 == 6)
{
num1 = 0;
}
}

if(counter == 200)//定時到4秒後,流水燈向右流動
{
counter = 0;//counter清零,
//關閉定時器0
TR0 = 0;
//ET0 = 0;
flag = 1; //標志變數置1後,定時器重新初始化
TH0 = 0xB8; //定時器0定時20毫秒
TL0 = 0x00;
TR0 = 1; //重新打開定時器0
//ET0 = 1;
j = 0;
}
}
}
//定時器初始化程序
void init()
{
//定時器0和定時器1初始化函數
TMOD = 0x11;//定義定時器1和0在工作方式1下
TH0 = 0xB8; //定時器0定時20毫秒
TL0 = 0x00;
TH1 = 0xFC; //定時器1定時20毫秒
TL1 = 0x67;
TR0 = 1; //打開定時器0
TR1 = 1; //打開定時器1
EA = 1; //打開總中斷
ET0 = 1; //打開定時器0中斷
ET1 = 1; //打開定時器1中斷
}
//數碼管顯示子程序
void display()
{
la = 1;
P0 = table_[num];
la = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;
la = 1;
P0 = table_[num];
la = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;

la = 1;
P0 = table_[num];
la = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;

la = 1;
P0 = table_[num];
la = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;

la = 1;
P0 = table_[num];
la = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;

la = 1;
P0 = table_[num];
la = 0;
P0 = 0xff;
wela = 1;
P0 = table_we[num1];
wela = 0;

}
//中斷定時器0
void int_time0() interrupt 1
{
TH0 = 0xB8;
TL0 = 0x00;
counter++;
if(flag == 0)
{
if(counter % 10 == 0)//定時200毫秒
{
P1 = ~(1 << j++);//流水燈左移流動
if(j == 8)
{
j = 0;
}
}
}
else
{
if(counter % 5 == 0)
{
//counter = 0;
//流水燈右移流動
P1 = ~(0x80 >> j++);
FM = ~FM;
if(j == 8)
j = 0;
}
}

}
//中斷定時器1
void int_time1() interrupt 3
{
TH1 = 0xFC;
TL1 = 0x67;
counter1++;

}
參考

『伍』 單片機數碼管程序設計AT89C51

單片機設計程序,首先你需要明白單片機的一些基本原則的原理,你在明白之後才能夠去根據軟體的功能採取設計。

『陸』 51單片機數碼管,用動態顯示0到123怎麼編程

0-123,需要三位數碼管。

#include<reg51.h>
#defineucharunsignedchar;
uchardistab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//0到f
ucharnumber,dat[3],nn=0,cnt=0;;
voidt0isr()interrupt1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
number++;
number%=3;
P2=0x01<<number;
P0=distab[dat[number]];
cnt++;
if(cnt>99)
{
cnt=0;
nn++;
nn%=124;
dat[0]=nn/100;
dat[1]=(nn%100)/10;
dat[2]=nn%10;
}
}
main()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1);
}

『柒』 51單片機四位一體共陽極數碼管顯示編程

不清楚你的電路構成如何,因此先按下面的假設執行段碼及位碼的輸出;
其中,延時值可根據實驗效果予以調整;
設 P0 為輸出七段碼(共陽極數據);
四位數碼管有4個陽極,設位碼分別與P2.4--P2.7對應,並且=1時表示可點亮數碼管;
sbit wma1=b2^4; //對應左起第1個數碼管的陽極

sbit wma2=b2^5; //對應左起第2個數碼管的陽極
sbit wma3=b2^6;
sbit wma4=b2^7;
void main()
{
wma1=0; wma2=0; wma3=0; wma4=0;
while(1)
{
P0=table[0]; wma1=1; delay(10); wma1=0;
P0=table[1]; wma1=2; delay(10); wma2=0; P0=table[2]; wma1=3; delay(10); wma3=0; P0=table[3]; wma1=4; delay(10); wma4=0; P0=table[4]; wma1=1; delay(10); wma1=0; P0=table[5]; wma1=2; delay(10); wma2=0; P0=table[6]; wma1=3; delay(10); wma3=0; P0=table[7]; wma1=4; delay(10); wma4=0;
}
}

『捌』 C51單片機數碼管程序設計,

#include
#define
uchar
unsigned
char
uchar
code
table[11]
=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//共陰
void
delay(uint
i)//延時時間約為
10ms
*
x
{
uchar
x;
for(x=0;x<=1827;x++);
}
void
main(void)
{
uchar
i
=
0;
for(i=0;i<11;i++)
{
p0
=
table[i];
//
i
值的
個位數
if(i==10)
p2=0x01;
//點亮最後一個數碼管
p2
=
0x0f;
//點亮四個數碼管
delay(100);
//
延時1s
}
}
說明:若接法不一樣,則賦值也不一樣。

『玖』 如何用單片機控制數碼管

單片機控制數碼管分兩種。
1、靜態數碼管,控制比較簡單,只送段碼就可以了。比如:P1=0xc0,共陽極的話,將顯示0
2、動態數碼管,控制就比較復雜一些,需要先送位選碼,再送段碼,而且要不斷的重復執行這個過程,利用視覺暫留原理,達到顯示的效果。

熱點內容
java遍歷二維數組 發布:2025-03-18 03:36:01 瀏覽:410
銳捷源碼 發布:2025-03-18 03:26:55 瀏覽:436
訴訟中止裁定後可否解壓 發布:2025-03-18 03:24:51 瀏覽:128
sqlserver全文搜索 發布:2025-03-18 03:23:58 瀏覽:715
u盤裡面文件夾沒有了 發布:2025-03-18 03:22:19 瀏覽:229
華為p系列手機哪個配置好 發布:2025-03-18 03:20:13 瀏覽:621
易語言連接access資料庫 發布:2025-03-18 03:12:48 瀏覽:661
苗木源碼 發布:2025-03-18 03:12:38 瀏覽:747
oracle卸載資料庫 發布:2025-03-18 03:05:15 瀏覽:46
編譯時生成固件怎麼辦 發布:2025-03-18 03:04:30 瀏覽:707