单片机计时秒表程序设计.doc
《单片机计时秒表程序设计.doc》由会员分享,可在线阅读,更多相关《单片机计时秒表程序设计.doc(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、pic单片机计时秒表程序设计(时钟显示范围00.0099.99秒,分辨度为0.01秒)作者:来源:本站原创点击数: 1676更新时间:2008年07月12日/此程序实现计时秒表功能,时钟显示范围00.0099.99秒,分辨度:0.01秒#include p18f458.hunsigned char s4; /定义0.01 秒、0.1 秒、1秒、10秒计时器unsigned char k,data,sreg;unsigned int i;const table11=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90;/不带小数点的显示段码表cons
2、t table010=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口设置
3、为输出TRISB=0XF0; /RB1输出,RB4输入TRISC=0x00; /SDO引脚为输出,SCK引脚为输出TRISE=0x00; /E口设置为输出SSPCON1=0x30; /SSPEN=1;CKP=1,FOSC/4SSPSTAT=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(PIR
4、1bits.SSPIF=0);PIR1bits.SSPIF=0;/显示子程序,显示4位数void dispaly()PORTAbits.RA5=0; /准备锁存for(k=0;k4;k+)data=sk;if(k=2) data=table0data; /个位需要显示小数点else data=tabledata;SPILED(data); /发送显示段码for(k=0;k4;k+)data=0xFF;SPILED(data); /连续发送4个DARK,使显示好看一些PORTAbits.RA5=1; /最后给锁存信号,代表显示任务完成/软件延时子程序void DELAY()for(i = 355
5、3; -i ;)continue;/键扫描子程序void KEYSCAN()while(1)dispaly(); /调用一次显示子程序while(PORTBbits.RB4=0) DELAY(); /若有键按下,则软件延时 break;if (PORTBbits.RB4=0) break; /若还有键按下,则终止循环扫描,返回 /等键松开子程序void keyrelax()while(1)dispaly(); /调用一次显示子程序if (PORTBbits.RB4=1) break; /为防止按键过于灵敏,每次等键松开才返回 /*高优先级中断向量*/#pragma code Interrupt
6、VectorHigh=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 操作sre
7、g=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;/主程序/ 提供此单片机程序有问题请联系main()tmint(); /TMR0初始化initial(); /spi显示初始化及系统其它部分初始化INTCONbits.GIE=0; /总中断禁止while(1) for(k=0;k4;k+)sk=0; sreg=0; /赋显示初值dispaly(); /调用一次显示子程序KEYSCAN(); /键扫描,直到开始键按下keyrelax(); /等键松开INTC
8、ONbits.GIE=1; /总中断允许KEYSCAN(); /键扫描直到停止键按下,在键扫描时有显示keyrelax(); /等键松开INTCONbits.GIE=0; /总中断禁止KEYSCAN(); /键扫描到清0键按下,在键扫描时有显示 keyrelax(); /等键松开-汇编语言版本的pic单片机计时秒表程序设计-;此程序实现计时秒表功能;时钟显示范围:00.00秒-99.99秒,分辨度:0.01秒;通过按键来启动计时、停止计时及清0;即第一次按下任意键开始计时,第二次按下任意键停止计时 ;第三次按下任意键使LED清0,等待下一次计时开始LIST P=18F458INCLUDE P1
9、8F458.INCS0 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 0X
10、00GOTO MAINORG 0X08GOTO CLKINT ;转向中断服务程序ORG 0X30;数字到段码的转换子程序(最好放在程序开头,避免超过2K的空间发生跨页读表) ;*不带小数点的共阳极码表*CONVERT ADDWF PCL,1RETLW 0XC0 ;0,显示段码与具体的硬件连接有关RETLW 0XF9 ;1RETLW 0XA4 ;2RETLW 0XB0 ;3RETLW 0X99 ;4RETLW 0X92 ;5RETLW 0X82 ;6RETLW 0XD8 ;7RETLW 0X80 ;8RETLW 0X90 ;9RETLW 0X88 ;ARETLW 0X83 ;BRETLW 0XC
11、6 ;CRETLW 0XA1 ;DRETLW 0X86 ;ERETLW 0X8E ;FRETLW 0X7F ;.RETLW 0XBF ;-RETLW 0X89 ;HRETLW 0XFF ;DARKRETURN;*带小数点的共阳极码表*CONVERT2 ADDWF PCL,1 RETLW 0X40 ;0RETLW 0X79 ;1RETLW 0X24 ;2RETLW 0X30 ;3RETLW 0X19 ;4RETLW 0X12 ;5RETLW 0X02 ;6RETLW 0X78 ;7RETLW 0X00 ;8RETLW 0X10 ;9RETURN;*SPI发送显示子模块*TRANSMIT CLRF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 计时 秒表 程序设计
限制150内