1.定时器&蜂鸣器
一般定时器中断函数里的内容最好是能够快速地去执行完,比如只执行几条简单的语句,这样与主函数配合才会使程序更加高效。前期教学里,我们只使用定时器中断负责某个IO引脚间隔跳变或者使一个变量间隔自加1的简单语句。
比如我们现在要实现间隔50ms左右的时间让流水灯左右循环移动的同时,还需要无源蜂鸣器一直响,这样的功能,思路该怎么去思考?
首先我们知道无源蜂鸣器要想鸣叫的比较尖锐,那P1.6需要一个合适的脉冲信号,这个信号笔者打算使P1.6高低电平保持的时间为300微秒不断循环。
所以我们用定时器中断实现P1.6的电平间隔跳变,主函数里负责完成流水灯的任务即可。
2.代码
#include #include u8 T0RH, T0RL; void TIM0_Init(u32 us,int trim)//trim:微调 { u32 tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率 tmp = ( tmp * (us/100) )/10000;//计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp+trim; //补偿中断响应延时造成的误差 T0RH = (unsigned char)(tmp>>8);//定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; //清0低四位 TMOD |= 0x01; //设置定时器0为工作模式1 TH0 = T0RH; //加载T0重载值 TL0 = T0RL; ET0 = 1; //闭合定时器0中断的开关 TR0 = 1; //启动定时器0 } void main() { u8 i,dir; LED_Init(); //初始化LED硬件模块 EA = 1; //闭合总中断开关 TIM0_Init(300,0); //用定时器0定时300us,不微调 while(1) { if(i<8)dir=0;//向左移 if(dir==0)P0=~(0x01< if(i>=8)dir=1;//向右移 if(dir==1)P0=~( 0x80>>(i-7) );//当i大于等于8之后,(i-7)其实也还是在1~7之间变化 i++; if(i>=15)i=1;//让i一直在1~14之间变化 delay_ms(50); } } void TIM0_IRQHandler() interrupt 1 { TH0 = T0RH; //重新加载重载值 TL0 = T0RL; BEEP=!BEEP; } 可以看到使用定时器中断比外部中断触发还要高效。 3.讲解微调 然后回到上一讲说过的怎么测试然后去微调使定时时间更精确。 拿我们这讲的代码来说,首先在不微调的情况下,也就是传入的参数trim为0,看看定时的时间是多少。 进入软件调试模式,在“BEEP=! BEEP;”设置断点,在没有微调之前观察每次执行“BEEP =! BEEP;”的间隔时间。 按下RST复位之后,先按两次RUN 再按一次RUN 定时时间为0.003285-0.002979= 0.000306s 所以定时时间超了6微秒,则需要给trim一个合适的参数,这里笔者调出了最合适的数为6,所以我们初始化定时器时改为 TIM0_Init(300,6); //用定时器0定时300us,6是微调使定时时间更精确 这样每次跳转到中断函数去执行的间隔时间就为精确的300us了。 当我们要定时十毫秒或者二三十毫秒时,微调的数可能就不是6了,而是20之间或者其他数,所以每次想要精确定时就需要软件调试亲自测试。
上一篇:51单片机-代码参考
下一篇:51单片机-单独文件封装
推荐阅读最新更新时间:2024-11-12 10:20
推荐帖子
- ddk编译dll
- 请问,怎么用ddk编译dll文件,封装一定功能的函数给程序使用啊。ddk编译dlldefineinyoursourcesfileTARGETTYPE=DYNLINKlz要干嘛?
- ljz1023 嵌入式系统
- linux内核完全剖析-基于0.12的
- 这里分享一下赵炯博士的经典书籍:linux内核完全剖析-基于0.12的,其实这本书是0.11的,只是它是修订版,也到0.12了,但是却比0.12的书少很多页,看起来心里没压力呀,呵呵。由于本人是新来的,资源很少,币值也少的可怜,所以这本书就索要一个币值,争取在此处生活下去。希望富人支持。假如有新人也是白手起家,没事,可以联系我,免费赠送。邮箱为:ubuntu2020@163.comlinux内核完全剖析-基于0.12的支持楼主谢谢啦值得学习学习不客气,对你有用就好回复沙发f
- wzlong2012 Linux与安卓
- 招聘嵌入式硬件开发高级工程师
- 工作地点:深圳做过嵌入式硬件开发2年以上重点大学电子,通信,计算机等相关专业待遇优厚!!!有意者请投简历至:helen.xw@163.com咨询请加MSN:netfall49@hotmail.comQQ:690236961招聘嵌入式硬件开发高级工程师重点大学电子很牛吗?青铜剑等级:发表于:2007-12-0609:49:161楼得分:0重点大学电子很牛吗?-----------------------------------------顶
- mjj19680827 嵌入式系统
- 求一wince6.0的应用程序,供测试用
- 谁有在wince6.0上写的像小游戏,或者文本等可以下载到模拟器上作测试用的小程序,我不需要原代码,只要编译后的.exe文件即可。先谢谢了!求一wince6.0的应用程序,供测试用急用,自己先顶一下只要是程序都可以吗?引用2楼rattlerattle的回复:只要是程序都可以吗? 恩,只要在wince6的模拟器上可以跑,可测试的功能点尽量多点,但不要太难,给一小孩做功能测试用的例子大家帮帮忙啊引用4楼xmjmengmeng的回复:大家帮帮忙啊 自己动手吧
- baandmaandme WindowsCE
- PT4121恒流控制器的应用
- 按照经典电路焊接板子为什么发挥不了片子恒流控制的功能?与DS上给的公式计算不符,采样电阻有什么要求?但是可以PWM控制,请问怎么解决?PT4121恒流控制器的应用PT4121的采样电阻是由芯片的最大电流决定,因此这个采样电阻有功率要求。实际上这个采样就是设定最大输出电流,实际PCB设计时,为可调电流的方便,一般可以设计2个电阻并联方式这个电阻靠近Vin和CSN脚,还有二极管要用肖特基,电感要用功率电感。采样电阻有阻值要求吗?因为我不需要太大电流,所以我用2欧采样电阻有影响吗?电阻是
- 天际超体 LED专区
- 这里我发现对串口的问题特别多,大家看看我的一点经验
- //rs422overUSART1#includemsp430x14x.h#includefoshan.h//P3.6UTXD1//P3.7URXD1charfe_wt={\'1\',\'D\',\'F\',\'F\',\'E\',\'5\',\'0\',\'1\',\'2\',\'3\',\'0\',13};ucharfe_rd={\'1\',\'D\',\'E\',\'F\',\'E\',\'5\',\'2\',13};ucharflag=0
- shenyong 微控制器 MCU