单片机计时秒表程序设计[1].doc

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
. .. 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;k4;k++) { data=s[k]; if(k==2) data=table0[data]; //个位需要显示小数点 else data=table[data]; SPILED(data); //发送显示段码 } for(k=0;k4;k++) { data=0xFF; SPILED(data); //连续发送4个DARK,使显示好看一些 } PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成 } //软件延时子程序 void DELAY() { for(i = 3553; --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 InterruptVectorHigh=0x08 void InterruptVectorHigh (void) { _asm goto clkint //跳到中断程序 _endasm } //中断服务程序 #pragma code #pragma interrupt clkint void clkint() { TMR0=0X13; //对TMR0写入一个调整值。因为写入TMR0后接着的 //两个周期不能增量,中断需要3个周期的响应时间, //以及C语言自动进行现场保护要消耗周期 INTCONbits.T0IF=0; //清除中断标志 sreg=sreg+1; //中断计数器加1 if(sreg==4

文档评论(0)

ygxt89 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档