/*************************************************
實驗名稱:數位管實驗一
實驗目的:利用動态掃描方法在六位數位管上顯示出穩定
的654321
*************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DUAN = P2^6;
sbit WEI = P2^7;
uchar code duan_table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code wei_table[]=
{0xfe,0xfd,0xfb,
0xf7,0xef,0xdf};
void delay_1ms(int);
void main()
{
int i,j;
j =0;
while(1)
for(i = 7;i > 1; i--)
{
/*P0 = duan_table[i-1];
DUAN = 1;
DUAN = 0;
P0 = 0xff;
P0 = wei_table[j++];
WEI = 1;
WEI = 0;
delay_1ms(1);
以上代碼将會産生餘晖,改用以下代碼消除餘晖*/
P0 = duan_table[i-1];
P0 = 0xff;//消除餘晖
}
if(j == 6)
j = 0;
void delay_1ms(int x)
int i, j;
for(i = 0; i < x; i++)
for(j = 0; j < 110; j++);
/**************************************************
實驗名稱:數位管實驗二
實驗目的:利用動态掃描方法和定時器1在數位管的前三位
顯示出秒表,精确到1%秒,即後兩位顯示1%秒,
一直循環下去。(TH/TL填裝9216)
**************************************************/
sbit SPK = P2^3;
uchar S_ms, B_ms, S;
uchar code duan_table0[]=
uchar code duan_table1[]=
{0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef};
void delay_1ms(uchar);
void display(uchar,uchar,uchar);
S_ms = 0;
B_ms = 0;
S = 0;
TMOD = 0x10;
TH1 = (65535-9216)/256;
TL1 = (65535-9216)%256;
EA = 1;
ET1 = 1;
TR1 = 1;
if(S_ms == 10)
B_ms++;
if(B_ms == 10)
S++;
SPK = 0; //每過一秒響一聲
delay_1ms(10); //
SPK = 1; //
if(S == 10)
S=0;
display(S,B_ms,S_ms);
void delay_1ms(uchar x)
uchar i, j;
for(j = 0; j <110; j++);
void Time1() interrupt 3
S_ms++;
void display(uchar i,uchar j,uchar k)
P0 = duan_table1[i];
P0 = wei_table[0];
P0 = duan_table0[j];
P0 = wei_table[1];
P0 = duan_table0[k];
P0 = wei_table[2];
實驗名稱:數位管實驗三
實驗目的:利用動态掃描和定時器1,在數位管上顯示出從
765432開始以1%秒的速度往下遞減直至764987,
并保持顯示次數,與此同時利用定時器0以500ms
的速度進行流水燈從上至下移動,同時蜂鳴器
發聲,當數位光上數減到停止時,實驗闆上流
水燈全部閃爍5次,數位管全熄滅。單片機進入
休眠狀态。(0.01秒填裝9216)
實驗備注:該程式暫時解決不了因中斷沖突而引起的數位管
顯示延遲
#include<intrins.h>
long num;
uchar swan,wan,qian,bai,shi,ge,flag_0,flag_1;
void delay_1ms(uint);
void display(uchar,uchar,uchar,uchar,uchar,uchar);
uchar i;
flag_0 = 0;
flag_1 = 0;
num = 765432;
P1 = 0x7f;
TMOD = 0x11;
TH1 = (65536-9216)/256;
TL1 = (65536-9216)%256;
ET0 = 1;
//EX0 = 1;
// EX1 = 1;
TR0 = 1;
if(flag_0 == 10)
P1 = _cror_(P1,1);
SPK = 0;
delay_1ms(100);
SPK = 1;
if(flag_1 == 90)
num = num - 90;
swan = num/100000;
wan = num/10000%10;
qian = num/1000%10;
bai = num/100%10;
shi = num%100/10;
ge = num%10;
display(swan,wan,qian,bai,shi,ge);
if(num == 764987)
ET0 = 0;
ET1 = 0;
for(i = 0;i < 5;i++)
P1 = 0;
delay_1ms(500);
P1 = 1;
PCON = 0x2;
void delay_1ms(uint x)
for(i = 0;i < x;i++)
for(j = 0;j < 110;j++);
void display(uchar swan,uchar wan,uchar qian,
uchar bai,uchar shi,uchar ge)
P0 = duan_table[swan];
P0 = duan_table[wan];
P0 = duan_table[qian];
P0 = duan_table[bai];
P0 = wei_table[3];
P0 = duan_table[shi];
P0 = wei_table[4];
P0 = duan_table[ge];
P0 = wei_table[5];
void Timer0() interrupt 1
TH0 = (65536-46080)/256;
TH0 = (65536-46080)%256;
flag_0++;
void Timer1() interrupt 3
flag_1++;
//void Ex_int0() interrupt 0
//{}
//void Ex_int1() interrupt 2