万年历的设计与制作基于单片机.docx

上传人:b****8 文档编号:10716062 上传时间:2023-02-22 格式:DOCX 页数:35 大小:1.22MB
下载 相关 举报
万年历的设计与制作基于单片机.docx_第1页
第1页 / 共35页
万年历的设计与制作基于单片机.docx_第2页
第2页 / 共35页
万年历的设计与制作基于单片机.docx_第3页
第3页 / 共35页
万年历的设计与制作基于单片机.docx_第4页
第4页 / 共35页
万年历的设计与制作基于单片机.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

万年历的设计与制作基于单片机.docx

《万年历的设计与制作基于单片机.docx》由会员分享,可在线阅读,更多相关《万年历的设计与制作基于单片机.docx(35页珍藏版)》请在冰豆网上搜索。

万年历的设计与制作基于单片机.docx

万年历的设计与制作基于单片机

 

湖北理工学院

 

电气与电子信息工程学院

智能电子产品设计与制作

 

设计题目:

万年历的设计与制作

  专业班级:

学  号:

   

姓名:

指导教师:

李玉平王海华

设计时间:

2012/5/28~2012/6/10

设计地点:

K2—407

 

智能电子产品设计与制作课程设计成绩评定表

姓名

学号

专业班级

课程设计题目:

课程设计答辩或质疑记录:

1、

 

2、

 

成绩评定依据:

实物制作(40%):

课程设计考勤情况(20%):

课程设计答辩情况(20%):

完成设计任务及报告规范性(20%):

 

最终评定成绩(以优、良、中、及格、不及格评定)

 

指导教师签字:

2012年6月10日

第一部分课程设计任务书

2011~2012学年第2学期

学生姓名:

专业班级:

10应电专1

指导教师:

李玉平、王海华工作部门:

电信教研室

一、课题名称

《单片机应用系统设计与制作》

二、设计目的

为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的智能电子产品设计与制作课程设计。

通过实训使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。

三、设计内容

设计基于51单片机的万年历,音乐盒和交通灯系统,在万年历中,用温度传感器采集温度,用DS1302实现时钟功能,并以该电路为基础进行编程,用LED或LCD显示当前温度和时钟。

在交通灯系统中,按交通灯的规则为基础,以51单片机为核心,设计与制作一智能交通灯。

在音乐盒中,以51单片机为核心,通过软件实现三首歌曲的播放。

四、设计要求

1、设计基于51单片机的万年历,音乐盒和交通灯系统,在这三个要求中任选一题。

2、在万年历中,用温度传感器采集温度,用DS1302实现时钟功能,并以该电路为基础进行编程,用LED或LCD显示当前温度和时钟。

3、在交通灯系统中,按交通灯的规则为基础,以51单片机为核心,设计与制作一智能交通灯。

4、在音乐盒中,以51单片机为核心,通过软件实现三首歌曲的播放。

6、编写课程设计的总结。

五、设计进度表

序号

设计内容

所用时间

1

布置任务,学习传感器和LED或LCD的工作原理以及硬件电路设计

3天

2

完成系统程序设计

3天

3

制作电路板

1天

4

答辩、撰写设计报告书

3天

合计

10天

六、设计报告

课程设计报告的基本内容至少包括封面、正文、附录三部分。

课程设计报告要求统一格式,字体工整规范。

1、封面

封面包括“《单片机应用系统设计与制作》课程设计报告”、班级、姓名、学号以及完成日期等。

2、正文

正文是实践设计报告的主体,具体由以下几部分组成:

(1)课程设计题目;

(2)课程设计任务与要求;

(3)设计过程(包括设计方案、设计原理、创新点以及采用的新技术等);

(4)方案的比较与论证;

(5)硬件电路设计,各个模块的设计与器件的选择;

(6)软件程序的设计与调试;

(7)课程设计总结(包括自己的收获与体会;遇到的问题和解决的方法;技术实现技巧和创新点;作品存在的问题和改进设想等);

3.附录

附录1:

系统设计原理图

附录2:

系统硬件元器件清单

附录3:

系统的程序

七、参考书目

[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:

北京航空航天大学出版社,1998

[2] 李广弟.单片机基础[M].北京:

北京航空航天大学出版社,1994

[3] 阎石.数字电子技术基础(第三版).北京:

高等教育出版社,1989

[4] 廖常初.现场总线概述[J].电工技术,1999[5]徐仁贵等编著.《单片微型计算机应用技术》.北京:

机械工业出版社.2001年2月第1版

[6]张毅刚等编著.《单片机原理及应用》.北京:

高等教育出版社.2004年1月第1版

 

第二部分课程设计

一、整体功能要求

1、设计任务

利用单片机、时钟芯片DS1302、温度传感器DS18B20、1602液晶等实现日期、时间、温度的显示即一个简单的万年历。

2、设计要求

(1)通过DS1302能够准确的计时,时间可调并在液晶上显示出来。

(2)通过DS18B20能够实时、准确的检测当前环境温度。

(3)利用AT89C52单片机自身功能实现闹钟及温度报警的功能。

二、整体方案设计

本系统以AT89S52单片机为控制核心,通过与DS1302和DS18B20通信获取实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。

因此本设计可分为一下模块:

单片机主控制模块、显示模块、实时时间计算模块、实时环境温度采集模块、报警模块、设置模块(时间设置模块、最高温度设置模块、闹钟设置模块)。

DS1302时钟电路

储存器

复位电路

晶振电路

系统电源

供电设计

AT89C51单片机

LM016L液晶显示模块

图1万年历系统设计框图

图2电路原理图

3、硬件设计

1、单片机主控制模块的设计

图3AT89C52引脚图

AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。

AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。

其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

2、LCD显示模块设计

1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。

每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用。

1602的驱动电路带有11条指令,可以很方便的控制液晶的现实效果如:

清屏、左移右移、光标显示。

而且1602显示的字符在下一条指令为到来之前不会改变,也就是能够维持显示的字符,1602液晶占用的系统资源也少。

3、时间计算模块设计

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

工作电压宽达2.5~5.5V。

采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。

图4DS1302引脚介绍

各引脚的功能为:

8、Vcc1:

备用电池端;

1、Vcc2:

5V电源。

当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2

7、SCLK:

串行时钟,输入;

6、I/O:

数据输入输出口;

5、CE/RST:

复位脚

23、X1、X2是外接晶振脚(32.768KHZ的晶振)

4、地(GND)

4、实时环境温度检测模块

DS18B20是美国DALLAS公司生产的数字温度传感器,采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

测量温度范围宽,测量精度高,在使用中不需要任何外围元件,支持多点组网功能多个DS18B20可以并联在惟一的单线上,实现多点测温,供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。

因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。

因此非常适合本系统使用。

DS18B20单线数字温度传感器,测量温度范围宽,测量精度高。

其测量范围为-55℃至+125℃;在-10至+85°C范围内,精度为±0.5°C。

DS18B20还具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。

图5DS18B20管脚介绍

DS18B20的管脚排列

1.GND为电源地;

2.DQ为数字信号输入/输出端;

3.VDD为外接供电电源输入端,在寄生电源接线方式时接地。

5、报警模块

报警模块采用单片机输出一定频率的方波从而使蜂鸣器发出声音,只要编写相应的程序即可实现发出不同频率的声音。

6、设置模块

因设置模块只需编写相应的程序外加相应的按键即可实现。

四、软件设计

软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。

因本程序涉及的模块较多,所以程序编写也采用模块化设计,C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用C52编写。

1、程序流程图

图6主程序流程框图

2、主程序

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitRS=P2^0;//数据/命令选择端

sbitRW=P2^1;//读/写选择端

sbitE=P2^2;//1602使能

sbitIO=P1^0;//DS1302数据口

sbitSCLK=P1^1;//DS1302串行时钟

sbitRST=P1^2;//DS1302时钟复位脚

sbitDQ=P1^3;//DS18B20温度

sbitK1=P3^3;//功能

sbitK2=P3^4;//增加

sbitK3=P3^5;//减少

sbitK4=P3^6;//确定

sbitK5=P3^7;//取消

sbitled=P2^4;//温度报警

sbitbuzz=P2^3;//蜂鸣器报警

uchardataLCD_DSY_BUFFER1[]={"20--"};

uchardataLCD_DSY_BUFFER2[]={":

:

"};

uchardataTemp_BUFFER[8];

char*week[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};

uchardays[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

uchardataDateTime[7];//秒、分、时、日、月、周、年

ucharAdjust_Index=-1;//时钟调节标志

uinttvalue;//温度值

uchartflag;//温度正负标志

//微妙延时程序(约为10us(小于))

voiddelayus(uintus)

{

while(us--);

}//毫秒延时程序

voiddelayms(uintms)

{

uinti,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}//写LCD命令寄存器

voidWrite_LCD_Command(ucharcmd)

{

RS=0;

RW=0;

P0=cmd;

E=1;

delayms(5);

E=0;

}//写LCD数据寄存器

voidWrite_LCD_Data(uchardat)

{

RS=1;

RW=0;

P0=dat;

E=1;

delayms(5);

E=0;

}//显示字符串

voidLCD_ShowString(ucharx,uchary,uchar*str)

{

uchari=0;

if(y==0)

Write_LCD_Command(0x80|x);

elseif(y==1)

Write_LCD_Command(0xc0|x);

for(i=0;i<16&&str[i]!

='\0';i++)

Write_LCD_Data(str[i]);

}//刷新LCD显示缓冲区

voidRefresh_LCD_BUFFER()

{

LCD_DSY_BUFFER1[2]=DateTime[6]/10+0x30;

LCD_DSY_BUFFER1[3]=DateTime[6]%10+0x30;

LCD_DSY_BUFFER1[5]=DateTime[4]/10+0x30;

LCD_DSY_BUFFER1[6]=DateTime[4]%10+0x30;

LCD_DSY_BUFFER1[8]=DateTime[3]/10+0x30;

LCD_DSY_BUFFER1[9]=DateTime[3]%10+0x30;

LCD_DSY_BUFFER2[0]=DateTime[2]/10+0x30;

LCD_DSY_BUFFER2[1]=DateTime[2]%10+0x30;

LCD_DSY_BUFFER2[3]=DateTime[1]/10+0x30;

LCD_DSY_BUFFER2[4]=DateTime[1]%10+0x30;

LCD_DSY_BUFFER2[6]=DateTime[0]/10+0x30;

LCD_DSY_BUFFER2[7]=DateTime[0]%10+0x30;

}//LCD初始化

voidInitialize_LCD()

{

E=0;

Write_LCD_Command(0x38);

Write_LCD_Command(0x0c);

Write_LCD_Command(0x06);

Write_LCD_Command(0x01);

}//向DS1302中写入一字节(上升沿写入)

voidWrite_Byte_TO_DS1302(ucharx)

{

uchari;

for(i=0;i<8;i++)//循环8次写入数据

{

IO=x&0x01;//每次传输低字节

SCLK=0;

delayus

(2);

SCLK=1;

x>>=1;//右移一位

}}

//从DS1302中读取一字节(下降沿读取)

ucharGet_Byte_FROM_DS1302()

{

uchari,dat=0x00;

for(i=0;i<8;i++)

{

if(IO)

dat|=0x80;

SCLK=1;

delayus

(2);

SCLK=0;

dat>>=1;

}

returndat/16*10+dat%16;//将读出的BCD码值转化为十进制

}//从DS1302的指定地址读取一字节数据

ucharRead_Data(ucharaddr)

{

uchardat;

RST=0;

SCLK=0;

RST=1;

Write_Byte_TO_DS1302(addr);//先写地址在读取

dat=Get_Byte_FROM_DS1302();

RST=0;

SCLK=1;

returndat;

}//向指定的地址写入一字节数据

voidWrite_DS1302(ucharadd,ucharnum)

{

RST=0;

SCLK=0;

RST=1;

Write_Byte_TO_DS1302(add);//先写地址再写数据

Write_Byte_TO_DS1302(num);

RST=0;

SCLK=1;

}//读取当前日期时间

voidGetDateTime()

{

uchari,addr=0x81;//读取秒地址开始(地址最高位10表示要读/写clock数据,

//最低位表示是读

(1)还是写(0)

for(i=0;i<7;i++)

{

DateTime[i]=Read_Data(addr);

addr+=2;

}}//禁止涓流充电

voiddenot()

{

Write_DS1302(0x8e,0x00);//写控制字节,取消写保护

Write_DS1302(0x90,0x8b);//禁止涓流充电

Write_DS1302(0x8e,0x80);//加保护

}//写改动后的数据到DS1302中

voidSetDateTime()

{

uchari;

Write_DS1302(0x8e,0x00);//写控制字节,取消写保护

for(i=0;i<7;i++)

{

Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));

}

Write_DS1302(0x8e,0x80);//加保护

}//判断是否为闰年

ucharIsLeapYear(uinty)

{

if((y%4==0&&y%100!

=0)||(y%400==0))return1;

elsereturn0;

}//根据设定的日期自动刷新星期

voidRefreshWeekday()

{

uinti,d,w=5;//已知1999.12.31是周五

for(i=2000;i<2000+DateTime[6];i++)

{

d=IsLeapYear(i)?

366:

365;

w=(w+d)%7;}

for(d=0,i=1;i

d+=days[i];

d+=DateTime[3];

DateTime[5]=(w+d)%7+1;

}//根据按键情况调整时间

voidDateTime_Adjust(charx)

{

switch(Adjust_Index)

{

case6:

//年00--99

if(x==1)

{

DateTime[6]++;

if(DateTime[6]==100)

DateTime[6]=0;

}

else

{

DateTime[6]--;

if(DateTime[6]==0xff)

DateTime[6]=99;

}

days[2]=IsLeapYear(2000+DateTime[6])?

29:

28;

if(DateTime[3]>days[DateTime[4]])

DateTime[3]=days[DateTime[4]];

RefreshWeekday();

break;

case4:

//月01--12

if(x==1)

{

DateTime[4]++;

if(DateTime[4]==13)

DateTime[4]=1;

}

else

{

DateTime[4]--;

if(DateTime[4]==0)

DateTime[4]=12;

}

days[2]=IsLeapYear(2000+DateTime[6])?

29:

28;

if(DateTime[3]>days[DateTime[4]])

DateTime[3]=days[DateTime[4]];

RefreshWeekday();

break;

case3:

//日

days[2]=IsLeapYear(2000+DateTime[6])?

29:

28;

if(x==1)

{

DateTime[3]++;

if(DateTime[3]>days[DateTime[4]])

DateTime[3]=1;

}

else

{

DateTime[3]--;

if(DateTime[3]==0)

DateTime[3]=days[DateTime[4]];

}

if(DateTime[3]>days[DateTime[4]])

DateTime[3]=days[DateTime[4]];

RefreshWeekday();

break;

case2:

//时

if(x==1)

{

DateTime[2]++;

if(DateTime[2]==24)

DateTime[2]=0;

}

else

{

DateTime[2]--;

if(DateTime[2]==0xff)

DateTime[2]=23;

}

break;

case1:

//分

if(x==1)

{

DateTime[1]++;

if(DateTime[1]==60)

DateTime[1]=0;

}

else

{

DateTime[1]--;

if(DateTime[1]==0xff)

DateTime[1]=59;

}

break;

case0:

//秒

if(x==1)

{

DateTime[0]++;

if(DateTime[0]==60)

DateTime[0]=0;

}

else

{

DateTime[0]--;

if(DateTime[0]==0xff)

DateTime[0]=59;

}

break;

}}//复位,初始化DS18B20

voiddsreset()

{

do{

DQ=1;//DQ复位

delayus(4);//延时

DQ=0;//DQ拉低

delayus(75);//精确延时480us~~960us

DQ=1;//拉高

delayus(5);

}

while(DQ==1);

delayus(50);//最少480us

}//读一个字节函数

uchartmpread(void)

{

uchari=0;

uchardat=0;

for(i=8;i>0;i--)

{DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delayus(4);//延时>30us

}

return(dat);

}//写一个字节函数

voidtmpwritebyte(uchardat)

{

uinti;

ucharj;

bittestb;

for(j

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1