购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

任务二
单灯闪烁控制

为了验证某个端口的输出电平是不是由你编写的程序输出的电平,可以采用一个非常简单有效的办法,就是在你想验证的端口位接一个发光二极管。当你输出低电平时,发光二极管亮;输出高电平时,发光二极管灭。电路图如图2.2所示。

在本任务中,使用PC13来控制发光二极管以1Hz的频率不断闪烁。

图2.2 发光二极管电路图

例程:Led_Blink.c

● 接通板上的电源;

● 输入、保存、下载并运行程序Led_Blink.c(整个过程请参考第1章);

● 观察与PC13连接的LED是否周期性的闪烁。

Led_Blink.c是如何工作的?

先看while(1)逻辑块中的语句,两次调用了延时函数,让单片机微控制器在给PC13引脚端口输出高电平和低电平之间都延时500ms,即输出的高电平和低电平都保持500ms,从而达到发光二极管LED以1Hz的频率不断闪烁的效果。

头文件HelloRobot.h中定义了两个延时函数:void delay_nms(unsigned int i)与void delay_nus(unsigned int i)。

无符号长整型数据unsigned long

与长整型数据long相比,无符号长整型数据unsigned long只有一个区别:数据的取值范围从-2147483648~+2147483647变为0~4294967295,也就是说它只能取非负整数。基于ARM内核的微处理器(S3C2410/2440)或者单片机(STM32系列)是32位的,所以Keil MDK开发环境中整型int数据与长整型long数据相同,占用4字节;若在Keil uVision3中开发8位的51单片机程序,则整型int数据占用2字节,与短整型short数据相同。注意它们的范围有所不同。

delay_nus()是微秒级的延时,而delay_nms()是毫秒级的延时。如果你想延时1s,可以使用语句delay_nms(1000);1ms的延时则用delay_nus(1000)来完成。

注意: 上述的延时函数是在外部晶振为8MHz,内部锁相环(Phase Lock Loop,PLL)设置为9倍频的情况下设计的,这两个函数所产生的延时都经过示波器测试过。如果外部晶振频率不是8MHz,调用这两个函数所产生的真正延时就会发生变化。晶振电路如图2.3所示。图2.3(a)是系统晶振电路。

图2.3 晶振电路

晶振的作用

单片机要能工作,就必须有一个标准时钟信号,而晶振就是为单片机提供标准时钟信号。晶振的作用类似人的心跳,只有晶振起振了,嵌入式系统中的处理器才能工作、执行代码、实现特定功能,完成应用程序任务。因此,如果系统不工作应注意查看晶振是否起振了。可以用示波器测量晶振引脚处是否有信号。

如果将晶振比喻为人的心跳,那么电源输出电流就类似于流经人全身的血液。因此晶振和电源在嵌入式系统中的作用,就相当于心脏和血液对于人的作用,你说重不重要!晶振不稳定就相当于心率不齐。没有电源,电源不能输出电流,就相当于没有血液,或血液不流动。在后面的实时时钟章节中,将会更详细的介绍晶振。

注意: STM32上电默认是使用内部高速RC时钟(HIS),因此,判断STM32单片机最小系统是否工作用示波器检查OSC引脚是否有时钟信号是错误的。

如何选择晶振

对于一个高可靠性的系统设计,晶振的选择非常重要,尤其设计带有睡眠唤醒(往往用低电压以求低功耗)的系统。这是因为低供电电压使提供给晶振的激励功率减少,造成晶振起振很慢或根本就不能起振。这一现象在上电复位时并不特别明显,原因是上电时电路有足够的扰动,很容易建立振荡。在睡眠唤醒时,电路的扰动要比上电时小得多,起振变得很不容易。在振荡回路中,晶振既不能过激励(容易振到高次谐波上)也不能欠激励(不容易起振)。晶振的选择至少必须考虑谐振频点、负载电容、激励功率、温度特性、长期稳定性。

如何选择晶振电容

(1)因为每一种晶振都有各自的特性,所以最好按芯片制造厂商所提供的数值选择外部元器件。

(2)电容值小,容易起振;但过小,振荡器容易不稳定。电容值大,有利于振荡器的稳定;但过大,将会增加起振时间,不容易起振。一般选择合适的中间值。 cQl/7G3daFTBmJWKDiBF9VDLJphYU9pvIq09eVgbVzDYVO+Qallg6KJDy0hxss5p

点击中间区域
呼出菜单
上一章
目录
下一章
×