共2页
其中引脚图的两个CM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为001XXXX1111,即03f;共阳数码管的字符编码为110XXXX0000,即0c0。可以看出两个编码的各位正好相反。如下图。2程序设计2.1总体设计在设计程序之前我们已经对ds1302和c51CPU之间的通信原理很清楚了。我们设计简易时钟时,先把主函数设计好。那么如何设计主函数?主函数是实现该功能的主要部分,主函数实现将ds1302的时钟信号准确无误的传给CPU,在传递过程中要明确地址和数据传送时的区别,时钟信号线I/是分时复用的。这里我们写了一个数据读取函数DS1302ReadCmd(),将地址中的数据传递给单片机,因为ds1302和单片机不能直接通信,所以在子程序DS1302ReadCmd()中还要嵌套一个DS1302写字节函数-DS1302WriteByte(uchardat),这个写字节函数的主要功能是把,ds1302时分秒寄存器地址告诉1302芯片,ds1302在接受到地址值后自动将该地址下的数据传给CPU,最后加一个数码管显示模块就可以完成上述功能。具体实现的方法如下所示:2.2分块程序设计为了理解方便,将本课程设计软件部分分为如下模块:Ds1302初始化模块,数码管显示模块,主函数模块。(模块之间有交叉,分模块是为了说明方便)2.2.1Ds1302初始化模块:1)写字节函数:将要写入的数据dat赋值给单片机中间变量temp,将temp数据的八位由低到高依次传递到ds1302的I/口。其中每传递一位,给SLK端口一个上升沿(这是由ds1302的工作时序决定的1302写字节函数vidDS1302WriteByte(uchardat)uchari=0,temp=0;CE=0;/CE引脚为低,数据传送中止SCLK=0;/清零时钟总线CE=1;/CE引脚为高,逻辑控制有效fr(i=8;i0;i-)/循环8次移位SCLK=0;temp=dat;DI=(bit)(temp001);/每次传输低字节dat=1;/右移一位SCLK=1;分析:针对本课题的要求,写字节函数的作用是对1302进行初始化。2)读字节函数:将ds1302I/口的数据传给ACC寄存器的最高位,利用循环语句移位,依次将8位传递到ACC寄存器,此函数返回值AC1302读字节函数ucharDS1302ReadByte()uchari,dat1,dat2;CE=1;fr(i=8;i0;i-)ACC7=DI;SCLK=1;ACC=1;SCLK=0;CE=0;dat1=ACC;dat2=dat1/16;/数据进制转换,十六进制转换成十进制dat1=dat1%16;dat1=dat210+dat1;returndat1;分析:读字节函数是将ds1302芯片中的时钟信号传给单片机的主要部分。3)地址和数据发送函数:先写地址addr,再给数据。先将要读出的时间信号的地址告诉ds1302,单片机再将数据传到I/、数据发送函数vidDS1302WriteCmd(ucharaddr,uchardat)DS1302WriteByte(addr);/发送地址DS1302WriteByte(dat);/发送数据分析:此函数可以在本程序中实现对ds1302芯片的初始化。4)数据读取函数:先写地址,再返回数读取函数ucharDS1302ReadCmd(ucharaddr)/数据读取子程序DS1302WriteByte(addr);/发送地址return(DS1302ReadByte();/接收数据5)初始化时间:先禁止写保护,再初始化时间,最后开启写保1302初始化函数vidDS1302Init(vid)/初始化DS1302DS1302WriteCmd(08E,000);/禁止写保护DS1302WriteCmd(080,000);/秒位初始化DS1302WriteCmd(082,000);/分钟初始化DS1302WriteCmd(084,020/小时初始化DS1302WriteCmd(086,001);/日初始化DS1302WriteCmd(088,001);/月初始化DS1302WriteCmd(08c,012);/年初始化DS1302WriteCmd(08E,080);/允许写保护分析:此函数的初始化值可由使用者自己设定。2.2.2数码管显示模块。此函数作用是将单片机中ACC寄存器中时间数据值显示到七段数码管中。其中,P3端口接受位选信号,P2端口接受段选信号。/数码管显示函数vidLEDDisplay()uchari;DisplayBuf7=TimeBuf2%10;DisplayBuf6=TimeBuf2/10;DisplayBuf4=TimeBuf1%10;DisplayBuf3=TimeBuf1/10;DisplayBuf1=TimeBuf0%10;DisplayBuf0=TimeBuf0/10;fr(i=0;i8;i+)/数码管动态显示P3=Segi;P2=tableDisplayBufi;delay
(1);/延时1ms让数码管正常显示出来2.2.3主函数模块。TimBuf数组变量存储从ds1302中读取的数数vidmain()DS1302Init();
举报
