1.定时器与延时的区别
大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。
而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们在第一讲的时候提到调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可以什么事都不做,但是5分钟过后闹钟响了就要执行相关的任务了。
所以上一讲的代码的实现原理就是每隔51微秒,有个变量会自加1,过了1000个51微秒的时候LED的状态才会改变,可以说CPU在51ms的时间里基本没什么事做,只是在51微秒到了的时候做了“cnt++;”这样简单的任务,然后又空闲地等下一个51微秒的到来再执行“cnt++;”。
2.定时器中断函数
与外部中断一样,定时器中断也有中断函数,同理,程序去执行中断函数就会把TF0的中断标志位自动清0,所以只要我们用了定时器中断函数,那么TF0就可以不用再出现在程序书写中了。
还记得外部中断这个图吗
同样定时器0的中断函数使能如下
至于“interrupt”后面的数字为什么是1,请再看我们以前给过大家的这个图的中断函数编号就明白了
这些编号是为了区分哪些硬件资源的相关中断函数,如果我们同时使用两个定时器,那么只能用“interrupt 1”和“interrupt 3”来区分谁是谁的中断函数了。
使用“TIM0_IRQHandler”作为函数名也是模仿STM32定时器中断函数名的写法。
如果我们使用的是工作模式1,每次触发中断函数的执行内容首先就是再次给TH0和TL0赋初值保证下次的定时时间还是一样。
这里我们使用中断函数的执行方式来实现30ms的间隔流水灯,算出TH0和TL0合成的“16位的变量”要填充的值为37888=0x9400。
在中断函数里也是可以定义局部变量的,当然如果这个变量是用来辅助流水灯的,那么肯定是要定义成静态变量的。
3.代码
#include #include void main() { LED_Init(); //初始化LED硬件模块 EA = 1; //闭合总中断开关 TMOD = 0x01; //设置定时器0为工作模式1 TH0 = 0x94; //设置定时时间为30ms TL0 = 0x00; ET0 = 1; //闭合定时器0中断的开关 TR0 = 1; //启动定时器0 while(1); } void TIM0_IRQHandler() interrupt 1 { static u8 i; TH0 = 0x94; //重新设置定时时间为30ms TL0 = 0x00; P0=~(0x80>>i);//这一次让流水灯向右移 i++; if(i>=8)i=0; } 觉得30ms的流速太快,想改为300ms的话,修改一下中断函数即可,如下 void TIM0_IRQHandler() interrupt 1 { static u8 i,cnt; TH0 = 0x94; //重新设置定时时间为30ms TL0 = 0x00; cnt++; if(cnt>=10) { cnt=0; P0=~(0x80>>i);//这一次让流水灯向右移 i++; if(i>=8)i=0; } }
上一篇:51单片机-定时器工作模式2
下一篇:51单片机-定时器初始化新写法
推荐阅读
史海拾趣
在2009年,诚芯微(CXW)公司在深圳成立,标志着其在中国电子行业的初步涉足。公司创始人凭借对集成电路设计领域的深刻理解和前瞻性的市场洞察,决定专注于电源芯片的研发与设计。初期,公司面临着资金紧张、技术储备不足等挑战,但创始人带领团队坚持自主研发,逐步积累了技术实力。
随着公司业务的不断发展,Data Translation开始寻求全球扩张的机会。公司通过设立海外分支机构、与当地企业合作等方式,成功将产品推向全球市场。同时,公司还加大了品牌建设的力度,通过参加国际展会、发布新产品等方式提高品牌知名度。这些举措不仅为公司带来了更多的客户和合作伙伴,还进一步巩固了其在全球数据采集和处理领域的领先地位。
随着业务的发展,Austek Microsystems逐渐意识到,单凭自身的力量难以在市场中取得长远的发展。因此,公司开始积极寻求与业内知名企业的合作。通过与这些企业的深入合作,Austek Microsystems不仅获得了更多的技术支持和市场资源,还成功将自身的产品推向了更广阔的市场。
Cypress不仅仅局限于某一特定的市场领域,而是积极开拓多元化的市场布局。除了传统的数据通信和消费类电子市场外,公司还涉足了汽车、工业和太阳能等领域。这种多元化的市场策略使Cypress能够抵御单一市场波动的影响,保持稳定的业务增长。
1.抓住51开发ARM 这几个月来我一直都爬在51的问题,自己都有一点笑自己了,用了4个月的时间,来巩固51的原理和程序,还好我自己算是走过来了,自己笨,身边的高才生又看不上51的原理,他们都比较“牛”,说51过时了,你问那个做什么???我 ...… 查看全部问答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 09:13 编辑 一、任务 测量两个正弦信号的叠加信号 , 其中,x1是主信号,幅值为 V(偏置为0V),频率为:20-20kHz; x2是次要信号,幅值为主信号的1/4-1/6,频率为:20-20kHz; 二、要求 1.基本要求 (1) ...… 查看全部问答∨ |
|
1.由上位机发送1给单片机时,蜂鸣器以400ms频率发声,发2时以200ms频率发声,发3时以100ms频率发声,发4时关闲蜂鸣器。 程序 如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int uint fre,a; sbit b=P2^3; void init(); void main() { init(); while(1){ if(RI== ...… 查看全部问答∨ |
|
请教大家一个问题,做一个POS机程序的开发,一般价位都是多少? 我现在还不知道具体的内容,什么型号的POS机,也不知道开发一个什么样的程序,大概就是一个数据传输的程序,不知道你们一般都会报价多少? 多谢了 … 查看全部问答∨ |
我现在想在驱动中实现802.1x,启动一个线程来处理802.1x相关的数据包,从而不影响网卡收发包。由于刚开始接触windows的驱动,不是很了解。请大侠给个建议或者给个例子的连接,不胜感激!!!… 查看全部问答∨ |