⑴ 利用51單片機驅動一個8段數碼管,實現0—F計數
設置一個數碼管段位表ledtable,共16個,值就是共陰8 段(含小數點)數碼管的段碼。 8 段從上面一橫開始順時針依次為a、b、c、d、e、f、g(中間的橫)和h(小數點),分別接在單片機IO口的0~7 ,例如要顯示0,則段碼為0011 1111 即0x3f 。 其它,你可自行推出。
程序上實現:
ORG0000H
MAIN:
MOVR0,#0;
LOOP:
MOVA,RO
MOVDPTR,#LEDTABLE
MOVCA,@A+DPTR
MOVP1,A
ACALLDELAY
INCR0
MOVA,R0
DJNEA,#16,LOOP
MOVRO,#0
AJMPLOOP
DELAY:
NOP
RET
ORG0500H
LEDTABLE:
DB3FH,....
⑵ 單片機6位數碼管計數器程序問題
#include<reg52.H>//STC頭文件
#defineucharunsignedchar
#defineuintunsignedint
#definetimewe3
sbitwe=P2^7;
sbit=P2^6;
unsignedlongtemp;
uintjsms=0;
ucharcodean[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
ucharcodewei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
voiddelay(uinta)//1ms延時程序(12MHz10倍於51單片機速度時)
{
uinti;
while(--a!=0)
{
for(i=0;i<600;i++);
}
}
uchardisbuf[6];
voiddisplay()
{ ucharcodewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
staticuchara;
if(a>=6)a=0;
we=1;
P0=0xff;
we=0;
=1;
P0=an[disbuf[a]];
=0;
we=1;
P0=wei[a];
we=0;
a++;
}
/**********************************************/
/*主函數*/
/**********************************************/
voidmain(void)
{
temp=0;
while(1)
{
if(++jsms>=1000){
if(++temp==999999)
temp=0;
}
disbuf[0]=temp/100000;
disbuf[1]=temp%100000/10000;
disbuf[2]=temp%10000/1000;
disbuf[3]=temp%1000/100;
disbuf[4]=temp%100/10;
disbuf[5]=temp%10;
display();
delay(1);
}
}
⑶ C51單片機,控制數碼管每隔3秒,循環數字1234,5678,9876,1368
用四位一體的共陰數碼管,用定時器T0定時,實現3秒切換顯示四組數字。模擬實現,模擬圖如下
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰段碼
uchar code disb[]={0xfe,0xfd,0xfb,0xf7};//位碼
uchar buf[]={1,2,3,4,5,6,7,8,9,8,7,6,1,3,6,8};//顯示四組數字
uchar t0n;//T0定時器中斷計數
void delay()//延時子程序
{
uint y;
for(y=400;y>0;y--);
}
void display(uchar x)//顯示子程序,x為顯示起始位
{
uchar j;
for(j=0;j<4;j++)
{
P2=disb[j];//輸出位碼
P0=tab[buf[j+x]];//輸出段碼
delay();
}
}
void main()//主程序
{
uchar x;
TMOD=0x01;//T0方式1
TH0=0x3C;//晶振12MHz,定是50ms,時間常數,X=3CB0H
TL0=0xB0;
IE=0x82;
TR0 =1;
while(1)
{
display(x);
if(t0n>=60)
{
t0n=0;
x+=4;
if(x>12)x=0;
}
}
}
//定時器T0中斷程序
void T0_ISR() interrupt 1
{
TH0=0x3C;
TL0=0xB0;
t0n++;
}
⑷ 51單片機定時器T1中斷使數碼管計數0—F,每秒加1,想要將if()函數寫到main()函數中,如何實現。
把初始化程序 Timer1Init(); 放在while(1) 的上面,你現在這樣,每次循環都初始化了,就永遠也不計數了 。另外,開機是顯示8,是因為,開機P0口全為1,要過1秒後開始從0開始顯示,可以在while(1)上面加一行 P0=0x3f; 這樣,開機就顯示0了。另外,這種定時1秒,定時器最好定時長點,如50ms ,你現在是定時1ms ,這中斷頻率太高了,如果有其它程序就會影響主程序的執行。
還有,if 語句下面的
if(i==1000)
{
//TR1=0;//要這行,就計數一遍就停了,要不停地計數就要刪掉
i=0;
P0=smgan[n++];
if(n==16) n=0;
}
⑸ 單片機程序:兩位數碼管記秒【加分】
1.單片機用89C51或者89C52,P0 P2進行顯示數據的輸出, P3.0鍵接按鍵。 數碼管用共陰極數碼管。
2.主要功能:按鍵控制,按一下計秒再按停止。技術顯示從0到99循環開始。
採用定時計數器T0實現秒中斷:
#include <REG52.H> //注意頭文件,調試的時候你的軟體裡面是否有這個文件
#define pb P3_0
unsigned int int_count=0;//T0中斷計數
unsigned char second=0;//秒計數
unsigned char count=0;//分支選擇,計數器開和關
unsigned char reg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//共陰極數碼管碼值表
void Key_delay()//按鍵延時
{unsigned char i,j;
for(i=100;i>0;i--)
for(j=248;j>0;j--);
}
void t0() interrupt 1 using 0 //T0中斷函數 4000次一個循環 一個循環一秒
{int_count++;
if(int_count==4000)
{int_count=0;
second++;
if(second>99)
second=0;
}
}
void Key_scan()//按鍵掃描函數
{
if(pb==1)
{Key_delay();
if(pb==1)
Key_delay();//此延時主要考慮到個人的視覺感受和按鍵操作合理時間
count++;
switch(count)
case 0: break;
case 1: TR0=1;break;//開定時器
case 2: TR0=0;count=0;break;
}
}
void main()
{unsigned char sacn//按鍵掃描變數
TMOD=0X02;//8位自動重裝
TH0=0x06;
TL0=0x06;//250us中斷一次
ET0=1;
EA=1;//開單片機中斷
while(1)//等待中斷
{if(int_count)
{sacn=int_count;
if(!(scan%40))//10ms進行一次按鍵掃描
Key_scan();//調用按鍵掃描函數
P0=seg[second/10]//10位輸出
P2=seg[second%10]//個位輸出
}
}
}
注意共陰極數碼管的連接方式:P0P2口低位到高位分別連接到兩個數碼管的a到g腳,因為連接方式決定了顯示數據的編碼方式;P0口務必要接上拉電阻。
⑹ 單片機數碼管顯示的數值編碼
8位數據匯流排,16位地址匯流排的CPU;具有布爾處理能力和位處理能力;採用哈佛結構,程序存儲器與數據存儲器地址空間各自獨立,便於程序設計;相同地址的64KB程序存儲器和64KB數據存儲器;
0-8KB片內程序存儲器(8031無,8051有4KB,8052有8KB,89C55有20KB);128位元組片內數據存儲器(8051有256位元組);
32根雙向並可以按位定址的I/O線;兩個16位定時/計數器(8052有3個);一個全雙工的串列I/O介面;多個中斷源的中斷結構,具有兩個中斷優先順序;片內時鍾振盪器。
(6)單片機數碼管計數擴展閱讀:
單片機工作的三個條件分別是電源、時鍾晶振、復位。當單片機不能正常工作時,我們首先就要檢查這三個條件,用電壓表或者萬用表檢測他的電源和接地腳,檢測兩個引腳之間的電壓是不是5V左右;對於時鍾晶體振盪有沒有正常工作。
最好用示波器進行檢測,看能否檢測到相應頻率的正弦波脈沖;復位檢測比較簡單,單片機的復位電平一般是高電平復位,單片機在接通電源的時候一般復位引腳上會出現5V左右的高電平,另外在按下復位按鍵時,復位引腳上也會出現高電平,用一般的電壓表或者萬用表都可以進行檢測。
⑺ 利用51單片機,4個數碼管設計一個計時器,要求在數碼管上顯示的數據從0開始每1秒鍾加1。
共陽數碼管中斷程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x83,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uint num,a;
uchar ,shi,ge;
void init();
void delay(uint);
void display(uchar,ucharshi,ucharge);
uint fb();
uint fs();
uint fg();
void main()
{
init();
while(1)
{
display(fb(),fs(),fg());
}
}
void init()
{
num=0;
a=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(uchar,ucharshi,ucharge)
{
P1=0xfd;
P0=table[];
delay(1);
P1=0xfb;
P0=table[shi];
delay(1);
P1=0xf7;
P0=table[ge];
delay(1);
}
void timeoff() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65526-50000)%256;
a++;
if(a%20==0)
{
num++;
if(num==999)
{
num=0;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uint fb()
{
=num/100;
return ;
}
uint fs()
{
shi=num%100/10;
return shi;
}
uint fg()
{
ge =num%100%10;
return ge;
}
(7)單片機數碼管計數擴展閱讀
2個可編程定時/計數器·5個中斷源,2個優先順序(52有6個)
一個全雙工串列通信口
外部數據存儲器定址空間為64kB
外部程序存儲器定址空間為64kB
邏輯操作位定址功能·雙列直插40PinDIP封裝
單一+5V電源供電
CPU:由運算和控制邏輯組成,同時還包括中斷系統和部分外部特殊功能寄存器;
RAM:用以存放可以讀寫的數據,如運算的中間結果、最終結果以及欲顯示的數據;
ROM:用以存放程序、一些原始數據和表格;
I/O口:四個8位並行I/O口,既可用作輸入,也可用作輸出
T/C:兩個定時/記數器,既可以工作在定時模式,也可以工作在記數模式;
五個中斷源的中斷控制系統;
一個全雙工UART(通用非同步接收發送器)的串列I/O口,用於實現單片機之間或單片機與微機之間的串列通信;
片內振盪器和時鍾產生電路,石英晶體和微調電容需要外接。最佳振盪頻率為6M—12M。
參考資料來源:網路-51單片機
⑻ 單片機上數碼管的位碼是怎樣計數出來
位碼選擇就是對應你的幾個(一般是六個或者八個)數碼管的哪幾個亮,與段碼區分開來,至於怎麼確定位碼就要看你連接位碼用的是哪幾個io埠了,然後一一對應起來,想點亮那個數碼管就改變對應的那一個二進制位的電平就可以了。。。。
⑼ 單片機數碼管動態顯示0-100
給你簡單的修改了一下,如果你的數碼管編碼沒錯,應該可以顯示 0~99的
沒添加百位顯示,所以只有 0~99
//數碼管動態顯示+1,顯示範圍0-100,定時時間1s
#include<reg52.h>
sbit la=P2^6; //定義段選信號
sbit wela=P2^7; //定義位選信號
char aa,temp,,shi,ge;
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay(int z); //延遲函數聲明
void display(char d); //顯示函數聲明
void init(); //初始化函數聲明
/*******************************************************************************/
/*******************************************************************************/
void main()
{
init(); //調用初始化子函數
while(1)
{
display(temp); //調用顯示子函數
}
}
/*******************************************************************************/
/*******************************************************************************/
void delay(int z) //延遲子函數
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************************************************************************/
/*******************************************************************************/
void display(char d) //顯示子函數
{
char d1,d2;
d2=d%10; //取個位 %求余
d1=(d/10)%10; //取十位
P0=table[d2]; la=0; delay(10); la=1;//個位顯示
P0=table[d1]; wela=0; delay(10); wela=1;//十位顯示
}
/*******************************************************************************/
/*******************************************************************************/
void init() //初始化子函數
{
la=0;
wela=0;
temp=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*******************************************************************************/
/*******************************************************************************/
void timer0() interrupt 1 //中斷處理子函數
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重載初值
aa++;
if(aa==20) //判斷定時是否到達1s
{ aa=0; temp++ ; }
if(temp==100) //限制temp變化的范圍,使之不超過100
{ temp=0; }
}
/*******************************************************************************/
/*******************************************************************************/
/*/////////////////////////////////////////////////////////////////////////////*/
⑽ 利用51單片機和3位數碼管實現10分鍾內的簡易計時器
修改如下:
#include<reg51.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbitkey1=P2^7;
sbitkey2=P2^6;
sbitweiH=P3^0;
sbitweiM=P3^1;
sbitweiL=P3^2;
uintnum=0,ge=0,shi=0,fen=0,k;//num用來計數,ge為各位顯示,shi為十位顯示,fen為分鍾顯示
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=110;j>0;j--);
}
ucharkey1scan(void)
{if(key1==0)
{delayms(10);
if(key1==0)
{while(!key1);
return1;
}
return0;
}
ucharkey2scan(void)
{if(key2==0)
{delayms(10);
if(key2==0)
{while(!key2);
return1;
}
}
return0;
}
voidshowtime()interrupt1//時間顯示
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num++;
num%=3;
switch(num)
{
case0:
weiL=1;//顯示秒的個位
P1=0xff;
P1=table[ge];
delayms(5);
weiL=0;
break;
case1:
weiM=1;//顯示秒的十位
P1=0xff;
P1=table[shi];
delayms(5);
weiM=0;
break;
case2:
weiH=1;//顯示分鍾,只顯示0-9
P1=0xff;
P1=table[fen];
delayms(5);
weiH=0;
break;
}
voidmain()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
num=0;
while(1)
{
if((key1scan()==1)&&(key2scan()!=1))break;//按鍵1按下,按鍵2未按下開始計時
}
while(1)
{
delay(1000);
ge++;
if(ge>9)
{
ge=0;
shi++
if(shi>5)
{
fen++;
if(fen>9)fen=0;
}
}
showtime();
}
}