專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51單片機(jī)時(shí)鐘秒表課程設(shè)計(jì)

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年11月18日   【字體:

這個(gè)是我寫(xiě)的作業(yè)的方案,單片機(jī)課程結(jié)課作業(yè),以下是我寫(xiě)的設(shè)計(jì)方案,寫(xiě)的不咋滴 歡迎拍磚。。

一、詳細(xì)功能設(shè)計(jì)

1、基于51單片機(jī)倒計(jì)時(shí)秒表,最大值為9999秒,計(jì)時(shí)單位為0.1秒;

2、計(jì)時(shí)的初始值為組員學(xué)號(hào)后4位,鍵盤(pán)啟動(dòng)/停止計(jì)時(shí);

3、設(shè)計(jì)多個(gè)按鍵,使用鍵盤(pán)選擇不同成員的學(xué)號(hào)作為初始值。
二、8031最小系統(tǒng)設(shè)計(jì)

1、最小系統(tǒng)設(shè)計(jì)原理圖如圖1.0所示:

 
 

2、8031最小系統(tǒng)概述;

   8031最小系統(tǒng)包含晶振電路與復(fù)位電路。 晶振選擇12MHZ晶振,晶振電容使用30pf電容瓷片電容。復(fù)位電路選擇上電復(fù)位。
三、硬件設(shè)計(jì)

1、數(shù)碼管電路

   在本設(shè)計(jì)中,使用7段共陰極數(shù)碼管,選擇數(shù)碼管的型號(hào)為7SEG-MPX6-CC;

2、數(shù)碼管片選電路;

   由于本設(shè)計(jì)需要顯示五位數(shù)字,同時(shí)為了驅(qū)動(dòng)數(shù)碼管,使用了74HC154芯片。與此同時(shí),使用74HC154芯片還可以擴(kuò)展數(shù)碼管顯示數(shù)字的個(gè)數(shù)。
三、軟件設(shè)計(jì)

1、程序流程圖如圖3.0所示:


 

圖3.0 程序流程圖

2、程序流程說(shuō)明

   數(shù)碼管顯示和掃描鍵盤(pán)子函數(shù)放在0.1秒的定時(shí)器中斷里,而主函數(shù)的while(1)函數(shù)向數(shù)碼管顯示數(shù)據(jù)變量送數(shù)據(jù)。數(shù)碼管顯示函數(shù)接受鍵盤(pán)狀態(tài),根據(jù)狀態(tài)執(zhí)行開(kāi)始計(jì)時(shí)、暫停、選擇學(xué)號(hào)等功能。
四、調(diào)試說(shuō)明

1、仿真調(diào)試如圖4.0所示:



圖4.0 proteus 仿真效果

2、按下以組員的名字命名的按鍵時(shí),可以選擇相應(yīng)同學(xué)的學(xué)號(hào)的后四位為倒計(jì)時(shí)的初始值,如不設(shè)置初始值為0336,若按下“張洪榮”按鍵,初始值為0337;按下“開(kāi)始”按鍵時(shí)開(kāi)始倒計(jì)時(shí);按下“暫停”按鍵時(shí),計(jì)時(shí)停止;
附錄:源代碼下載:http://www.torrancerestoration.com/f/szgg.rar

1,程序源碼;

#include <string.h>

#include <stdio.h>

#include <reg51.h>

int num =03;         //我們學(xué)號(hào)的班別 03

int stu_num0 =36;        //學(xué)號(hào)后兩位

int stu_num1 =37;

int stu_num2 =42;

int stu_num3 =11;

int stu_num4 =22

int num_count = 36;         //將學(xué)號(hào)吼兩位選擇的值賦給 num_count,初始值為36

sbit start = P1^0;        //開(kāi)始按鍵

sbit stop  = P1^1;        //停止按鍵

sbit key0 = P1^2;        //選擇同學(xué)

sbit key1 = P1^3;        //選擇同學(xué)

sbit key2 = P1^4;         //選擇同

sbit key3 = P1^5;        //選擇同學(xué)

sbit key4 = P1^6;        //選擇同學(xué)

sbit key5 = P1^7;                 

unsigned int T1msc;

unsigned char Ledc;

unsigned char Leds[]={8,6,0x13,5,1,2,3,4};                   

bit isStart;

int temp=9;  //0.1秒存儲(chǔ)變量 初始值 9

code char LEDTAB[]=

{

  0x3f,0x06,0x5b,0x4f,0x66,

  0x6d,0x7d,0x07,0x7f,0x6f,

  0x00,

};

void Delayms(int ms)

{

  while(ms)

  {

    unsigned char i;

    ms--;

    for (i=0; i<240; i++);

  }

}

void display()

{

  char v,c;

  P3=0x11;

  v=Leds[Ledc];

  c=LEDTAB[v & 0x0f];

  if (v&0x10)   c|=0x80;           

  P2=c;

  P3=Ledc;

  Ledc++;

  if (Ledc>=8) Ledc=0;

}

void readkey()                  //讀按鍵

{

       if(start==0)         isStart = 1;        //真為開(kāi)始

           if(stop==0)         isStart = 0;        //假為停止

           if(key0 == 0)   num_count = stu_num0; //選擇曾路榮

           if(key1 == 0)   num_count = stu_num1;//選擇張洪榮

           if(key2 == 0)   num_count = stu_num2;

           if(key3 == 0)   num_count = stu_num3;

           if(key4 == 0)   num_count = stu_num4;

           if(key5 == 0)   num_count = stu_num5;

}

void t0int() interrupt 1 //1ms定時(shí)器中斷服務(wù)函數(shù)

{

  TH0=(-1000)>>8;

  TL0=-1000;

  display();

  readkey();

  T1msc++;

  if (isStart)          //開(kāi)始倒計(jì)時(shí)

  {

     if ((T1msc%100)==0) //滿 0.1秒

         {

                   temp--;

                 if(temp==-1)

                 {

                   num_count--;

                   temp = 10;         //0.1秒恢復(fù)9

                 }

         }          

         if(num_count == -1)   //

         {

           num_count  = 99;

           num--;

           if(num == -1) num = 99;

         }

   }

  if (T1msc>=1000)

  {

      T1msc=0;

  }

}

void NumToLeds()

{

          Leds[1]=num/10%10;

          Leds[2]=num%10;

          Leds[3]=num_count/10%10;

          Leds[4]=num_count%10+0x10;

          Leds[5]=temp;         //0.1秒顯示

}

void main()

{

          Delayms(10);

          TMOD=0x01;

          TR0=1;

          ET0=1;

          EA=1;

          while(1)

          {

             NumToLeds();        //送數(shù)據(jù)

          }

}

關(guān)閉窗口

相關(guān)文章