📄 time.c
字号:
//*******************************************************************************
//程 序 名:高精度时钟
//设 计 者:石鱼WLEEN
// 设计说明:设置TMR0预分频系数为16,一次计数中断溢出时间为4096us(0x1000)
// 每次TMR0中断服务中对时间累计变量microsecond加上4096
// 程序主循环中不停地查询变量microsecond,看是否超过50ms,如果时间超过
// 50ms,则microsecond=microsecond-50000,同时50ms计数器ms50加1
// 基于50ms计数器的累加值,更新秒,分和小时值
// 虽然每一个50ms的变化时间略有偏差,但所有偏差值都保留在microsecond
// 中,并得到累计修正,所以长时间跨度计时精确
//*******************************************************************************
#include<pic.h>
/*
TMR1IF:TMR1 溢出中断标志位
1 = TMR1 寄存器已经溢出(必须用软件清零)
0 = TMR1 寄存器未溢出
*/
void interrupt timer(void)
{
if(TMR1IF)
{
GIE=0;
TMR1IF=0;
TMR1ON=0;
RD2=!RD2;
//TMR1L=0x00;
//TMR1H=0x80;
TMR1ON=1;
GIE=1;
}
}
void main()
{
TRISD2=0;
TRISA6=1;
TRISA7=1;
RD2=1;
TMR1ON=0;
//TMR1H=0x80;
//TMR1L=0x00;
/*
bit 7 GIE:全局中断允许位
1 = 允许所有未屏蔽的中断
0 = 禁止所有中断
bit 6 PEIE:外设中断允许位
1 = 允许所有未屏蔽的外设中断
0 = 禁止所有外设中断
*/
// 溢溢出中断允许位
// 1 = 允许
// 0 = 禁止
//TMR1CS=1;
// T1CKS1=0;
// T1CKS2=0;
// T1SYNC=1;
//
// T1OSCEN=0;
TMR1IF=0;
PEIE=1;
GIE=1;
T1CON=0b00001110; //init but disable timer1
/*
bit7 0 bit6 0
bit 5-4 T1CKPS<1:0>:Timer1 输入时钟预分频比选择位
11 = 1:8 预分频比
10 = 1:4 预分频比
01 = 1:2 预分频比
00 = 1:1 预分频比
bit 3 T1OSCEN:LP 振荡器使能控制位
0 = LP 振荡器关闭
bit 2 T1SYNC:Timer1 外部时钟输入同步控制位
TMR1CS = 1:
1 = 不与外部时钟输入同步
bit 1 TMR1CS:Timer1 时钟源选择位
1 = 选择来自RC5/T1CKI/CCP1/SEG10 引脚或T1OSC 的外部时钟(上升沿计数)
0 = 内部时钟(FOSC/4)
bit 0 TMR1ON:Timer1 使能位
1 = 使能Timer1
0 = 停止Timer1
*/
TMR1IE=1;
TMR1ON=1;
while(1) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -