在本项目中,我们将使用ATMEGA32计时器设计一个简单的闹钟。ATmega32A微控制器具有一个16位计时器,我们将使用该计时器来计数秒数并开发一个数字时钟。
所有数字时钟内部都装有水晶,这是时钟的心脏。该晶体不仅存在于时钟中,而且存在于所有计算实时系统中。该晶体产生时钟脉冲,这是时序计算所必需的。尽管还有其他一些方法可以获取时钟脉冲,但是出于准确性和更高的频率,最喜欢基于晶体的时钟。我们将连接一个晶体到ATMEGA32,以获得准确的时钟。
所需组件
硬件: ATmega32微控制器,11.0592MHz晶体,22pF电容器(2个),电源(5v),AVR-ISP编程器,JHD_162ALCD(16x2 LCD),100uF电容器(跨电源连接),按钮(四个),10KΩ电阻(六片),100nF电容r(四片),三针开关(两片),2N2222晶体管,蜂鸣器和200Ω电阻。
软体: Atmel studio 6.1,progisp或flash magic。
电路图和工作说明
为了精确计时,我们连接了一个11.0592MHz的时钟晶体。现在,要禁用ATMEGA的内部时钟,我们必须更改其LOW FUSE BITS。请记住,我们没有触及高熔丝位,因此仍将启用JTAG通信。
为了告诉ATMEGA禁用内部时钟并使用外部时钟,我们需要进行以下设置:
低使用字节= 0xFF或0b11111111。
ATMEGA32的PORTB电路连接到数据端口LCD。如果要使用PORTC作为普通通信端口,则应记住通过更改高熔丝字节来禁用ATMEGA PORTC中的JTAG通信。在16x2 LCD中,如果有黑灯,则全部有16个针脚;如果没有背光,则有14个针脚。一个人可以给背光灯供电或离开。现在,在14个引脚中,有8个数据引脚(7-14或D0-D7),2个电源引脚(1&2或VSS&VDD或gnd&+ 5v),第三个用于对比度控制的引脚(VEE控制字符的粗细)如图所示)和3个控制引脚(RS&RW&E)
在电路中,您可以观察到我只接了两个控制引脚。这提供了更好理解的灵活性,不经常使用对比度位和READ / WRITE,因此它们可以接地。这使LCD处于最高对比度和读取模式。我们只需要控制ENABLE和RS引脚即可相应地发送字符和数据。
LCD的连接如下所示:
PIN1或VSS接地
PIN2或VDD或VCC至+ 5v电源
PIN3或VEE接地(为初学者提供最大对比度)
PIN4或RS(寄存器选择)至uC的PD6
PIN5或RW(读/写)接地(将LCD置于读模式可简化用户的通信)
PIN6或E(启用)到uC的PD5
uC的PIN7或D0至PB0
uC的PIN8或D1至PB1
uC的PIN9或D2至PB2
uC的PIN10或D3至PB3
uC的PIN11或D4至PB4
uC的PIN12或D5至PB5
uC的PIN13或D6至PB6
uC的PIN14或D7至PB7
在电路中,您可以看到我们使用了8位通信(D0-D7),但这不是强制性的,我们可以使用4位通信(D4-D7),但是使用4位通信程序会变得有些复杂。因此,如上表所示,我们将LCD的10个引脚连接到控制器,其中8个引脚为数据引脚,另外2个为控制引脚。
开关一用于启用警报和时间之间的调整功能。如果引脚为低电平,我们可以通过按按钮来调整警报时间。如果其高按钮仅用于调整TIME。这里有四个按钮,第一个用于在警报或时间中增加MINUTES。第二个是减少闹钟或时间MINUTES。第三是在警报或时间中增加HOUR。FOURTH用于减少闹钟或时间中的HOURS。
此处存在的电容器用于消除按钮的弹跳效果。如果将它们卸下,则每次按该按钮时,控制器的计数可能会超过一个。当按下按钮将引脚下拉至地面时,用于引脚连接的电阻器用于限制电流。
每当按下按钮时,控制器的相应引脚就会下拉到地面,因此控制器会识别出某些按钮已按下,并采取了相应的措施。
首先,我们在这里选择的时钟为11059200 Hz,将其除以1024得到10800。因此,每秒钟我们得到10800个脉冲。因此,我们将使用1024个预分频器启动一个计数器,以使计数器时钟为10800 Hz。其次,我们将使用ATMEGA的CTC(清除计时器计数器)模式。将有一个16位寄存器,我们可以在其中存储一个值(比较值),当计数器计数到比较值时,将设置为产生中断。
我们将比较值设置为10800,因此基本上我们将每秒获得一个ISR(每次比较的中断服务程序)。因此,我们将使用这个及时的例程来获取所需的时钟。
棕色(WGM10-WGM13):这些位用于选择定时器的操作模式。
现在,由于我们希望CTC模式具有OCR1A字节中的比较值,我们只需要将WGM12设置为1,剩下的就保留了,因为它们默认为零。
红色(CS10,CS11,CS12):这三个位用于选择预分频器,并因此获得适当的计数器时钟。
由于我们希望将1024作为预缩放比例,因此必须同时设置CS12和CS10。
现在还有另一个寄存器,我们应该考虑:
GREEN(OCIE1A):必须将该位置1,以便在计数器值与我们设置的OCR1A值(10800)的比较匹配时获得中断。
OCR1A值(计数器比较值)被写入上述寄存器。
编程说明
下面的代码逐步说明了闹钟的工作方式:
#include //标头以启用对引脚的数据流控制#define F_CPU 1000000 //附加了告诉控制器晶体的频率#include