❶ 用51單片機程序顯示3位7段數碼管,求具體程序
假設為共陰極數碼管,驅動輸入端接單片機P1口,共陰極接P2口的0.1.2.腳。我的程序如下,當前顯示數字123
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef long int uint32;
code uint8 number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay_ms(uint16 x)//1ms延時
{
uint8 i = 121;
while(x > 0)
{
i = 121;
while(i > 0)
i --;
x --;
}
}
void xianshi(uint16 x)
{
uint8 i=0;
for(i=0;i<=2;i++)
{
P2=~(1<<i);
switch(i)
{
case 0:P1=number[(x/1)%10];break;
case 1:P1=number[(x/10)%10];break;
case 2:P1=number[(x/100)%10];break;
default:break;
}
delay_ms(10);
}
}
main()
{
while(1)
{
xianshi(123);
}
}
❷ 3位數碼管引腳圖,與單片機的接法!如何區分共陰共陽!
如果有電路圖,你可以參考電路圖。至於是共陰或共陽,你可以用代碼來測試一下,讓連接數碼管的IO輸出高電平或低電平。大部分單片機的數碼管都是共陽極的,因為單片機IO默認輸出是高電平。共陰或共陽關鍵在「共」字上,只要用萬用表測量數碼管的8個引腳中那一個引腳是接電源的負極或是正極,只要找出這一個引腳就知道是共陰或是共陽了,因為只有一個引腳和其他的7個引腳是不同的。
❸ 用51單片機設計3位led數碼顯示管作秒錶00.0-99.0求設計電路與c語言程序
#include "STC12C54.H"
#define uchar unsigned char
#define uint unsigned int
#define dataport P1//P1直接驅動數碼管的8個陽極
sbit wei1=P3^3;//再有三個管腳接3個三極體驅動數碼管的陰極
sbit wei2=P3^4;
sbit wei3=P3^5;
uint a=0;//中斷次數計數,一次50ms,20次為1 秒
//共陰數碼管七段碼
uchar TABLE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延時子程序
void delay1ms(uint t)
{
uint i,j,k;
for(i=t;i>0;i--)
for(j=15;j>0;j--)
for(k=27;k>0;k--);
}
//顯示子程序
void display(uint n)
{
uchar a1,a2,a3;
a1=n/100%10;
a2=n/10%10;
a3=n%10;
wei1=1;
dataport=TABLE[a1];
delay1ms(1);
wei1=0;
dataport=0x80|TABLE[a2];//這里多個小數點
delay1ms(1);
wei3=1;
dataport=TABLE[a3];
delay1ms(1);
wei3=0;
}
void init(void)
{
TMOD=0X01;
TH0=(655536-50000)/256;//定時50ms
TL0=(655536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P1M0=0;
P1M1=0xff;//P1口設為推挽輸出,驅動能力強
P3M0=0;
P3M1=0x38;//P3.3P3.4 P3.5口設為推挽輸出
}
void main(void)//主程序
{
init();//初始狀態設定
while(1)
{
display(a/2);//顯示計數值,以十分之一秒為單位
}
}
void timer0(void)interrupt 1//中斷子程序
{
TH0=(655536-50000)/256;
TL0=(655536-50000)%256;
a++;
if(a==1980)a=0;//1980次是99秒
}
❹ 利用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();
}
}