㈠ 如何利用單片機讓4位數碼管顯示
程序如下(用的是STC89C52晶元):
#include<reg52.h>//52系列單片機頭文件
#defineucharunsignedchar
#defineuintunsignedint
uintx,y;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//共陰極數碼管編碼
voiddisplay(uchar,uchar,uchar,uchar);//聲明子函數
voiddelay(int);//聲明子函數
voidmain()
{
while(1)
{
display(1,2,3,4);//主程序始終調用數碼管顯示子程序
}
}
voiddisplay(uchara,ucharb,ucharc,uchard)
{
P2=0xef;
P0=table[a];//給第一個數碼管送"a"
delay(1);//延時1ms
P2=0xdf;
P0=table[b];//給第二個數碼管送"b"
delay(1);//延時1ms
P2=0xbf;
P0=table[c];//給第三個數碼管送"c"
delay(1);//延時1ms
P2=0x7f;
P0=table[d];//給第三個數碼管送"d"
delay(1);//延時1ms
}
voiddelay(uintz)//延時子函數
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(1)52單片機數碼管程序擴展閱讀
led數碼管是由多個發光二極體封裝在一起組成「8」字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。led數碼管常用段數一般為7段有的另加一個小數點,還有一種是類似於3位「+1」型。
位數有半位,1,2,3,4,5,6,8,10位等等,led數碼管根據LED的接法不同分為共陰和共陽兩類,了解LED的這些特性,對編程是很重要的,因為不同類型的數碼管,除了它們的硬體電路有差異外,編程方法也是不同的。
㈡ 單片機控制一個4位的共陰數碼管通電的狀態下顯示時間的程序
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit PRESS1=P1^0;
sbit PRESS2=P1^1;
sbit PRESS3=P1^2;
uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9
uint b[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
int miao=45,fen=58,shi=15;
uint jishu;
uint miaog,miaos,feng,fens,shig,shis;
int ji;
void init()//初始化函數設置中斷寄存器的值。
{
jishu=0;
TMOD=0x01;
TR0=1;
ET0=1;
EA=1;
TH0=0x3c;
TL0=0xb0;
}
void delay(x)//延時函數。
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void xian()//把時分秒送到數碼管顯示。
{
uint i;
miaog=miao%10;
miaos=miao/10;
feng=fen%10;
fens=fen/10;
shig=shi%10;
shis=shi/10;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:P3=b[7];P2=a[miaog];break;
case 1:P3=b[6];P2=a[miaos];break;
case 2:P3=b[5];P2=0x40;break;
case 3:P3=b[4];P2=a[feng];break;
case 4:P3=b[3];P2=a[fens];break;
case 5:P3=b[2];P2=0x40;break;
case 6:P3=b[1];P2=a[shig];break;
case 7:P3=b[0];P2=a[shis];break;
}
delay(1);
};
}
void jiance()//檢測鍵是否按下按不同鍵實現不同的處理。
{
if(PRESS1==0)
{
delay(2);
if(PRESS1==0)
{
while(!PRESS1);
ji++;
if(ji>=4)
ji=0;
}
}
if(ji==1)
{
if(PRESS2==0)
{
delay(1);
while(!PRESS2);
miao++;
if(miao>=60)
{
miao=0;
fen++;
}
}
if(PRESS3==0)
{
delay(1);
while(!PRESS3);
miao--;
if(miao<0)
{
miao=59;
}
}
}
if(ji==2)
{
if(PRESS2==0)
{
delay(1);
while(!PRESS2);
fen++;
if(fen>=60)
{
fen=0;
shi++;
}
}
if(PRESS3==0)
{
delay(1);
while(!PRESS3);
fen--;
if(fen<0)
{
fen=59;
}
}
}
if(ji==3)
{
if(PRESS2==0)
{
delay(1);
while(!PRESS2);
shi++;
if(shi>=24)
{
shi=0;
}
}
if(PRESS3==0)
{
delay(1);
while(!PRESS3);
shi--;
if(shi<0)
{
shi=23;
}
}
}
if(ji==0)
EA=1;
else
EA=0;
}
void main()
{
init();
while(1)
{
xian();
jiance();
}
}
void an() interrupt 1 //計時中斷0工作方式1函數。
{
TH0=0x3c;
TL0=0xb0;
jishu++;
if(jishu==20)
{
jishu=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
㈢ 求單片機數碼管倒計時程序
#include<reg52.h>
#include <intrins.h> //內部包含延時函數 _nop_();
#define uchar unsigned char
#define uint unsigned int sbit d1=P2^0; sbit key1=P0^4;
sbit SDATA_595=P0^0; //串列數據輸入 ----接板卡上的SPI 數據信號輸入端
sbit SCLK_595=P0^1; //移位時鍾脈沖(輸入口) ---接板卡上的SPO----串列時鍾線----SHcp移位時鍾信號輸入端
sbit RCK_595=P0^2; //輸出鎖存器控制脈沖 ----接板卡上SPK STcp鎖存信號輸入端
uchar code an[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar num=60;
void delay(uint z);
void aa595_in(uchar Data) {
uchar i;
for(i=0;i<8;i++)
{SCLK_595=0; Data<<=1; SDATA_595=CY;
SCLK_595=1; SCLK_595=0;
}
}
void a595_in(uchar Data) {
uchar i;
for(i=0;i<8;i++) {
SCLK_595=0; Data<<=1; SDATA_595=CY;
SCLK_595=1; SCLK_595=0;
}
}
void aa595_out(void) {
RCK_595=0;
_nop_(); _nop_();
RCK_595=1;
_nop_(); _nop_();
RCK_595=0;
}
void main() {
uchar ge,shi;
while(1) {
if(key1==0) {
delay(10);
if(key1==0)
{d1=0; num--;
if(num==0)
num=60;}
while(!key1);//鬆手檢測
delay(10);//延時10ms
while(!key1);//再鬆手檢測
}
else d1=1;
// aa595_in(an[num]);
// aa595_in(wei[3]);
shi=num/10;
ge=num%10;
a595_in(an[shi]);
aa595_in(wei[3]);
aa595_out();
delay(10);
aa595_in(an[ge]);
aa595_in(wei[2]);
aa595_out();
delay(10);}
}
void delay(uint z) {
uint x,y;
for(x=100;x>0;x--) for(y=z;y>0;y--);
}//延時子程序,延時Zms