用ISP中的定时器设置工具,设置50ms,实际差不多10ms | 已解决
芯片是12C5616AD-PDIP28。用ISP中的定时器设置T0为50ms中断,中断程序中用变量fc进行累加,
然后在主程序中实现每秒打印一条信息。
主要代码如下:
void Timer0_Isr(void) interrupt 1
{
fc++;
}
void Timer0_Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main()
{
IO_INIT();
Timer0_Init(); //50毫秒@11.0592MHz
Uart1_Init(); //115200bps@11.0592MHz
EA=1;
while(1)
{
if(fc>20)
{
printf("\r\ntime----");
fc=0;
LED=~LED;
}
}
}
串口打印结果:
串口打印的信息反映串口打印的间隔时间并不是1s,这是为什么?
12C5616AD时代,还【定时器没有16位自动重载功能】的年代,
===换管脚兼容的,12H1K16-36I-TSSOP20/SOP20/SOP28/LQFP32
深圳国芯人工智能有限公司-产品_STC12H系列 (stcai.com)
【定时器有16位自动重载功能】
15的年代才开始 【定时器有16位自动重载功能】
还是回到那句话,一切的正确起点是 从 原始的一手规格书 开始
不看标准教科书级别的规格书,各种疑问的出现就很正常
===还有各种合理化建议也是已采纳的过时建议
给 这个fc变量加上个volatile 试一试,,, 本帖最后由 xxkj2010 于 2024-8-26 18:01 编辑
_奶咖君_ 发表于 2024-8-26 11:10
给 这个fc变量加上个volatile 试一试,,,
没有作用。 我觉得是这个小工具生成的代码问题。 本帖最后由 晓飛飛 于 2024-8-26 22:06 编辑
应该不是小工具的问题,这个是充分测试过了的,你的代码不完整,也许其它地方改变了定时器的配置,或者代码结构的问题,UART1的初始化用了哪个定时器做波特率发生器,有没有改写1T/12T寄存器, 可以确定的是小工具没有问题,生成的代码也没有问题,问题在于你。
首先,上结果:
用定时器0来实现1ms定时,串口1用定时器2做波特率发生器115200,然后每500ms实现LED取反闪烁并用串口输出信息。
从结果上看,如果没有异议,就继续往下看。
主程序很简单:
那么,到这里,先说LED的初始化:
然后是定时器0的初始化:
然后是串口1的初始化:
因为串口1初始化使用了定时器2,所以接着看定时器2的初始化:
ok,到这里while之前的都看了,
主循环里就干了3件事,一个是看定时500ms到没到,另两个是到了以后分别让led取反并完成串口打印。
500ms标志位怎么来的,看定时器0的中断:
至于led取反和串口打印,暂时假设你没有问题。
那么我们接着看你的问题:
从你的截图里,没看到你选择内部IRC,那猜测你是用的外部11.0592晶振。
那么一点点看下去,就剩下串口了,看看是不是也是12T模式,和你的定时器0一致?
你可以参照我贴的图看看你的问题。
至于你的fc计数,我没那么写过,但看着没问题。但是还可以更准确:≥20。
另再备注一下:
很公立的说一句,STC这个小工具,经过这么多年的发展和成熟,现在能被新手发现的关于计算的问题几乎没有,
出了问题,建议还是先找自己的问题或者哪怕不会就问,先把自己可能存在的问题都排除掉,那你就已经成熟一大截了。
加油!
xxkj2010 发表于 2024-8-26 17:59
没有作用。 我觉得是这个小工具生成的代码问题。
那就直接上个出问题的最简工程呗,, Yim_Hom 发表于 2024-8-27 01:03
可以确定的是小工具没有问题,生成的代码也没有问题,问题在于你。
首先,上结果:
用定时器0来实现1ms定时 ...
你的芯片型号是STC12C5616AD吗? 定时器还不至于出问题吧 本帖最后由 xxkj2010 于 2024-8-27 08:35 编辑
Yim_Hom 发表于 2024-8-27 01:03
可以确定的是小工具没有问题,生成的代码也没有问题,问题在于你。
首先,上结果:
用定时器0来实现1ms定时 ...
我把TMOD &= 0xF0; 改成TMOD = 0x01;把AUXR &= 0x7F; 去掉,OK!
即初始化改为:
void Timer0_Init(void) //50毫秒@11.0592MHz
{
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
}反正问题就出现在这一句: TMOD &= 0xF0;
soma 发表于 2024-8-27 08:29
定时器还不至于出问题吧
初始化语句的问题,定时器硬件方面绝对没有问题