天天看點

數位管實驗報告

/*************************************************

實驗名稱:數位管實驗一

實驗目的:利用動态掃描方法在六位數位管上顯示出穩定

          的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

繼續閱讀