请教下 关于定时器 1T还是12T的选择
这里已经选择是1T模式 单片机是8H8K64但是定时出来的时间确是12ms本帖最后由 18340262113 于 2024-1-15 10:32 编辑
初值按12T模式计算 定时出来的就是1ms了模式选择我还是1T没动这个为啥呢 18340262113 发表于 2024-1-15 10:30
初值按12T模式计算 定时出来的就是1ms了模式选择我还是1T没动这个为啥呢 ...
你在程序里面全局查找一下,应该是有其他操作AUXR寄存器的情况出现了,比如说串口初始化使用了直接赋值的语句。 18340262113 发表于 2024-1-15 10:30
初值按12T模式计算 定时出来的就是1ms了模式选择我还是1T没动这个为啥呢 ...
串口操作的时候应该使用
AUXR |= 一个值;的形式进行操作
不然会干扰其他的位 肯定是有别的地方改回来12T了。数字外设,严格按时钟来工作的。 哎,,已知的第二起因为赋值的方式不恰当引起的问题 _奶咖君_ 发表于 2024-1-15 15:18
哎,,已知的第二起因为赋值的方式不恰当引起的问题
一定要注意:一个寄存器有多个位,只改变你本次操作的位,别的位不要动。
初学者特别容易犯这个错误。 梁工 发表于 2024-1-15 15:42
一定要注意:一个寄存器有多个位,只改变你本次操作的位,别的位不要动。
初学者特别容易犯这个错误。 ...
说的对啊....这么危险的操作..
还就是梁工看的清{:4_197:}
本帖最后由 梁工 于 2024-1-15 16:25 编辑
_奶咖君_ 发表于 2024-1-15 16:00
说的对啊....这么危险的操作..
看看我的宏定义,只改变相关的位(写0或写1),别的位不变:
#define Timer0_16bitAutoReload() TMOD &= ~0x03 /* 16位自动重装 */
#define Timer0_16bit() TMOD= (TMOD & ~0x03) | 0x01 /* 16位 */
#define Timer0_8bitAutoReload() TMOD= (TMOD & ~0x03) | 0x02 /* 8位自动重装 */
#define Timer0_16bitAutoRL_NoMask() TMOD |=0x03 /* 16位自动重装不可屏蔽中断 */
#define Timer0_Run() TR0 = 1 /* 允许定时器0计数 */
#define Timer0_Stop() TR0 = 0 /* 禁止定时器0计数 */
#define Timer0_Gate_INT0_P32() TMOD |=(1<<3) /* 时器0由外部INT0高电平允许定时计数 */
#define Timer0_AsTimer() TMOD &= ~(1<<2) /* 时器0用做定时器 */
#define Timer0_AsCounter() TMOD |=(1<<2) /* 时器0用做计数器 */
#define Timer0_AsCounterP34() TMOD |=(1<<2) /* 时器0用做计数器 */
#define Timer0_1T() AUXR |=(1<<7) /* Timer0 clodk = fo */
#define Timer0_12T() AUXR &= ~(1<<7) /* Timer0 clodk = fo/12 12分频, default */
#define Timer0_CLKO_Enable() INT_CLKO |=1 /* 允许 T0 溢出脉冲在T0(P3.5)脚输出,Fck0 = 1/2 T0 溢出率,T0可以1T或12T。 */
#define Timer0_CLKO_Disable() INT_CLKO &= ~1
#define Timer0_CLKO_Enable_P35() INT_CLKO |=1 /* 允许 T0 溢出脉冲在T0(P3.5)脚输出,Fck0 = 1/2 T0 溢出率,T0可以1T或12T。 */
#define Timer0_CLKO_Disable_P35() INT_CLKO &= ~1
学习一下
页:
[1]
2