单片机多功能数字钟课设报告

  • 格式:doc
  • 大小:1.27 MB
  • 文档页数:28

单片机课程设计 一、 题目及要求 设计一个多功能数字钟,使其具有以下功能: 1、由晶振电路产生标准秒信号。 2、能够显示时、分、秒:完成显示由秒00一直加1至59,再恢复为00;分加1,由00至01,一直加1至59,再恢复00;时加1,由00至01,一直加1到23,再恢复00。 3、要有手动快速校时、校分、秒。 4、自定义电路,设计、调试,并完成实验报告。 二、 总体思路 数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路。对于一般的数字钟多会有报时功能。针对以上叙述,可整体构想:标准频率可由振荡电路产生,更精确时,可由石英晶体产生。计数,可由2个60进制计数器,分别作为秒、分计数单元,一个24进制,作为时计数单元。计数单元同样可采用中断定时方式,这就需要由软件来实现。对于校时部分,一般都是手动进行,通过按键来控制时、分、秒的快速校准。报时电路,可每小时短报时,也可设定每天的几点准时闹铃。至于,显示时间的部分可由数码管也可由液晶显示来完成。 针对以上设计思路,可有多种设计方案。对于具体的,参考方案论证。 三、 方案论证 方案一:纯电路设计 此方案电路总方框图如下: 方案二:采用AT89S52单片机设计 主要以52芯片为核心,可内部或外部产生信号,采用中断的方式定时。系统由AT89S52单片机、DS1302、LCD1602、按键等部分构成,能实现比较精确的走时、时间的调整等功能。秒信号是由单片机内部的定时器产生,通过软件计数和软件的译码,以动态扫描的方式将时间显示在LCD上面。通过按键的检测可以控制单片机相应的动作,来达到调时的目的。 四、 具体实现 电路如下:

(一)、硬件设计 1、电源电路: 电源是单片机系统的重要组成部分,它不仅为系统提供多路电压源,还直接影响到系统的技术指标和抗干扰性能。AT89S52单片机和一般的数字芯片一样,都是5V电压供电,所以可以共用一个5V电源。另外,为了提高电源的稳定性,在离电源的最近处做好退耦处理,可用一个电容,以滤去干扰,保证电源的稳定。 2、 LCD1602显示电路: 4、AT89S52单片机:其引脚如下: 电源引脚:40(VCC)接+5V电源,20(GND)接地。 晶振采用内部方式。晶体振荡器与AT89S52的接法为如图所示,XTAL1和XTAL2脚接到12MHz的晶体振荡器上,与两个30pf的电容并联,并接低电平。

19(XTAL1), 18(XTAL2) XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。AT89单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为30μF。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。

输入输出口的连接 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。本次设计使用P0口的P0.0~P0.2来分别控制调时中的时、分、秒。电路如下

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 本次设计P1口分别接段选74HC573的2~9引脚,锁存控制数码管的点亮。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。本次设计使用P2口的P2.0~P2.5分别接位选74HC573的2~7脚,控制数码管轮流点亮。此外,我们同样用P2.7口控制蜂鸣器的报时。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。本次使用了P3的P3.1~P3.2分别控制段选和位选。 (二)、软件实现 利用C语言编程如下(部分说明已注释): /*P1口接段选,P2口接位选(P2.0到P2.5),段选letch接P3.1,位选letch接P3.2*/ #include #include"DS18B20_3.H" #define uint unsigned int #define uchar unsigned char uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp; //flag用于读取头文件中的温度值,和显示温度值

#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80) #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口) sbit rs=P1^0; sbit en=P1^2; sbit rw=P1^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了

//DS1302时钟芯片与C51之间的引脚连接定义 sbit IO=P1^4; sbit SCLK=P1^5; sbit RST=P1^3; sbit ACC0=ACC^0; sbit ACC7=ACC^7;

//校时按键与C51的引脚连接定义 sbit key1=P2^0; //设置键 sbit key2=P2^1; //加键 sbit key3=P2^2; //减键

sbit buzzer=P3^4;//蜂鸣器,通过三极管9012驱动,端口低电平响 uchar code tab1[]={"20 - - "}; //年显示的固定字符 uchar code tab2[]={" : : "};//时间显示的固定字符 uchar code tab3[]={"liujuan & wzn "};//时间显示的固定字符 uchar code tab4[]={"Num :15 & 26 "};//时间显示的固定字符

//延时函数,后面经常调用 void delay(uint xms)//延时函数,有参函数 { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); }

/********液晶写入指令函数与写入数据函数,以后可调用**************/ /*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/ write_1602com(uchar com)//****液晶写入指令函数**** { rs=0;//数据/指令选择置为指令 rw=0; //读写选择置为写 P0=com;//送入数据 delay(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令 }

write_1602dat(uchar dat)//***液晶写入数据函数**** { rs=1;//数据/指令选择置为数据 rw=0; //读写选择置为写 P0=dat;//送入数据 delay(1); en=1; //en置高电平,为制造下降沿做准备 delay(1); en=0; //en由高变低,产生下降沿,液晶执行命令 }

lcd_init()//***液晶初始化函数**** { write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标