一、寄存器
1、TCON定时器/计数器0/1控制寄存器
TR0/1:定时器T0/1的运行控制位。
TF0/1:定时器T0/1的中断溢出标志。
2、TMOD定时器/计数器0/1工作模式寄存器
3、AUXR辅助寄存器(不可位寻址)
4、中断允许寄存器
5、中断优先级控制寄存器
二、代码
蓝桥杯板子采用NE555来产生波形,并通过跳线帽接P34,利用P34做计数器来产生频率。
#include "task.h" unsigned int dsp_count=0; unsigned int fre_count=0; unsigned char ui=1; unsigned int fre=0; //定义频率参数 void Timer2_Init(void) //2毫秒@12.000MHz { AUXR |= 0x04; //定时器时钟1T模式 T2L = 0x40; //设置定时初始值 T2H = 0xA2; //设置定时初始值 AUXR |= 0x10; //定时器2开始计时 IE2 |= 0x04; //使能定时器2中断 } void Timer0_Init() { TMOD = 0x05; //定时器0 采用计数器 TH0 = 0; TL0 = 0; ET0 = 1; TR0 = 1; } void Init_Sys() { LED(0xff); BUZ(0x00); Init_DSP(); Timer0_Init(); EA = 1; } void Timer2_Isr(void) interrupt 12 { GetDisplayStruct()->SegDisplay(); if(dsp_count < 25)dsp_count++; if(fre_count < 500)fre_count++; //每隔1S获取一次 } void Task_Fre() { if(fre_count >= 500) { fre_count = 0; fre = (TH0 << 8) | TL0; // 将所计数值传出 TH0 = 0; //重新计数 TL0 = 0; } } void Task_Seg() { DisplayStruct* seg = GetDisplayStruct(); if(dsp_count < 25) return; dsp_count = 0; if(ui == 1) { seg->dot = 10; seg->buf[0] = 11; seg->buf[1] = (fre > 999999)?(fre / 1000000 % 10):(10); seg->buf[2] = (fre > 99999)?(fre / 100000 % 10):(10); seg->buf[3] = (fre > 9999)?(fre / 10000 % 10):(10); seg->buf[4] = (fre > 999)?(fre / 1000 % 10):(10); seg->buf[5] = (fre > 99)?(fre / 100 % 10):(10); seg->buf[6] = (fre > 9)?(fre / 10 % 10):(10); seg->buf[7] = fre % 10; } }
tips:频率采集使用了定时器0,显示刷新采用了定时器2,定时器1可留做串口使用,超声波采用PCA。