冲哥的STC32G12K128视频
突然发现,冲哥在讲AI8051U的视频之前,还有个STC32G12K128的视频:我个人感觉,这个STC32G12K128的视频还是要补课,不看这个视频。好多基础就没彻底搞懂!
当然目前没有办法从头慢慢看,先补急需搞清楚的基础!
我们今天先学习第十一集:定时器的使用
定时器的作用和意义:
这个while(KEY==0); 虽然合理,但是最大的问题是死在这里等
单核的CPU,面对的任务就不是只有这一个,死在这里是不行的! 那么像这样while函数在不断循环执行的时候,能不能有办法让这个变量每隔1ms能自动加一,并且不受while循环的影响呢?
这就需要中断了:
实质是,定时一定的时间后,芯片自己产生一个中断!
定时器是定时器和计数器的统称。
1)设置为定时器时,可实现硬件计时,或者使程序每隔一固定时间完成一项操作
2)设置为计数器时候能够对脉冲进行计数
3)替代长时间的delay,提高CPU的运行效率和处理速度,能及时的响应某个事件
有了定时器中断,1ms的计时,就不会因为执行while(KEY==0);这句,你死不松手
while函数在不断循环执行的时候,定时器能让这个变量每隔1ms能自动加一,并且不受while循环的影响!
while (1)
{
TimeCount++;
delay_ms(1);
if("KEY==0)
{
delay_ms(10);
if( KEY==0)
{
while(KEY==0);
}
}
}
就是说有了定时器中断,我们把TimeCount++;放在定时器中断服务函数中
这样不管你送不松手,每到1ms,TimeCount++都会准确执行!
之前听课的时候,其实没有真懂............... 本节课的主要任务是:
2.STC32G单片机定时器使用原理 T0实现1ms中断
2.1、·先设置功能为定时器/计数器(本质都是加法计数器)
STC32G 系列单片机内部设置了 5 个 24 位定时器/计数器(8 位预分频+16 位计数)。5 个 16位定时器T0、TI、T2、T3和T4都具有计数方式和定时方式两种工作方式。
对定时器/计数器T0和T1,用它们在特殊功能寄存器TMOD中相对应的控制位C/T来选择T0或TI为定时器还是计数器。对定时器/计数器T2,用特殊功能寄存器AUXR中的
控制位T2-CT来选择T2为定时器还是计数器。对定时器/计数器T3,用特殊功能寄存器T4T3M中的控制位T3-C/T来选择T3为定时器还是计数器,对定时器/计数器T4,用
特殊功能寄存器T4T3M中的控制位T4-C/T来选择T4为定时器还是计数器。定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每 12个时钟或者每1 个时钟得到一个计数脉冲,计数值加 1:
如果计数脉冲来自单片机外部引脚,则为计数方式,每来一个脉冲加 1.
STC32G手册写的很清晰:
我发现手册上还有例子程序:
是不是很简单粗暴的解释了定时器0的用法?
以前怎么就不去研究手册?今天才发现手册比教材讲的清晰!(当然是能看懂的部分)
其实不是不看手册,关键是自己功底太差,看不懂............... STC的ISP软件还可以自动生成如下程序:
void Timer0_Isr(void) interrupt 1
{
}
void Timer0_Init(void) //1毫秒@40.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xC0; //设置定时初始值
TH0 = 0x63; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
这些注释也是自动生成的哦! 这5个定时器/计数器,我们先学好定时器0
我下载的手册和冲哥的好像不一样.........