模组选型解析
设计思路
产品接线
部分代码解析
总结
模组选型设计电子时钟的时候采纳了最根本的单片机51单片机,利用的芯片为STC89C52RC,开拓板选用了最小系统板,也方便朋友们理解接线以及事理,大略清晰,时钟芯片选型方面选取了DS1302的时钟模组,接线方面选用杜邦线进行连接,显示方面采取低功耗的LCD1602进行显示,LCD1602的比拟度调节选取单圈精密电阻器10K电阻器。
模组选型解析模组详细图片如下:
DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的构造、事情事理及其在实时显示韶光中的运用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能;
LCD1602液晶显示屏为工业字符型液晶,能够同时显示16x02即32个字符。(16列2行),刚好可以上排显示年月日,下排显示时钟。
设计思路功能先容lcd1602显示实时时钟可以在函数中实现设置时钟芯片初始值,缺陷: 由于没有增加其他功能,此功能较为大略,校定时光只能通过源代码进行校准。
流程:
1. 在程序前端定义一个初始化的数组文件,把稳的是DS1302须要转成压缩的BCD码进行存储,方便后面的初始化时钟芯片时关闭芯片写保护时候调用数组。
2. 进行LCD1602和DS1302的读写初始化时序代码。由于51没有直接的SPI通信而DS1302与LCD1602有点类似三线SPI通信可利用软件进行仿照通信。
3. 对DS1302读出的数据进行取出操作并显示在LCD1602上
产品接线产品接线详细如下图所示,接线中LCD的数据口利用的是单片机的P0口,时钟旗子暗记口利用的是P2_0到P2_3,DS1302 利用的为P1_1到P1_3口。详细效果和接线可看下图所示:
部分代
部分代码解析串行通信字节发送解析:
如何将一个字节拆分成0101的二进制位发出去,并剖析如何将0101的二进制位变成一个完全的字节。
首先23 H=0010 0011B,最低位是1,最高位是0,现在将0x23&0x01进走运算,结果当然是0x01,这时,我们就该当将数据线变成1,然后0x23往右移动一个二进制位,得出的结果是11 H=0001 0001 B(这里有一个重点,数据右移的时候,最高位是补0的,数据左移的时候,最低位补0)。
假设上面的数据右移了2次后,最初的23 H变成了08 H=0000 1000 B,现在连续对0x08&0x01做运算得出的结果是0,这时,将数据线变为0,如此循环8次,就可以将1个字节分成串行数据一位一位的传送出去了。
吸收解析:
假设串行数据先发送最低位,首先将一个数据00 H右移一个二进制位,得出的数据当然还是00 H,然后如果数据总线上的电平是1,那么此时就把00 H和80 H做或运算,得出的结果便是80 H,然后下一个电平的时候80 H右移一个二进制位,得出的结果是40 H,如果此时数据线的电平还是1,那就连续和80 H做或运算,得C0 H,终极通过8次运算,就可以将1个字节全部吸收完毕。
时序解析
上面读写时序可以知道,读单字节的时候是在时钟脉冲的低落沿脉冲旗子暗记,因此在程序中可以先给时钟旗子暗记高电平再给低电平制造一个低落沿的脉冲旗子暗记从而读取一个字节,一个字节有8位可以利用for循环进行8位循环读取。代码如下:
u8 DS1302_Read_Byte(){ u8 i, Byte ; DS_CLK = 1 ; //时钟线拉高 Byte = 0 ; for( i=0; i<8; i++ ) { Byte >>= 1 ; //数据右移一个位 DS_CLK = 0 ; //时钟线拉低产生低落沿 if( DS_IO==1 ) //判断数据线上的值为1 Byte |= 0x80 ; //字节写入1 DS_CLK = 1 ; //时钟线拉高 } return Byte ;}
读的时序刚好和写的相反,在上升沿写入:
void DS1302_Write_Byte( u8 Byte ){ u8 i ; for( i=0; i<8; i++ ) { if( ( Byte&0x01 )==0x01 ) //判断最低位是1 DS_IO = 1 ; //数据线拉高发送1 else DS_IO = 0 ; //数据线拉低发送0 Byte >>= 1 ; //数据右移一个位 DS_CLK = 0 ; //时钟线复位 DS_CLK = 1 ; //时钟线拉高产生上升沿 }}
1:LCD1602初始化代码
void LCD_init(void) {Write_Instruction(0x38);//8bit interface,2line,57dotsDelay_xms(5);Write_Instruction(0x38);Delay_xms(5);Write_Instruction(0x38);Write_Instruction(0x08);//关显示,不显光标,光标不闪烁Write_Instruction(0x01);//清屏Delay_xms(5);Write_Instruction(0x04);//写一字符,整屏显示不移动//Write_Instruction(0x05);//写一字符,整屏右移//Write_Instruction(0x06);//写一字符,整屏显示不移动//Write_Instruction(0x07);//写一字符,整屏左移Delay_xms(5);//Write_Instruction(0x0B);//关闭显示(不显示字符,只有背光亮)Write_Instruction(0x0C);//开显示,光标、闪烁都关闭//Write_Instruction(0x0D);//开显示,不显示光标,但光标闪烁//Write_Instruction(0x0E);//开显示,显示光标,但光标不闪烁//Write_Instruction(0x0F);//开显示,光标、闪烁均显示}
2:DS1302写入初始值代码由于前面有定义一个初始化时钟的数组,并在先关闭芯片写保护的情形下可直接写入DS1302时钟的初始值。
void ds1302_write_time(void) {ds1302_write_byte(ds1302_control_add,0x00);//关闭写保护 ds1302_write_byte(ds1302_sec_add,0x80);//停息时钟 //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电 ds1302_write_byte(ds1302_year_add,time_buf[1]);//年 ds1302_write_byte(ds1302_month_add,time_buf[2]);//月 ds1302_write_byte(ds1302_date_add,time_buf[3]);//日 ds1302_write_byte(ds1302_hr_add,time_buf[4]);//时 ds1302_write_byte(ds1302_min_add,time_buf[5]);//分ds1302_write_byte(ds1302_sec_add,time_buf[6]);//秒ds1302_write_byte(ds1302_day_add,time_buf[7]);//周 ds1302_write_byte(ds1302_control_add,0x80);//打开写保护 }
总结
本次51电子时钟的设计过程中,并没有利用到任何其他的校准调试的按键等等按钮,有须要利用到按键进行调试的可在此代码根本上进行添加案件函数做成闹钟合营蜂鸣器加中断函数,有须要全代码的可下方留言邮箱获取,长期发布此类文章,喜好的可以常关注,有不对的地方欢迎大家指示。