收藏 分销(赏)

微机与单片机综合课程设计说明书模板样本.doc

上传人:二*** 文档编号:4516797 上传时间:2024-09-26 格式:DOC 页数:35 大小:818.52KB 下载积分:5 金币
下载 相关 举报
微机与单片机综合课程设计说明书模板样本.doc_第1页
第1页 / 共35页
本文档共35页,全文阅读请下载到手机保存,查看更方便
资源描述
《微机与单片机综合课程设计》 阐明书 课题名称: 基于单片机和DS1302时钟设计 学 号: 班 级: 13级过程自动化3班 姓 名: 蔡才华 成 绩: 指引教师: 陈 裕 国 课题工作时间: -1-4 至 -1-15 武汉工程大学电气信息学院 一、课程设计任务和基本规定: (一) 设计任务 运用单片机和DS1302时钟芯片设计一种简易时钟,完毕对时钟芯片读写编程,将读届时间在数码管显示出来。 (二) 基本规定 通过本系统设计,理解DS1302时钟芯片和数码管显示工作原理并掌握其编程办法;进一步熟悉单片机系统设计办法 二、指定参照书: 1. 徐爱钧,徐阳 编著。《单片机原理与应用—基于Proteus虚拟仿真技术(第2版)》,机械工业出版社。7月 2. 赵广元 编著。《proteus辅助单片机原理实践—基本设计、课程设计、毕业设计》,北京航空航天大学出版社。9月 答辩记录: 答辩意见及答辩成绩 答辩教师(签字): 20 年 月 日 目录 1. 系统分析 1.1 ds1302芯片..............................................6 1.1.1 引脚图及寄存器.....................................6 1.1.2 读写时序阐明.......................................8 1.1.3 内部电路图.........................................9 1.2 数码管显示原理..........................................10 2. 程序设计 2.1 总体设计.........................................11 2.2 分块程序设计...........................................12 2.2.1 ds1302初始化模块...........................13 2.2.2 数码管显示模块.............................16 2.2.3 主函数模块................................ 17 3.proteus仿真 3.1 电路图搭建..........................................18 3.1.1元件库选取.....................................18 3.1.2 元件布局......................................19 3.2 仿真运营.............................................21 3.2.1 keil软件使用..................................21 3.2.2 proteus运营效果图...............................23 4.总结......................................................24 参照资料..................................................24 附录一 源程序清单...........................................25 附录二 电路原理图...........................................30 1.系统分析 1.1 DS1302时钟芯片 DS1302时钟芯片, 该芯片是美国DALLAS公司推出一种高性能、低功耗实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送各种字节时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一种月小与31天时可以自动调节,且具备闰年补偿功能。工作电压宽达4.5~5.5V。采用双电源供电(主电源和备用电源),可设立备用电源充电方式,提供了对后背电源进行涓细电流充电能力。 DS1302用于数据记录,特别是对某些具备特殊意义数据点记录上,能实现数据与浮现该数据时间同步记录,因而广泛应用于测量系统中。 1.1.1 引脚图及寄存器 内部电路: 各引脚功能为: Vcc1:主电源;Vcc2:备份电源。当 Vcc2>Vcc1+0.2V 时, 由 Vcc2向 DS1302供电,当 Vcc2< Vcc1时,由 Vcc1向 DS1302供电。 SCLK:串行时钟,输入,控制数据输入与输出; I/O:三线接口时双向数据线; CE:输入信号,在读、写数据期间,必要为高。该引脚有两 个功能:第一,CE 开始控制字访问移位寄存器控制逻辑;另一方面,CE 提供结束单字节或多字节数据传播办法; DS1302有下列几组寄存器: ① DS1302关于日历、时间寄存器共有12个,其中有7个寄存器 (读时81h~8Dh,写时80h~8Ch),存储数据格式为 BCD 码形式, 如图所示。 DS1302关于日历、时间寄存器 小时寄存器(85h、84h)位7用于定义 DS1302是运营于12小时 模式还是24小时模式。当为高时,选取12小时模式。在12小时模式时, 位5是 ,当为1时,表达 PM。在24小时模式时,位5是第二个10小时 位。 秒寄存器(81h、80h)位7定义为时钟暂停标志(CH)。当该 位置为1时,时钟振荡器停止,DS1302处在低功耗状态;当该位置为 0时,时钟开始运营。 控制寄存器(8Fh、8Eh)位7是写保护位(WP),其他7位均置 为0。在任何对时钟和 RAM 写操作之前,WP 位必要为0。当 WP 位为1时,写保护位防止对任一寄存器写操作。 ②DS1302关于 RAM 地址 DS1302中附加31字节静态 RAM 地址如图所示。 ③ DS1302工作模式寄存器 所谓突发模式是指一次传送各种字节时钟信号和 RAM 数据。 突发模式寄存器如图所示。 1.1.2 读写时序阐明 DS1302是 SPI 总线驱动方式。它不但要向寄存器写入控制字, 还需要读取相应寄存器数据。 要想与 DS1302通信,一方面要先理解 DS1302控制字。DS1302 控制字如图 控制字最高有效位(位7)必要是逻辑1,如果它为0,则不能把 数据写入到 DS1302中。 位6:如果为0,则表达存取日历时钟数据,为1表达存取 RAM 数 据; 位5至位1(A4~A0):批示操作单元地址; 位0(最低有效位):如为0,表达要进行写操作,为1表达进行读 操作。 控制字总是从最低位开始输出。在控制字指令输入后下一种 SCLK 时钟上升沿时,数据被写入 DS1302,数据输入从最低位(0 位)开始。同样,在紧跟8位控制字指令后下一种 SCLK 脉冲 下降沿,读出 DS1302数据,读出数据也是从最低位到最高位。 数据读写时序如图 。 1.1.3 电路原理图: 电路原理图如图8,DS1302与单片机连接也仅需要3条线:CE 引脚、 SCLK 串行时钟引脚、I/O 串行数据引脚,Vcc2为备用电源,外接 32.768kHz 晶振,为芯片提供计时脉冲。 1.2 数码管显示原理 咱们最惯用是七段式和八段式LED数码管,八段比七段多了一种小数点,其她基本相似。所谓八段就是指数码管里有八个小LED发光二极管,通过控制不同LED亮灭来显示出不同字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED阴极连在一起,让其接地,这样给任何一种LED另一端高电平,它便能点亮。而共阳极就是将八个LED阳极连在一起。其原理图如下。 其中引脚图两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。一种八段数码管称为一位,各种数码管并列在一起可构成多位数码管,它们段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。数码管8段,相应一种字节8位,a相应最低位,dp相应最高位。因此如果想让数码管显示数字0,那么共阴数码管字符编码为00111111,即0x3f;共阳数码管字符编码为11000000,即0xc0。可以看出两个编码各位正好相反。如下图。 2 程序设计 2.1 总体设计  在设计程序之前咱们已经对ds1302和c51CPU之间通信原理很清晰了。咱们设计简易时钟时,先把主函数设计好。那么如何设计主函数? 主函数是实现该功能重要某些,主函数实现将ds1302时钟信号精确无误传给CPU,在传递过程中要明确地址和数据传送时区别,时钟信号线I/O是分时复用。 这里咱们写了一种数据读取函数DS1302ReadCmd (),将地址中数据传递给单片机,由于ds1302和单片机不能直接通信,因此在子程序DS1302ReadCmd ()中还要嵌套一种DS1302写字节函数---DS1302WriteByte(uchar dat),这个写字节函数重要功能是把,ds1302时分秒寄存器地址告诉1302芯片,ds1302在接受到地址值后自动将该地址下数据传给CPU,最后加一种数码管显示模块就可以完毕上述功能。 详细实现办法如下所示: 2.2 分块程序设计 为了理解以便,将本课程设计软件某些分为如下模块: Ds1302初始化模块,数码管显示模块 ,主函数模块 。(模块之间有交叉,分模块是为了阐明以便) 2.2.1 Ds1302初始化模块: 1) 写字节函数: 将要写入数据dat赋值给单片机中间变量temp,将temp数据八位由低到高依次传递到ds1302I/O口。其中每传递一位,给SLK端口一种上升沿(这是由ds1302工作时序决定)。 // DS1302写字节函数 void DS1302WriteByte(uchar dat) { uchar i = 0,temp = 0; CE = 0; //CE引脚为低,数据传送中断 SCLK = 0; //清零时钟总线 CE = 1; //CE引脚为高,逻辑控制有效 for (i=8;i>0;i-- ) //循环8次移位 { SCLK = 0; temp = dat; DIO = (bit)(temp&0x01);//每次传播低字节 dat >>= 1; //右移一位 SCLK = 1; } } 分析: 针对本课题规定,写字节函数作用是对1302进行初始化。 2) 读字节函数: 将ds1302 I/O口数据传给ACC寄存器最高位,运用循环语句移位,依次将8位传递到ACC寄存器,此函数返回值ACC。 // DS1302读字节函数 uchar DS1302ReadByte() { uchar i,dat1,dat2; CE = 1; for (i=8;i>0;i--) { ACC_7 = DIO; SCLK = 1; ACC >>= 1; SCLK = 0; } CE=0; dat1=ACC; dat2=dat1/16;//数据进制转换,十六进制转换成十进制 dat1=dat1%16; dat1=dat2*10+dat1; return dat1; } 分析: 读字节函数是将ds1302芯片中时钟信号传给单片机重要某些。 3) 地址和数据发送函数: 先写地址addr,再给数据。先将要读出时间信号地址告诉ds1302,单片机再将数据传到I/O口。 // 地址、数据发送函数 void DS1302WriteCmd (uchar addr,uchar dat) { DS1302WriteByte(addr);//发送地址 DS1302WriteByte(dat);//发送数据 } 分析:此函数可以在本程序中实现对ds1302芯片初始化。 4) 数据读取函数: 先写地址,再返回数据。 // 数据读取函数 uchar DS1302ReadCmd (uchar addr) //数据读取子程序 { DS1302WriteByte(addr); //发送地址 return (DS1302ReadByte()); //接受数据 } 5) 初始化时间: 先禁止写保护,再初始化时间,最后启动写保护。 // DS1302初始化函数 void DS1302Init(void) //初始化DS1302 { DS1302WriteCmd (0x8E,0x00); //禁止写保护 DS1302WriteCmd (0x80,0x00); //秒位初始化 DS1302WriteCmd (0x82,0x00); //分钟初始化 DS1302WriteCmd (0x84,0x20); //小时初始化 DS1302WriteCmd (0x86,0x01); //日初始化 DS1302WriteCmd (0x88,0x01); //月初始化 DS1302WriteCmd (0x8c,0x12); //年初始化 DS1302WriteCmd (0x8E,0x80); //容许写保护 } 分析:此函数初始化值可由使用者自己设定。 2.2.2 数码管显示模块。 此函数作用是将单片机中ACC寄存器中时间数据值显示到七段数码管中。其中,P3端口接受位选信号,P2端口接受段选信号。 // 数码管显示函数 void LEDDisplay() { uchar i; DisplayBuf[7] = TimeBuf[2]%10; DisplayBuf[6] = TimeBuf[2]/10; DisplayBuf[4] = TimeBuf[1]%10; DisplayBuf[3] = TimeBuf[1]/10; DisplayBuf[1] = TimeBuf[0]%10; DisplayBuf[0] = TimeBuf[0]/10; for(i = 0 ;i < 8;i++) //数码管动态显示 { P3 = Seg[i]; P2 = table[DisplayBuf[i]]; delay(1); //延时1ms让数码管正常显示出来 } } 2.2.3 主函数模块。 TimBuf数组变量存储从ds1302中读取数据。 // 主函数 void main() { DS1302Init(); while(1) { TimeBuf[2]=DS1302ReadCmd(0x81); //0x81,0x83,0x85分别为秒,分,时读地址位 TimeBuf[1]=DS1302ReadCmd(0x83); TimeBuf[0]=DS1302ReadCmd(0x85); // TimeBuf[2]=DS1302ReadCmd(0x87); //0x87,0x89,0x8b分别为年,月,日读地址位 // TimeBuf[1]=DS1302ReadCmd(0x89); // TimeBuf[0]=DS1302ReadCmd(0x8d); LEDDisplay(); } } 3 Proteus仿真 3.1电路图搭建 3.1.1元件库选取 由图上操作后元件库如下: 3.1.2元件布局: ds1302与C51连接: 注:DIO接单片机P1.0口 SCLK接单片机P1.1口 RST接单片机P1.2口 数码管与C51连接: 位选接P3口,段选接P2口。 注:当proteus 原理图十分复杂且连线操作困难时,可以用Lab命令标记,这样可以减少连线数量从而使原理图更简洁直观。详细操作如下: 第一步 “Lab”键 第二步: 点击需要标号引脚,改成相应编号 注意: 相连引脚标号一定要一致,否则会导致错连进而影响电路图对的性。 3.2 仿真运营: 3.2.1 keil软件使用 本课设借助keil编译环境实现软件驱动: 先建工程 再建文献 3.2.2 proteus仿真效果 4 总结 本次单片机机课程设计选题不但仅完毕了对C51编程、protues软件学习,同步对于单片机硬件理解掌握更加完善,在硬件电路搭配过程中更是提高了动手能力以及加深模仿电路理论知识理解。在完毕本次课程设计过程中,开拓了视野,获得了到此前上课所不能学到知识和经验,会为后来课程学习带来很大协助。 参照书 1. 徐爱钧,徐阳 编著。《单片机原理与应用—基于Proteus虚拟仿真技术(第2版)》,机械工业出版社。7月 2. 赵广元 编著。《proteus辅助单片机原理实践—基本设计、课程设计、毕业设计》,北京航空航天大学出版社。9月 附录一:完整源程序代码 #include<reg51.h> #define uchar unsigned char #define uint unsigned int Uchar code table[]={0x3F,0X30,0X5b,0X4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴数码管"0-9","灭","-"编码 uchar code Seg[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};//位选编码 uchar data DisplayBuf[]={0,0,11,0,0,11,0,0};//时分秒显示缓冲区 uchar data TimeBuf[]={0,0,0};//时分秒值 sbit ACC_7 = ACC^7; //位寻址寄存器定义 sbit SCLK = P1^1; // DS1302时钟信号 7脚 sbit DIO= P1^0; // DS1302数据信号 6脚 sbit CE = P1^2; // DS1302片选 5脚 // 延时函数 void delay(uint i) { uint j; for(i;i > 0;i--) for(j = 110;j > 0;j--); } // DS1302写字节函数 void DS1302WriteByte(uchar dat) { uchar i = 0,temp = 0; CE = 0; //CE引脚为低,数据传送中断 SCLK = 0; //清零时钟总线 CE = 1; //CE引脚为高,逻辑控制有效 for (i=8;i>0;i-- ) //循环8次移位 { SCLK = 0; temp = dat; DIO = (bit)(temp&0x01);//每次传播低字节 dat >>= 1; //右移一位 SCLK = 1; } } // DS1302读字节函数 uchar DS1302ReadByte() { uchar i,dat1,dat2; CE = 1; for (i=8;i>0;i--) { ACC_7 = DIO; SCLK = 1; ACC >>= 1; SCLK = 0; } CE=0; dat1=ACC; dat2=dat1/16;//数据进制转换,十六进制转换成十进制 dat1=dat1%16; dat1=dat2*10+dat1; return dat1; } // 地址、数据发送函数 void DS1302WriteCmd (uchar addr,uchar dat) { DS1302WriteByte(addr);//发送地址 DS1302WriteByte(dat);//发送数据 } // 数据读取函数 uchar DS1302ReadCmd (uchar addr) //数据读取子程序 { DS1302WriteByte(addr); //发送地址 return (DS1302ReadByte()); //接受数据 } // DS1302初始化函数 void DS1302Init(void) //初始化DS1302 { DS1302WriteCmd (0x8E,0x00); //禁止写保护 DS1302WriteCmd (0x80,0x00); //秒位初始化 DS1302WriteCmd (0x82,0x00); //分钟初始化 DS1302WriteCmd (0x84,0x20); //小时初始化 DS1302WriteCmd (0x86,0x01); //日初始化 DS1302WriteCmd (0x88,0x01); //月初始化 DS1302WriteCmd (0x8c,0x12); //年初始化 DS1302WriteCmd (0x8E,0x80); //容许写保护 } // 数码管显示函数 void LEDDisplay() { uchar i; DisplayBuf[7] = TimeBuf[2]%10; DisplayBuf[6] = TimeBuf[2]/10; DisplayBuf[4] = TimeBuf[1]%10; DisplayBuf[3] = TimeBuf[1]/10; DisplayBuf[1] = TimeBuf[0]%10; DisplayBuf[0] = TimeBuf[0]/10; for(i = 0 ;i < 8;i++) //数码管动态显示 { P3 = Seg[i]; P2 = table[DisplayBuf[i]]; delay(1); //延时1ms让数码管正常显示出来 } } // 主函数 void main() { DS1302Init(); while(1) { TimeBuf[2]=DS1302ReadCmd(0x81); //0x81,0x83,0x85分别为秒,分,时读地址位 TimeBuf[1]=DS1302ReadCmd(0x83); TimeBuf[0]=DS1302ReadCmd(0x85); // TimeBuf[2]=DS1302ReadCmd(0x87); //0x87,0x89,0x8b分别为年,月,日读地址位 // TimeBuf[1]=DS1302ReadCmd(0x89); // TimeBuf[0]=DS1302ReadCmd(0x8d); LEDDisplay(); } } 附录二:系统硬件原理图:
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服