单片机课设报告.docx
- 文档编号:18259888
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:34
- 大小:752.64KB
单片机课设报告.docx
《单片机课设报告.docx》由会员分享,可在线阅读,更多相关《单片机课设报告.docx(34页珍藏版)》请在冰点文库上搜索。
单片机课设报告
1引言…………………………………………………………………1
1.1设计任务1
1.2主要技术指标和要求1
1.3实验价值和理论意义1
2核心芯片简介2
2.1DS1302简介2
2.1.1DS1302引脚功能与内部结构3
2.1.2DS1302的寄存器4
2.2AT89C52简介4
3方案设计和论证5
4软硬件设计
4.1硬件电路设计5
4.2软件实现10
4.2.1C语言的主程序10
4.2.2时钟读出程序设计13
4.2.3时钟调整程序设计13
5系统调试14
6总结14
参考文献14
附录:
A:
DS1302读写数据程序15
附录B:
主程序以及程序宏定义18
附录C23
附录D:
PCB制板25
目录正文为:
宋体小四1.5倍行距目录要求独立编写页码,用罗马字母,如右下角所示
1、引言
1.1 设计任务
用DS1302时钟芯片设计实时时钟。
1.2 主要技术指标和要求
(1)通过程序直接对实时时钟时间进行设置,启动时钟运行。
用8位数码管实时显示时、分、秒。
(2)用89C52系列单片机及DS1302时钟电路,通过按钮对实时时钟时间进行设置,能输出阳历年、月、日及星期、小时、分、秒等计时信息的实时时钟。
1.3实验价值和理论意义
从古代的滴漏更鼓到近代的机械钟,从电子表到目前的数字时钟,为了准确的测量和记录时间,人们一直在努力改进着计时工具。
钟表的数字化,大力推动了计时的精确性和可靠性。
在单片机构成的装置中,实时时钟是必不可少的部件。
目前常用的实时时钟,很多采用单片机的中断服务来实现,这种方式一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且某些测控系统可能不允许;有的则使用并行接口的时钟芯片,如MC146818、DS12887等,它们虽然能满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂,占用地址、数据总线多,芯片体积大,占用空间多,给其它设计带来诸多不便。
本设计选取串行接口时钟芯片DS1302与单片机同步通信构成数字时钟电路。
其简单的三线接口能为单片机节省大量资源,DS1302的后背电源及对后背电源进行涓细电流充电的能力保证电路断电后仍能保存时间和数据信息等。
这些优点解决了目前常用的实时时钟所无法解决的问题。
该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高要求的场合,具有很高的使用价值。
二、核心芯片简介
2.1DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。
时钟可工作在24小时格式或12小时(AM/PM)格式。
DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。
可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
2.1.1DS1302引脚功能与内部结构
DS1302的引脚功能如表2-1所示,外形及内部结构如图2-1所示
表2-1DS1302引脚功能表
引脚号
引脚名称
引脚功能
1
VCC2
主电源
2,3
X1,X2
振荡源,外接32768HZ晶振
4
GND
地线
5
RST
复位/片选线
6
I/O
串行数据输入/输出端(双向)
7
SCLK
串行时钟输入端
8
VCC1
后备电源
图2-1DS1302管脚图及内部结构图
2.1.2DS1302的寄存器
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其时间寄存器及其控制字见表3-2
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内容。
DS1302与RAM相关的寄存器分为两类,一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H--FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
表2-2DS1302的时钟寄存器及其控制字。
寄存器名
命令字
取值范围
各位内容
写操作
读操作
7
6
5
4
3
2
1
0
秒寄存器
80H
81H
00-59
CH
10SEC
SEC
分寄存器
82H
83H
00-59
0
10MIN
MIN
时寄存器
84H
85H
00-23
24
0
10
HR
HR
2.2AT89C52简介
图2-2AT89S52引脚图
功能特性概括:
AT89S52提供以下标准功能:
40个引脚、4KBytesFlash片内程序存储器、128Bytes的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2层中断嵌套中断、2个数据指针、2个16位可编程定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及时钟电路。
三、方案设计和论证
使用串行接口时钟芯片DS1302设计时钟电路。
该设计方案以单片机AT89C52为主控芯片,以串行时钟芯片DS1302为核心计时芯片,组成数字时钟电路。
该电路不但能准确地计时、附加其它功能,而且,其三线接口可以节省接口资源,在断电后不丢失时间和数据信息。
设计方案接口简单,计时可靠,综合性能良好。
图3-1时钟芯片DS1302设计时钟
四、软硬件设计
4.1硬件电路设计
LED数码管采用动态扫描方式显示,P0口为段码输出口,P2口为扫描驱动口,计时按键设计了2个,分别接在P3.5,P3.6口,用于设定与加一调整。
DS1302时钟芯片的晶挣频率为32.78KHz。
秒表/时钟计时器的硬件电路如图,仿真
图4-1总图
图4-2数码管控制
图4-3单片机控制芯片
图4-451单片机复位电路和晶振
图4-5DS1302及外围电路
图4-6按键控制
图4-7显示时分秒
图4-8显示年月日
图4-9显示周秒
4.2软件实现
4.2.1C语言的主程序
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
unsignedcharnum,displaynum;
Init_Timer0();
Ds1302_Init();
Ds1302_Write_Time();
while
(1)//主循环
{
num=KeyScan();
switch(num)
{
case1:
time_buf1[4]++;if(time_buf1[4]==24)time_buf1[4]=0;
Ds1302_Write_Time();break;//正常时间小时加1
case2:
time_buf1[5]++;if(time_buf1[5]==60)time_buf1[5]=0;
Ds1302_Write_Time();break;//分加1
case3:
time_buf1[5]--;if(time_buf1[5]==255)time_buf1[5]=59;
Ds1302_Write_Time();break;//分减1
case4:
time_buf1[6]=0;Ds1302_Write_Time();break;//秒置零
case5:
time_buf1[2]++;if(time_buf1[2]==13)time_buf1[2]=1;
Ds1302_Write_Time();break;//月加1
case6:
time_buf1[3]++;if(time_buf1[3]==32)time_buf1[3]=1;
Ds1302_Write_Time();break;//日加1
case7:
time_buf1[7]++;if(time_buf1[7]==8)time_buf1[7]=1;
Ds1302_Write_Time();break;//周加1
case8:
displaynum++;if(displaynum==3)displaynum=0;break;//翻页
default:
break;
}
if(ReadTimeFlag==1)
{
ReadTimeFlag=0;
Ds1302_Read_Time();
if(displaynum==0)//显示时间
{
TempData[0]=DuanMa[time_buf1[4]/10];//时//数据的转换,
TempData[1]=DuanMa[time_buf1[4]%10];//因我们采用数码管0~9的显示,将数据分开
TempData[2]=0x40;//加入"-"
TempData[3]=DuanMa[time_buf1[5]/10];//分
TempData[4]=DuanMa[time_buf1[5]%10];
TempData[5]=0x40;
TempData[6]=DuanMa[time_buf1[6]/10];//秒
TempData[7]=DuanMa[time_buf1[6]%10];
}
elseif(displaynum==1)//显示日期
{
TempData[0]=DuanMa[time_buf1[1]/10];//年
TempData[1]=DuanMa[time_buf1[1]%10];
TempData[2]=0x40;//加入"-"
TempData[3]=DuanMa[time_buf1[2]/10];//月
TempData[4]=DuanMa[time_buf1[2]%10];
TempData[5]=0x40;
TempData[6]=DuanMa[time_buf1[3]/10];//日
TempData[7]=DuanMa[time_buf1[3]%10];
}
elseif(displaynum==2)//显示周秒
{
TempData[0]=0x40;
TempData[1]=DuanMa[time_buf1[7]%10];//周
TempData[2]=0x40;//加入"-"
TempData[3]=0;
TempData[4]=0;
TempData[5]=0;
TempData[6]=DuanMa[time_buf1[6]/10];//秒
TempData[7]=DuanMa[time_buf1[6]%10];
}
}
}
}
4.2.2时钟读出程序设计
图5时钟读出程序流程
4.2.3时钟调整程序设计
图6时钟调整程序流程
五、系统调试
当一切准备就绪,开始调试。
先进行硬件调试,检查各个借口是否完美的接好。
然后进行软件与硬件结合调试,因为整个系统含有很多个子程序,所以调试时把各个子程序分别调试,成功后进行整体调试。
在硬件调试过程中发现了一些失误。
比如:
硬件出现焊接不牢靠,虚焊现象。
六、总结
通过这一周的学习,我感觉有很大的收获:
首先,通过这次课程设计使自己对课本上的知识可以应用于实际,使理论与实际相结合,加深自己对课本知识的更好理解,同时也段练了自己的动手能力:
能够充分利用电脑去查阅资料,增加了许多课本以外的知识。
更加了解了单片机原理及应用。
增加了对DS1302和AT89C52芯片引脚结构和功能的理解及运用,在设计电路过程中,要考虑到整体的美观性,连接电路时对各线路的连接要细致。
在验证面电路效果时,出现了很多问题,其主要问题各个接线点之间错接没接上等。
在这个过程中,锻炼了我的细心和耐性。
参考文献
1.孙涵芳.MCS-51/96系列单片机原理及应用(修订版).北京航空航天大学出版社.1994
2.李朝青.单片机原理及接口技术(第3版).北京航空航天大学出版社.2005
3.楼然苗、李光飞,单片机课程设计指导[M],北京,北京航空航天大学出版社,2007.07.
4.蔡美琴等,MCS-51系列单片机系统及其应用(第二版)[M],高等教学出版社,2004.06.
5.楼然苗、胡佳文等,单片机实验与课程设计(PROTEUS仿真版)[M],杭州,浙江大学出版社,2010.10
附录:
A:
DS1302读写数据程序
#include"ds1302.h"
unsignedchartime_buf1[8]={20,15,6,25,10,30,00,4};//空年月日时分秒周
unsignedchartime_buf[8];//空年月日时分秒周
/*------------------------------------------------
向DS1302写入一字节数据
------------------------------------------------*/
voidDs1302_Write_Byte(unsignedcharaddr,unsignedchard)
{
unsignedchari;
RST_SET;
//写入目标地址:
addr
addr=addr&0xFE;//最低位置零
for(i=0;i<8;i++)
{
if(addr&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr=addr>>1;
}
//写入数据:
d
for(i=0;i<8;i++)
{
if(d&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
d=d>>1;
}
RST_CLR;//停止DS1302总线
}
/*------------------------------------------------
从DS1302读出一字节数据
------------------------------------------------*/
unsignedcharDs1302_Read_Byte(unsignedcharaddr)
{
unsignedchari;
unsignedchartemp;
RST_SET;
//写入目标地址:
addr
addr=addr|0x01;//最低位置高
for(i=0;i<8;i++)
{
if(addr&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr=addr>>1;
}
//输出数据:
temp
for(i=0;i<8;i++)
{
temp=temp>>1;
if(IO_R)
{
temp|=0x80;
}
else
{
temp&=0x7F;
}
SCK_SET;
SCK_CLR;
}
RST_CLR;//停止DS1302总线
returntemp;
}
/*------------------------------------------------
向DS1302写入时钟数据
------------------------------------------------*/
voidDs1302_Write_Time(void)
{
unsignedchari,tmp;
for(i=0;i<8;i++)
{//BCD处理
tmp=time_buf1[i]/10;
time_buf[i]=time_buf1[i]%10;
time_buf[i]=time_buf[i]+tmp*16;
}
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_day_add,time_buf[7]);//周
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);//打开写保护
}
/*------------------------------------------------
从DS1302读出时钟数据
------------------------------------------------*/
voidDs1302_Read_Time(void)
{
unsignedchari,tmp;
time_buf[1]=Ds1302_Read_Byte(ds1302_year_add);//年
time_buf[2]=Ds1302_Read_Byte(ds1302_month_add);//月
time_buf[3]=Ds1302_Read_Byte(ds1302_date_add);//日
time_buf[4]=Ds1302_Read_Byte(ds1302_hr_add);//时
time_buf[5]=Ds1302_Read_Byte(ds1302_min_add);//分
time_buf[6]=(Ds1302_Read_Byte(ds1302_sec_add))&0x7F;//秒
time_buf[7]=Ds1302_Read_Byte(ds1302_day_add);//周
for(i=0;i<8;i++)
{//BCD处理
tmp=time_buf[i]/16;
time_buf1[i]=time_buf[i]%16;
time_buf1[i]=time_buf1[i]+tmp*10;
}
}
/*------------------------------------------------
DS1302初始化
------------------------------------------------*/
voidDs1302_Init(void)
{
RST_CLR;//RST脚置低
SCK_CLR;//SCK脚置低
Ds1302_Write_Byte(ds1302_sec_add,0x00);
}
附录B:
主程序以及程序宏定义
/*-----------------------------------------------
名称:
DS1302时钟数码管显示
内容:
DS1302实时时钟数码管显示,时间和日期切换显示按下按键,循环切换
时间格式xx-xx-xx
日期格式xx-xx-xx
周秒格式-x-xx
------------------------------------------------*/
#include
#include"ds1302.h"
#defineKeyPortP3//定义按键端口
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
sbitLATCH1=P2^7;//定义锁存使能端口段锁存
sbitLATCH2=P2^6;//位锁存
bitReadTimeFlag;//定义读时间标志
unsignedcharcodeDuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9
unsignedcharcodeWeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8];//存储显示值的全局变量
voidDelayUs2x(unsignedchart);//us级延时函数声明
voidDelayMs(unsignedchart);//ms级延时
voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数
unsignedcharKeyScan(void);//键盘
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 报告