新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PIC單片機計時秒表程序設(shè)計

PIC單片機計時秒表程序設(shè)計

作者: 時間:2012-12-11 來源:網(wǎng)絡(luò) 收藏

//此程序?qū)崿F(xiàn)功能,00.00~99.99秒,分辨度:0.01秒

#include "p18f458.h"

unsigned char s[4]; //定義0.01 秒、0.1 秒、1秒、10秒計時器
unsigned char k,data,sreg;
unsigned int i;
const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};
//不帶小數(shù)點的顯示段碼表
const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
//帶小數(shù)點的顯示段碼表

void clkint(void);

//TMR0初始化子程序
void tmint()
{
T0CON=0XCF; //設(shè)定TMR0L工作于8位定時器方式
//內(nèi)部時鐘,TMR0不用分頻
INTCON=0X20; //總中斷禁止,TMR0中斷允許,清除TMR0的中斷標(biāo)志
INTCON2bits.TMR0IP=1; //TMR0中斷高優(yōu)先級
RCONbits.IPEN=1; //使能中斷優(yōu)先級
}

//系統(tǒng)其它部分初始化子程序
void initial()
{
TRISA=0x00; //A口設(shè)置為輸出
TRISB=0XF0; //RB1輸出,RB4輸入
TRISC=0x00; //SDO引腳為輸出,SCK引腳為輸出
TRISE=0x00; //E口設(shè)置為輸出
SSPCON1=0x30; //SSPEN=1;CKP=1,F(xiàn)OSC/4
SSPSTAT=0xC0; //時鐘下降沿發(fā)送數(shù)據(jù)
PIR1=0; //清除SSPIF標(biāo)志
data=0X00; //待顯示的寄存器賦初值
PORTBbits.RB1=0;
PORTAbits.RA3=0;
PORTE=0; //將K1,K2,K3,K4四條列線置0
}

//SPI傳輸數(shù)據(jù)子程序
void SPILED(char data)
{
SSPBUF=data; //啟動發(fā)送
do
{
;
}while(PIR1bits.SSPIF==0);
PIR1bits.SSPIF=0;
}

//顯示子程序,顯示4位數(shù)
void dispaly()
{
PORTAbits.RA5=0; //準(zhǔn)備鎖存
for(k=0;k4;k++)
{
data=s[k];
if(k==2) data=table0[data]; //個位需要顯示小數(shù)點
else data=table[data];
SPILED(data); //發(fā)送顯示段碼
}
for(k=0;k4;k++)
{
data=0xFF;
SPILED(data); //連續(xù)發(fā)送4個DARK,使顯示好看一些
}
PORTAbits.RA5=1; //最后給鎖存信號,代表顯示任務(wù)完成
}

//軟件延時子程序
void DELAY()
{
for(i = 3553; --i ;)
continue;
}

//鍵掃描子程序
void KEYSCAN()
{
while(1)
{
dispaly(); //調(diào)用一次顯示子程序
while(PORTBbits.RB4==0)
{
DELAY(); //若有鍵按下,則軟件延時
break;
}
if (PORTBbits.RB4==0) break; //若還有鍵按下,則終止循環(huán)掃描,返回
}
}

//等鍵松開子程序
void keyrelax()
{
while(1)
{
dispaly(); //調(diào)用一次顯示子程序
if (PORTBbits.RB4==1) break; //為防止按鍵過于靈敏,每次等鍵松開才返回
}
}

/*高優(yōu)先級中斷向量*/
#pragma code InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
_asm
goto clkint //跳到中斷程序
_endasm
}

//中斷服務(wù)程序
#pragma code
#pragma interrupt clkint
void clkint()
{
TMR0=0X13; //對TMR0寫入一個調(diào)整值。因為寫入TMR0后接著的
//兩個周期不能增量,中斷需要3個周期的響應(yīng)時間,
//以及C語言自動進(jìn)行現(xiàn)場保護要消耗周期
INTCONbits.T0IF=0; //清除中斷標(biāo)志
sreg=sreg+1; //中斷計數(shù)器加1
if(sreg==40) //中斷次數(shù)為40后,才對S0,S1,S2,S3 操作
{
sreg=0;
s[0]=s[0]+1;
if(s[0]==10)
{
s[0]=0 ;
s[1]=s[1]+1;
if(s[1]==10)
{
s[1]=0 ;
s[2]=s[2]+1;
if(s[2]==10)
{
s[2]=0;
s[3]=s[3]+1;
if(s[3]==10) s[3]=0;
}
}
}
}
}

51單片機相關(guān)文章:51單片機教程


c語言相關(guān)文章:c語言教程


單片機相關(guān)文章:單片機教程


單片機相關(guān)文章:單片機視頻教程


單片機相關(guān)文章:單片機工作原理



上一頁 1 2 3 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉