完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
//晶振是11.0592Mhz
#include #define s8 signed char #define u8 unsigned char #define u16 unsigned int ***it D1 = P0^0;//位定义LED0 u8 tmr0_value = 1000;//定时器0的初值 void init_tmr0(void); int main(void) { init_tmr0();//初始化定时器0 while (1); return 0; } void init_tmr0(void) { TMOD = 0x01;//设置tmr0为工作方式1 EA = 1;//开总中断 ET0 = 1;//开定时器0中断 TH1 = (65536 - tmr0_value) / 16;//得到高8位 TH0 = (65536 - tmr0_value) % 16;//得到低8位 TR0 = 1;//启动定时器0 return; } //注:定时器溢出后若没重装初值就重新从0开始计数(0—65535) //计数到65536就溢出! void tmr0(void) interrupt 1//定时器0中断 { TR0 = 0;//关闭定时器0 //重新给定时器0赋初值 TH1 = (65536 - tmr0_value) / 16; TH0 = (65536 - tmr0_value) % 16; D1 = !D1;//D1的闪烁速度和tmr0_value的值不匹配 TR0 = 1;//启动定时器0 return; } 现象:人眼可以明显地看见D1的闪烁! 困惑:大家看红色代码tmr0_value = 1000,说明定时器0是大约1ms中断一次,对吧? 那么即D1的亮灭状态是1ms变化一次,以这个速度人眼肯定不能看到灯的闪烁的,但我的灯的闪烁状态就很明显。 这是为什么呢?大神解释,小弟很痛苦!!! |
|
相关推荐
10个回答
|
|
//重新给定时器0赋初值
TH1 = (65536 - tmr0_value) / 16; TH0 = (65536 - tmr0_value) % 16; 是不是该改为: //重新给定时器0赋初值 TH1 = (65536 - tmr0_value) / 256; TH0 = (65536 - tmr0_value) % 256; |
|
|
|
u8 真的可以保存1000吗?
|
|
|
|
|
|
|
|
谢谢楼上各位的意见,我已更正了错误之处,不过还是有个很奇怪的问题,希望大家继续帮看看!
//晶振是11.0592Mhz #include #define s8 signed char #define u8 unsigned char #define u16 unsigned int ***it D1 = P0^0;//位定义LED0 u16 tmr0_value = 1000;//定时器0的初值 void init_tmr0(void); int main(void) { init_tmr0();//初始化定时器0 while (1); return 0; } void init_tmr0(void) { TMOD = 0x01;//设置tmr0为工作方式1 EA = 1;//开总中断 ET0 = 1;//开定时器0中断 TH1 = (65536 - tmr0_value) >> 8;//得到高8位 TH0 = (65536 - tmr0_value) & 0x00ff;//得到低8位 TR0 = 1;//启动定时器0 return; } //注:定时器溢出后若没重装初值就重新从0开始计数(0—65535) //计数到65536就溢出! void tmr0(void) interrupt 1//定时器0中断 { TR0 = 0;//关闭定时器0 //重新给定时器0赋初值 TH1 = (65536 - tmr0_value) >> 8; TH0 = (65536 - tmr0_value) & 0x00ff; D1 = !D1;//D1的闪烁速度和tmr0_value的值不匹配 TR0 = 1;//启动定时器0 return; } 现象:tmr0_value 取值为25000时,人眼可以明显地看见D1的闪烁! 困惑:大家看红色代码tmr0_value = 20000时,人眼是看不到D1闪烁的;当tmr0_value = 30000时,人眼能略见D1闪烁,这当然是符合情理的,但当tmr0_value = 25000时,D1的闪烁变的非常明显,这真是好奇怪呃! |
|
|
|
65536改成65536ul试试看。
其实改成65535ul不是更好?2个字节空间就够了,运算还更快。 定时器中断可以设置成一个1ms或是10ms的tick,然后在主循环中查询tick的值,根据需要就可以得到你需要的频率了。 |
|
|
|
请问 65535ul和65536到底是啥区别呀?真心不懂啊 还看到有人用类似65536u了的。u和ul都是什么意思呢?
|
|
|
|
哦 明白了数字后面加u表示无符号型吧,ul表示无符号长型吧?但不懂的是u是unsigned char 还是unsigned int呢?还有在stm32里的uchar、uint和51里的uchar、uint的长度一样吗?
|
|
|
|
|
|
|
|
嗯嗯 好的 是不是以后只要是写程序 遇到正的常数时 都可以在常数后加u或者ul啊?
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9002 浏览 16 评论
4051 浏览 18 评论
1110浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
569浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 00:31 , Processed in 1.302340 second(s), Total 99, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号