機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
基于PIC16F877A的秒表程序
基于PIC16F877A的秒表程序
 更新時間:2008-7-26 17:03:34  點(diǎn)擊數(shù):3
【字體: 字體顏色
//該源程序已在實(shí)驗(yàn)板上調(diào)試通過,讀者可直接引用,并可利用軟件編程的靈活性,加以拓展,實(shí)現(xiàn)更為復(fù)雜的功能。

//此程序?qū)崿F(xiàn)計時秒表功能,時鐘顯示范圍00.00~99.99秒,分辨度:0.01秒

//定義0.01 秒、0.1 秒、1秒、10秒計時器
#include <pic.h>
#include  <math.h>
unsigned  char  s0,s1,s2,s3;
unsigned  char   s[4];
unsigned  char   k ,data ,sreg;
unsigned   int  i;
const table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不帶小數(shù)點(diǎn)的顯示段碼表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//帶小數(shù)點(diǎn)的顯示段碼表
//TMR0初始化子程序
void  tmint()
{
 T0CS=0;    //TMR0工作于定時器方式
 PSA=1;     //TMR0不用分頻
 T0IF=0;     //清除TMR0的中斷標(biāo)志
 T0IE=1;     //TMR0中斷允許
}
//spi顯示初始化子程序
void  SPIINIT()
{
 PIR1=0;
 SSPCON=0x30;
 SSPSTAT=0xC0;
//設(shè)置SPI的控制方式,允許SSP方式,并且時鐘下降沿發(fā)送。與"74HC595,當(dāng)其
//SCLK從低到高跳變時,串行輸入寄存器"的特點(diǎn)相對應(yīng)
 TRISC=0xD7;   //SDO引腳為輸出,SCK引腳為輸出
 TRISA5=0;    //RA5引腳置為輸出,輸出顯示鎖存信號
}
//系統(tǒng)其它部分初始化子程序
void  initial()
{
 TRISB1=0;
 TRISB2=0;
 TRISB4=1;
 TRISB5=1;    //設(shè)置與鍵盤有關(guān)的各口的輸入輸出方式
 RB1=0;
 RB2=0;     //建立鍵盤掃描的初始條件
}
//SPI傳輸數(shù)據(jù)子程序
void   SPILED(data)
{
 SSPBUF=data;   //啟動發(fā)送
 do {
     ;
  }while(SSPIF==0);
 SSPIF=0;
}
//顯示子程序,顯示4位數(shù)
void  dispaly()
{
 RA5=0;     //準(zhǔn)備鎖存
 for(k=4;k>0;k--)
 {
  data=s[k-1];
  if(k==3) data=table0[data];//第二位需要顯示小數(shù)點(diǎn)
  else data=table[data];
  SPILED(data);  //發(fā)送顯示段碼
 }
 for(k=0;k<4;k++)
 {
  data=0xFF;
  SPILED(data);  //連續(xù)發(fā)送4個DARK,使顯示好看一些
 }
 RA5=1;     //最后給鎖存信號,代表顯示任務(wù)完成
}
//軟件延時子程序
void   DELAY()
{
 for(i = 3553; --i ;) continue;

//鍵掃描子程序
void  KEYSCAN()
{
while(1){ 
while(1)
 {
  dispaly();   //調(diào)用一次顯示子程序
  if ((RB5==0)||(RB4==0)) break;
 }
  DELAY();   //若有鍵按下,則軟件延時
  if ((RB5==0)||(RB4==0)) break;//若還有鍵按下,則終止循環(huán)掃描,返回
   }
}
//等鍵松開子程序
void  keyrelax()
{
while(1){
 dispaly();    //調(diào)用一次顯示子程序
 if ((RB5==1)&&(RB4==1)) break;
 }      //為防止按鍵過于靈敏,每次等鍵松開才返回
}
//系統(tǒng)賦值初始化子程序
void  inizhi()

 s0=0x00;
 s[0]=s0;
 s1=0x00;
 s[1]=s1;
 s2=0x00;
 s[2]=s2;
 s3=0x00;
 s[3]=s3;     //s0=s1=s2=s3=0,并放入顯示緩沖數(shù)組中
 sreg=0x00;    //tmr0中斷次數(shù)寄存器清0
}
//中斷服務(wù)程序
void  interrupt clkint(void)
{
 TMR0=0X13;   //對TMR0寫入一個調(diào)整值。因?yàn)閷懭隩MR0后接著的
 //兩個周期不能增量,中斷需要3個周期的響應(yīng)時間,
 //以及C語言自動進(jìn)行現(xiàn)場保護(hù)要消耗周期
 T0IF=0;     //清除中斷標(biāo)志
 CLRWDT();
 sreg=sreg+1;    //中斷計數(shù)器加1
 if(sreg==40)    //中斷次數(shù)為40后,才對S0,S1,S2,S3 操作
 {
  sreg=0;
  s0=s0+1;
  if(s0==10){
   s0=0 ;
   s1=s1+1;
   if(s1==10){
    s1=0 ;
    s2=s2+1;
    if(s2==10){
     s2=0;
     s3=s3+1;
     if(s3==10) s3=0 ;
    }
   }
  }
 }
 s[0]=s0;
 s[1]=s1;
 s[2]=s2;
 s[3]=s3;
}
//主程序
main()
{
 OPTION=0XFF;
 tmint();     //TMR0初始化
 SPIINIT();    //spi顯示初始化
 initial();     //系統(tǒng)其它部分初始化
 di();     //總中斷禁止
 while(1) { 
  inizhi();    //系統(tǒng)賦值初始化
  KEYSCAN();  //鍵掃描,直到開始鍵按下
  keyrelax();   //等鍵松開
  ei();    //總中斷允許
  TMR0=0X08;
 KEYSCAN();  //鍵掃描直到停止鍵按下,在鍵掃描時有顯示
  keyrelax() ;   //等鍵松開
  di();    //總中斷禁止
  KEYSCAN();  //鍵掃描到清0鍵按下,在鍵掃描時有顯示 
  keyrelax() ;   //等鍵松開
 }
}

  • 上一篇: 基于PIC16F72的兩路交流信號AD轉(zhuǎn)換(C程序)
  • 下一篇: 基于PIC16F877A的簡易數(shù)字頻率計
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1