单片机计时秒表程序设计.docx

上传人:b****1 文档编号:23119503 上传时间:2023-04-30 格式:DOCX 页数:11 大小:18.68KB
下载 相关 举报
单片机计时秒表程序设计.docx_第1页
第1页 / 共11页
单片机计时秒表程序设计.docx_第2页
第2页 / 共11页
单片机计时秒表程序设计.docx_第3页
第3页 / 共11页
单片机计时秒表程序设计.docx_第4页
第4页 / 共11页
单片机计时秒表程序设计.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

单片机计时秒表程序设计.docx

《单片机计时秒表程序设计.docx》由会员分享,可在线阅读,更多相关《单片机计时秒表程序设计.docx(11页珍藏版)》请在冰豆网上搜索。

单片机计时秒表程序设计.docx

单片机计时秒表程序设计

pic单片机计时秒表程序设计(时钟显示X围00.00~99.99秒,分辨度为0.01秒)

    来源:

本站原创    点击数:

1676   更新时间:

2008年07月12日   

//此程序实现计时秒表功能,时钟显示X围00.00~99.99秒,分辨度:

0.01秒

#include"p18f458.h"

unsignedchars[4];//定义0.01秒、0.1秒、1秒、10秒计时器

unsignedchark,data,sreg;

unsignedinti;

consttable[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};

//不带小数点的显示段码表

consttable0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};

//带小数点的显示段码表

voidclkint(void);

//TMR0初始化子程序

voidtmint()

{

T0CON=0XCF;//设定TMR0L工作于8位定时器方式

//内部时钟,TMR0不用分频

INTCON=0X20;//总中断制止,TMR0中断允许,去除TMR0的中断标志

INTCON2bits.TMR0IP=1;//TMR0中断高优先级

RCONbits.IPEN=1;//使能中断优先级

}

//系统其它局部初始化子程序

voidinitial()

{

TRISA=0x00;//A口设置为输出

TRISB=0XF0;//RB1输出,RB4输入

TRISC=0x00;//SDO引脚为输出,SCK引脚为输出

TRISE=0x00;//E口设置为输出

SSPCON1=0x30;//SSPEN=1;CKP=1,FOSC/4

SSPSTAT=0xC0;//时钟下降沿发送数据

PIR1=0;//去除SSPIF标志

data=0X00;//待显示的存放器赋初值

PORTBbits.RB1=0;

PORTAbits.RA3=0;

PORTE=0;//将K1,K2,K3,K4四条列线置0

}

//SPI传输数据子程序

voidSPILED(chardata)

{

SSPBUF=data;//启动发送

do

{

;

}while(PIR1bits.SSPIF==0);

PIR1bits.SSPIF=0;

}

//显示子程序,显示4位数

voiddispaly()

{

PORTAbits.RA5=0;//准备锁存

for(k=0;k<4;k++)

{

data=s[k];

if(k==2)data=table0[data];//个位需要显示小数点

elsedata=table[data];

SPILED(data);//发送显示段码

}

for(k=0;k<4;k++)

{

data=0xFF;

SPILED(data);//连续发送4个DARK,使显示好看一些

}

PORTAbits.RA5=1;//最后给锁存信号,代表显示任务完成

}

//软件延时子程序

voidDELAY()

{

for(i=3553;--i;)

continue;

}

//键扫描子程序

voidKEYSCAN()

{

while

(1)

{

dispaly();//调用一次显示子程序

while(PORTBbits.RB4==0)

{

DELAY();//假设有键按下,那么软件延时

break;

}

if(PORTBbits.RB4==0)break;//假设还有键按下,那么终止循环扫描,返回

}

}

//等键松开子程序

voidkeyrelax()

{

while

(1)

{

dispaly();//调用一次显示子程序

if(PORTBbits.RB4==1)break;//为防止按键过于灵敏,每次等键松开才返回

}

}

/*高优先级中断向量*/

#pragmacodeInterruptVectorHigh=0x08

voidInterruptVectorHigh(void)

{

_asm

gotoclkint//跳到中断程序

_endasm

}

//中断效劳程序

#pragmacode

#pragmainterruptclkint

voidclkint()

{

TMR0=0X13;//对TMR0写入一个调整值。

因为写入TMR0后接着的

//两个周期不能增量,中断需要3个周期的响应时间,

//以及C语言自动进展现场保护要消耗周期

INTCONbits.T0IF=0;//去除中断标志

sreg=sreg+1;//中断计数器加1

if(sreg==40)//中断次数为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;

}

}

}

}

}

//主程序

//.51hei.提供此单片机程序有问题请联系

main()

{

tmint();//TMR0初始化

initial();//spi显示初始化及系统其它局部初始化

INTCONbits.GIE=0;//总中断制止

while

(1)

{

for(k=0;k<4;k++)

{

s[k]=0;

}

sreg=0;//赋显示初值

dispaly();//调用一次显示子程序

KEYSCAN();//键扫描,直到开场键按下

keyrelax();//等键松开

INTCONbits.GIE=1;//总中断允许

KEYSCAN();//键扫描直到停顿键按下,在键扫描时有显示

keyrelax();//等键松开

INTCONbits.GIE=0;//总中断制止

KEYSCAN();//键扫描到清0键按下,在键扫描时有显示

keyrelax();//等键松开

}

}

---------------------汇编语言版本的pic单片机计时秒表程序设计--------------------------------------;此程序实现计时秒表功能

;时钟显示X围:

00.00秒-99.99秒,分辨度:

0.01秒

;通过按键来启动计时、停顿计时及清0

;即第一次按下任意键开场计时,第二次按下任意键停顿计时;第三次按下任意键使LED清0,等待下一次计时开场

LISTP=18F458

INCLUDE"P18F458.INC"

S0EQU0X20;0.01秒计时器

S1EQUS0+1;0.1秒计时器

S2EQUS0+2;1秒计时器

S3EQUS0+3;10秒计时器

SREGEQUS0+4;软计数器

LEDFEQUS0+5;显示的LED的位置指示存放器

XW_TEMPEQUS0+6;用于中断中保护W的值

XHOSTSEQUS0+7;用于中断中保护STATUS的值

DEYHEQUS0+8

DEYLEQUS0+9;以上两个存放器用于软件延时

HOSTFEQUS0+0A;用于中断中保护FSR0L的值

TEMPEQUS0+0B;用于存放临时值

ORG0X00

GOTOMAIN

ORG0X08

GOTOCLKINT;转向中断效劳程序

ORG0X30

;数字到段码的转换子程序(最好放在程序开头,防止超过2K的空间发生跨页读表)

;************不带小数点的共阳极码表**************

CONVERTADDWFPCL,1

RETLW0XC0;0,显示段码与具体的硬件连接有关

RETLW0XF9;1

RETLW0XA4;2

RETLW0XB0;3

RETLW0X99;4

RETLW0X92;5

RETLW0X82;6

RETLW0XD8;7

RETLW0X80;8

RETLW0X90;9

RETLW0X88;A

RETLW0X83;B

RETLW0XC6;C

RETLW0XA1;D

RETLW0X86;E

RETLW0X8E;F

RETLW0X7F;"."

RETLW0XBF;"-"

RETLW0X89;H

RETLW0XFF;DARK

RETURN

;*********带小数点的共阳极码表***********

CONVERT2ADDWFPCL,1

RETLW0X40;0

RETLW0X79;1

RETLW0X24;2

RETLW0X30;3

RETLW0X19;4

RETLW0X12;5

RETLW0X02;6

RETLW0X78;7

RETLW0X00;8

RETLW0X10;9

RETURN

;***********SPI发送显示子模块************

TRANSMIT

CLRFPORTA;LACK送低电平,为锁存做准备

MOVWFSSPBUF;启动发送

WAITNOP

BTFSSPIR1,SSPIF

GOTOWAIT;等待发送完毕

BCFPIR1,SSPIF;去除中断标志

RETURN

;***********显示子程序模块************

DISPLAY

MOVLW0X01

MOVWFLEDF

MOVLW0XA0

MOVWFFSR0L

AGAINXIAN

MOVFLEDF,W

SUBLW0X03

BTFSSSTATUS,Z

GOTOXIANB

MOVFINDF0,W

CALLCONVERT2;假设是个位,那么查带小数点的码表

GOTOTRAN

XIANBMOVFINDF0,W

CALLCONVERT

TRANCALLTRANSMIT;发送一个显示数据

INCFFSR0L

INCFLEDF

MOVFLEDF,W

SUBLW0X05

BTFSSSTATUS,Z

GOTOAGAINXIAN

MOVLW0X01

MOVWFLEDF

XIANDARK

MOVLW0X27

CALLCONVERT

CALLTRANSMIT

INCFLEDF

MOVFLEDF,W

SUBLW0X05

BTFSSSTATUS,Z

GOTOXIANDARK;显示4个"DARK"

BSFPORTA,5;最后给一个锁存信号,代表一次显示任务完成

RETURN

;**********S0计数溢出处理子程序***************

CS0

CLRFS0

INCFS1

RETURN

;**********S1计数溢出处理子程序***************

CS1

CLRFS1

INCFS2

RETURN

;**********S2计数溢出处理子程序***************

CS2

CLRFS2

INCFS3

RETURN

;**********S3计数溢出处理子程序***************

CS3

CLRFS3

RETURN

;***********时钟中断效劳程序*******************

CLKINT

MOVWFXW_TEMP;保存W的值

SWAPFSTATUS,W

MOVWFXHOSTS;暂存STATUS的值

MOVFFSR0L,W

MOVWFHOSTF;保存FSR0L的值。

以上程序为中断现场保护

MOVLW0X13

MOVWFTMR0L;对TMR0L写入一个调整值,因为写入

;TMR0L后接着的两个周期不能增量

BCFINTCON,T0IF;去除中断标志

INCFSREG

MOVFSREG,W

SUBLW0X28;TMR0L每250us中断一次

BTFSSSTATUS,Z;其中断40次后才执行对S0S1S2S3的操作

GOTOTIFAN

CLRFSREG

INCFS0

MOVFS0,W

SUBLW0X0A

BTFSCSTATUS,Z

CALLCS0

MOVFS1,W

SUBLW0X0A

BTFSCSTATUS,Z

CALLCS1

MOVFS2,W

SUBLW0X0A

BTFSCSTATUS,Z

CALLCS2

MOVFS3,W

SUBLW0X0A

BTFSCSTATUS,Z

CALLCS3

TIFAN

MOVFHOSTF,W;以下为中断现场恢复

MOVWFFSR0L;恢复间接寻址指针FSR0L的值

SWAPFXHOSTS,W

MOVWFSTATUS;恢复STATUS的值

SWAPFXW_TEMP,1

SWAPFXW_TEMP,W;恢复W的值

RETFIE

;***********TMR0初始化子程序***************

CLKINSUB

MOVLW0XCF

MOVWFT0CON;设定TMR0L工作于8位定时器方式

;内部时钟,TMR0不用分频

BCFINTCON,TMR0IF;去除TMR0的中断标志

BCFINTCON,GIE;总中断制止

BSFINTCON,TMR0IE;TMR0中断允许

BSFINTCON2,2;TMR0中断高优先级

BSFRCON,7;使能中断优先级

RETURN

;***************系统初始化子程序*****************

MAINSUB

BCFTRISA,5;置RA5为输出方式,以输出锁存信号

BCFTRISB,1

BCFTRISA,3

BCFTRISE,0

BCFTRISE,1

BSFTRISB,4;设置与键盘有关的各口的输入输出方式

BCFTRISC,5

BCFTRISC,3;设置SCK与SDO为输出方式

BCFINTCON,GIE;关闭所有中断

MOVLW0XC0

MOVWFSSPSTAT;设置SSPSTAT存放器

MOVLW0X30

MOVWFSSPCON1;设置SPI的控制方式,允许SSP方式,

;并且时钟下降沿发送,与"74HC595当

;其SCLK从低到高平跳变时,串行输入数据

;(DI)移入存放器"的特点相对应

RETURN;返回

;***********键扫描子程序********************

KEYSCAN

BCFPORTB,1

BCFPORTA,3

BCFPORTE,0

BCFPORTE,1;送低电平至K1,K2,K3,K4

RETURN

;*********键盘去抖子程序(8ms的延时)******************

KEYDELAY

MOVLW0X0A

MOVWFDEYH

AGAIN2MOVLW0XFF

MOVWFDEYL

AGAIN1DECFSZDEYL,1

GOTOAGAIN1

DECFSZDEYH,1

GOTOAGAIN2;具体程序语句参考3.2节

RETURN

;*************显示缓冲区处理子程序****************

XIANHUAN

MOVLW0XA0

MOVWFFSR0L

RLNCFS0,0

MOVWFTEMP

INCFTEMP,0

MOVWFINDF0

INCFFSR0L

RLNCFS1,0

MOVWFTEMP

INCFTEMP,0

MOVWFINDF0

INCFFSR0L

RLNCFS2,0

MOVWFTEMP

INCFTEMP,0

MOVWFINDF0

INCFFSR0L

RLNCFS3,0

MOVWFTEMP

INCFTEMP,0

MOVWFINDF0

RETURN

;**************主程序******************

MAINNOP

CALLMAINSUB;系统初始化

CALLCLKINSUB;调用时钟初始化子程序

DENJIANBCFINTCON,GIE

CLRFS0

CLRFS1

CLRFS2

CLRFS3

CLRFSREG

CLRFLEDF;S0=S1=S2=S3=0

CALLXIANHUAN;把S3、S2、S1、S0的值装入显示缓冲区

CALLDISPLAY;显示

DENANBCFINTCON,GIE;关中断

CALLKEYSCAN;进展键扫描

BTFSSPORTB,4

GOTOXIAODOU1;如起始键按下,那么消抖动

GOTODENAN;如起始键没按下,那么继续等待

XIAODOU1

CALLKEYDELAY;延时消抖动

CALLKEYSCAN;再次进展键扫描

BTFSCPORTB,4

GOTODENAN;假设为干扰,那么再次等待键按下

CLRFS0

CLRFS1

CLRFS2

CLRFS3

CLRFSREG;设置新一次计时的初始条件

WAITSCALLKEYSCAN

BTFSSPORTB,4

GOTOWAITS;为了防止按键过于灵敏,等键松开后再进展

;下面的操作

BSFINTCON,GIE;开总中断

HERECALLXIANHUAN;显示缓冲区处理

CALLDISPLAY;即时更新显示内容

CALLKEYSCAN

BTFSSPORTB,4

GOTOXIAODOU;假设停顿计时键按下,那么消抖

GOTOHERE;假设停顿计时键没按下,那么继续等待中断计时

XIAODOU

CALLDISPLAY;利用消抖动时间调用显示程序

CALLDISPLAY

CALLDISPLAY

CALLDISPLAY

CALLDISPLAY

CALLDISPLAY

CALLDISPLAY

CALLDISPLAY

CALLDISPLAY

CALLKEYSCAN

BTFSCPORTB,4

GOTOHERE;假设为干扰,那么继续等待停顿键按下

BCFINTCON,GIE;假设停顿键按下,那么制止中断

CALLDISPLAY;假设不为干扰,那么制止中断,更新显示内容

WAITRCALLKEYSCAN

BTFSSPORTB,4

GOTOWAITR;为了防止按键过于灵敏,等键松开后再进展

;下面的操作

DENDAICALLKEYSCAN

BTFSCPORTB,4

GOTODENDAI;循环进展键扫描,等待清0键按下

CALLKEYDELAY;延时消抖

CALLKEYSCAN

BTFSCPORTB,4

GOTODENDAI

WAIT19CALLKEYSCAN

BTFSSPORTB,4

GOTOWAIT19;等键松开

GOTODENJIAN;新一次计时开场

END

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1