㈠ 51單片機數碼管顯示程序
#include<reg52.h>
//52系列單片機頭文件
#define
uchar
unsigned
char
//宏定義
#define
uint
unsigned
int
sbit
la=P2^6;
//申明u1鎖存器的鎖存端
sbit
wela=P2^7;
//
u2
uchar
num1,num2;
uchar
code
table[]={
//數組定義
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar
code
aable[]={
//位選數組定義
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void
delays(uint);
//子函數申明
void
main()
{
while(1)
{
for(num1=0;num1<48;num1++)
//6個數循環顯示
{
wela=1;
//打開u2鎖存端
P0=aable[num1%6];
//送入位選信號
wela=0;
//關閉u2鎖存端
//
delays(1);
la=1;
//打開u1鎖存端
P0=table[num1%16];
//送入段選信號
la=0;
//關閉u1鎖存端
delays(1);
}
}
}
/*---------主函數-----------------------------------------------*/
void
delays(uint
xs)
{
uint
i,j,k;
for(i=xs;i>0;i--)
for(j=1000;j>0;j--)
for(k=110;k>0;k--);
}
/*----------------延時程序-----------------------------------------------*/
㈡ 單片機 共陰數碼管。如何編程
你所說的「8」 0xff是共陰的,那麼要是他點亮,8段數碼管abcdefg都應該為1,h是小數點,沒有用到,則是0.
abcdefgh則為:11111110
把順序倒過來就是01111111
把八為二進制分2組,四位一組
根據8421碼:
8 4 2 1 8 4 2 1
-----------------------------------------------------
0 1 1 1 1 1 1 1
4+2+1=7 8+4+2+1=15 (分數下面是0的不用和上面相加的)
16進制中 10=a 11=b 12=c13=d14=e15=f
即 0x7f
你上面說的8=0xff是把小數點也算上去了的!
㈢ 求助,關於一個單片機四位數碼管的編程
匯編,還是 C ?
㈣ LED數碼管編程。單片機C語言。
#include<reg51.h>
#define uchar unsigned char
uchar times;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
switch(times)
{
case 10:led2=~led2;break;
case 20:led0=~led0;break;
case 40:led1=~led1;times=0;break;
default:break;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1);
}
㈤ 單片機數碼管編程 匯編語言,急
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
㈥ 單片機的數碼管顯示的編程,
數碼管是LED構成的,你要顯示數字,把對應的LED點亮,就構成了數字
由於是共陰極的,所以要點亮對應的LED,只需要在要點亮的LED的陽極施加高電平即可,即給單片機的IO口送1,不亮的LED送低電平,即0.
你好好看我給你圖,圖是以顯示2為例給你講的。
㈦ 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
}
}
說明:若接法不一樣,則賦值也不一樣。
㈧ 51單片機,怎樣編程,讓所有的數碼管都顯示8,給出詳細編程,謝謝!
讓所有的數碼管都顯示8其實是最簡單的,將所有位碼都置為有效,段碼送8的碼就可以了,不需要掃描。
比如:P0為段碼,P2為位碼
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV P0,#7FH
MOV P2,#00H
SJMP $
END
㈨ 在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***************************************/
㈩ 51單片機 讓數碼管自動顯示0至9的C程序。有沒有比這個更簡單的
可以通過代碼優化的方式來簡化代碼。
一、設置延時函數
延時函數在單片機中有著讓現實延時的能力,本程序中可以通過採用for循環方式進行延時,具體代碼如下:
void delay()
{
uinti,j;
for(i=100;i>0;i--)
for(j=1000;j>0;j--);
}
二、設置數碼管顯示數組
數組定義簡單,而且訪問很方便。所有元素類型相同,在數碼管顯示程序中可以讓程序代碼減少。數組代碼如下:
chara[10]={0xff,0x3,0x9f,0x25,0xd,0x99,0x49,0x41,0x1f,0x1,0x9};
三、設置數碼管顯示循環
數碼管顯示循環可以不用編寫一次又一次的數碼管顯示代碼,既方便又簡潔。具體代碼如下:
for(inti=0;i<10;i++)
{
P0=a[i];
delay();
}
(10)單片機數碼管編程擴展閱讀
單片機程序進行簡化可以查看是否有反復出現的代碼序列,整合成循環進行更改。同一類型且用法相同的變數可以整合成數組,方便對各個內容進行訪問。有特定功能的代碼段可以定義一個函數進行訪問。
注意:用C51語言編輯的單片機程序與普通C語言不同,C51語言中的數據類型和標准c中的數據類型不同。