pic单片机计时秒表程序设计(时钟显示范围00.00~99.99秒,分辨度为0.01秒)作者:来源:本站原创点击数:1676 更新时间:2008年07月12日//此程序实现计时秒表功能,时钟显示范围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};//不带小数点的显示段码表const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};//带小数点的显示段码表void clkint(void);//TMR0初始化子程序void tmint(){T0CON=0XCF; //设定TMR0L工作于8位定时器方式//内部时钟,TMR0不用分频INTCON=0X20; //总中断禁止,TMR0中断允许,清除TMR0的中断标志INTCON2bits.TMR0IP=1; //TMR0中断高优先级RCONbits.IPEN=1; //使能中断优先级}//系统其它部分初始化子程序void initial(){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传输数据子程序void SPILED(char data){SSPBUF=data; //启动发送do{;}while(PIR1bits.SSPIF==0);PIR1bits.SSPIF=0;}//显示子程序,显示4位数void dispaly(){PORTAbits.RA5=0; //准备锁存for(k=0;k<4;k++){data=s[k];if(k==2) data=table0[data]; //个位需要显示小数点else data=table[data];SPILED(data); //发送显示段码}for(k=0;k<4;k++){data=0xFF;SPILED(data); //连续发送4个DA RK,使显示好看一些}PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成}//软件延时子程序void DELA Y(){for(i = 3553; --i ;)continue;}//键扫描子程序void KEYSCAN(){while(1){dispaly(); //调用一次显示子程序while(PORTBbits.RB4==0){DELA Y(); //若有键按下,则软件延时break;}if (PORTBbits.RB4==0) break; //若还有键按下,则终止循环扫描,返回}}//等键松开子程序void keyrelax(){while(1){dispaly(); //调用一次显示子程序if (PORTBbits.RB4==1) break; //为防止按键过于灵敏,每次等键松开才返回}}/*高优先级中断向量*/#pragma code InterruptVectorHigh=0x08void InterruptVectorHigh (void){_asmgoto clkint //跳到中断程序_endasm}//中断服务程序#pragma code#pragma interrupt clkintvoid clkint(){TMR0=0X13; //对TMR0写入一个调整值。
因为写入TMR0后接着的//两个周期不能增量,中断需要3个周期的响应时间,//以及C语言自动进行现场保护要消耗周期INTCONbits.T0IF=0; //清除中断标志sreg=sreg+1; //中断计数器加1if(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;}}}}}//主程序// 提供此单片机程序有问题请联系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单片机计时秒表程序设计--------------------------------------;此程序实现计时秒表功能;时钟显示范围:00.00秒-99.99秒,分辨度:0.01秒;通过按键来启动计时、停止计时及清0;即第一次按下任意键开始计时,第二次按下任意键停止计时;第三次按下任意键使LED清0,等待下一次计时开始LIST P=18F458INCLUDE "P18F458.INC"S0 EQU 0X20 ;0.01 秒计时器S1 EQU S0+1 ;0.1 秒计时器S2 EQU S0+2 ;1 秒计时器S3 EQU S0+3 ;10 秒计时器SREG EQU S0+4 ;软计数器LEDF EQU S0+5 ;显示的LED的位置指示寄存器XW_TEMP EQU S0+6 ;用于中断中保护W的值XHOSTS EQU S0+7 ;用于中断中保护STATUS的值DEYH EQU S0+8DEYL EQU S0+9 ;以上两个寄存器用于软件延时HOSTF EQU S0+0A;用于中断中保护FSR0L的值TEMP EQU S0+0B ;用于存放临时值ORG 0X00GOTO MAINORG 0X08GOTO CLKINT ;转向中断服务程序ORG 0X30;数字到段码的转换子程序(最好放在程序开头,避免超过2K的空间发生跨页读表) ;************不带小数点的共阳极码表**************CONVERT ADDWF PCL,1RETLW0XC0 ;0,显示段码与具体的硬件连接有关RETLW0XF9 ;1RETLW0XA4 ;2RETLW0XB0 ;3RETLW0X99 ;4RETLW0X92 ;5RETLW0X82 ;6RETLW0XD8 ;7RETLW0X80 ;8RETLW0X90 ;9RETLW0X88 ;ARETLW0X83 ;BRETLW0XC6 ;CRETLW0XA1 ;DRETLW0X86 ;ERETLW0X8E ;FRETLW0X7F ;"."RETLW0XBF ;"-"RETLW0X89 ;HRETLW0XFF ;DARKRETURN;*********带小数点的共阳极码表*********** CONVERT2 A DDWF PCL,1RETLW0X40 ;0RETLW0X79 ;1RETLW0X24 ;2RETLW0X30 ;3RETLW0X19 ;4RETLW0X12 ;5RETLW0X02 ;6RETLW0X78 ;7RETLW0X00 ;8RETLW0X10 ;9;***********SPI发送显示子模块************ TRANSMITCLRF PORTA ;LA CK送低电平,为锁存做准备MOVWF SSPBUF ;启动发送WAIT NOPBTFSS PIR1,SSPIFGOTO WAIT ;等待发送结束BCF PIR1,SSPIF ;清除中断标志RETURN;***********显示子程序模块************ DISPLA YMOVLW0X01MOVWF LEDFMOVLW0XA0MOVWF FSR0LAGAINXIANMOVF LEDF,WSUBLW 0X03BTFSS STATUS,ZGOTO XIANBMOVF INDF0,WCA LL CONVERT2 ;若是个位,则查带小数点的码表GOTO TRANXIANB MOVF INDF0,WCA LL CONVERTTRAN CA LL TRANSMIT ;发送一个显示数据INCF FSR0LMOVF LEDF,WSUBLW 0X05BTFSS STATUS,ZGOTO A GAINXIANMOVLW0X01MOVWF LEDFXIANDA RKMOVLW0X27CA LL CONVERTCA LL TRANSMITINCF LEDFMOVF LEDF,WSUBLW 0X05BTFSS STATUS,ZGOTO XIANDARK ;显示4个"DARK"BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成RETURN;********** S0计数溢出处理子程序***************CS0CLRF S0INCF S1RETURN;********** S1计数溢出处理子程序***************CS1CLRF S1INCF S2RETURN;********** S2计数溢出处理子程序***************CS2CLRF S2INCF S3RETURN;********** S3计数溢出处理子程序***************CS3CLRF S3RETURN;***********时钟中断服务程序*******************CLKINTMOVWF XW_TEMP ;保存W的值SWAPF STATUS,WMOVWF XHOSTS ;暂存STATUS的值MOVF FSR0L,WMOVWF HOSTF ;保存FSR0L的值。