万年历的设计与制作(基于单片机) - 图文

更新时间:2023-03-13 09:02:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

湖 北 理 工 学 院

电气与电子信息工程学院

智能电子产品设计与制作

设计题目: 万年历的设计与制作 专业班级: 学 号: 姓 名: 指导教师: 李玉平 王海华

设计时间: 2012/5/28~2012/6/10 设计地点: K2—407

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

姓 名 专业班级 课程设计题目: 课程设计答辩或质疑记录: 1、 2、 成绩评定依据: 实物制作(40%): 课程设计考勤情况(20%): 课程设计答辩情况(20%): 完成设计任务及报告规范性(20%): 最终评定成绩(以优、良、中、及格、不及格评定) 指导教师签字:

2012年 6 月 10 日

学 号

电气与电子信息工程学院 课程设计报告

目 录

第一部分 课程设计任务书 ........................................... 1

一、课题名称 .................................................... 1 二、设计目的 .................................................... 1 三、设计内容 .................................................... 1 四、设计要求 .................................................... 1 五、设计进度表 .................................................. 1 六、设计报告 .................................................... 2 七、参考书目 .................................................... 2 第二部分 课程设计 ................................................. 3

一、整体功能要求 ................................................ 3

1、设计任务.................................................. 3 2、设计要求.................................................. 3 二、整体方案设计 ................................................ 3 三、 硬件设计 ................................................... 4 1、单片机主控制模块的设计................................... 4 2、LCD显示模块设计 ......................................... 5 3、时间计算模块设计......................................... 5 4、实时环境温度检测模块..................................... 6 5、报警模块................................................. 7 6、设置模块................................................. 7

四、软件设计 .................................................... 7

1、程序流程图................................................ 7 2、主程序.................................................... 8 五、调试 ....................................................... 19

1、建立工程和仿真图......................................... 19 2、keil软件调试结果 ........................................ 20 3、proteus软件仿真结果 ..................................... 20 六、实物的组装与调试 ........................................... 21

1.实物的组装................................................ 21 2、实物焊接................................................. 21 3、调试..................................................... 21 七、心得体会 ................................................... 23 附录 元件清单 ................................................. 24 参考文献 ....................................................... 24

I

电气与电子信息工程学院 课程设计报告

第一部分 课程设计任务书

2011 ~ 2012 学年第 2 学期

学生姓名: 专业班级: 10应电专1 指导教师: 李玉平、王海华 工作部门: 电信教研室

一、课题名称

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

二、设计目的

为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的智能电子产品设计与制作课程设计。通过实训使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。

三、设计内容

设计基于51单片机的万年历,音乐盒和交通灯系统,在万年历中,用温度传感器采集温度,用DS1302实现时钟功能,并以该电路为基础进行编程,用LED或LCD显示当前温度和时钟。在交通灯系统中,按交通灯的规则为基础,以51单片机为核心,设计与制作一智能交通灯。在音乐盒中,以51单片机为核心,通过软件实现三首歌曲的播放。

四、设计要求

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

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

4、在音乐盒中,以51单片机为核心,通过软件实现三首歌曲的播放。 6、编写课程设计的总结。

五、设计进度表

序号 1 2 3 4 设计内容 布置任务,学习传感器和LED或LCD的工作原理以及硬件电路设计 完成系统程序设计 制作电路板 答辩、撰写设计报告书 合 计 所用时间 3天 3天 1天 3天 10天 1

电气与电子信息工程学院 课程设计报告

六、设计报告

课程设计报告的基本内容至少包括封面、正文、附录三部分。课程设计报告要求统一格式,字体工整规范。

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版

2

电气与电子信息工程学院 课程设计报告

第二部分 课程设计

一、整体功能要求

1、设计任务

利用单片机、时钟芯片DS1302、温度传感器DS18B20、1602液晶等实现日

期、时间、温度的显示即一个简单的万年历。

2、设计要求

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

(2)通过DS18B20能够实时、准确的检测当前环境温度。 (3)利用AT89C52单片机自身功能实现闹钟及温度报警的功能。

二、整体方案设计

本系统以AT89S52单片机为控制核心,通过与DS1302和DS18B20通信获取

实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。因此本设计可分为一下模块:单片机主控制模块、显示模块、实时时间计算模块、实时环境温度采集模块、报警模块、设置模块(时间设置模块、最高温度设置模块、闹钟设置模块)。

DS1302时钟电路 AT89C51 LM016L 液晶

储存器

复位电路 显示模块 单片机 系统电源 供电设计

晶振电路

图1 万年历系统设计框图

3

电气与电子信息工程学院 课程设计报告

图2 电路原理图

三、硬件设计

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

图3 AT89C52引脚图

AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复

擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,

4

电气与电子信息工程学院 课程设计报告

片内置通用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。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。

图4 DS1302引脚介绍

5

电气与电子信息工程学院 课程设计报告

各引脚的功能为:

8 、Vcc1:备用电池端;

1、Vcc2:5V电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。 7、 SCLK:串行时钟,输入; 6、I/O:数据输入输出口; 5、CE/RST:复位脚

2 3、X1、X2 是外接晶振脚 (32.768KHZ的晶振) 4、地(GND)

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

DS18B20是美国DALLAS公司生产的数字温度传感器,采用单总线的接口方式

与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。测量温度范围宽,测量精度高 ,在使用中不需要任何外围元件,支持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温,供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。因此非常适合本系统使用。

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

围为 -55 ℃ 至+ 125 ℃ ; 在 -10至+ 85°C 范围内,精度为 ± 0.5°C 。DS18B20 还具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。

图5 DS18B20管脚介绍

6

电气与电子信息工程学院 课程设计报告

DS18B20的管脚排列 1 . GND为电源 地;

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

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

5、报警模块

报警模块采用单片机输出一定频率的方波从而使蜂鸣器发出声音,只要编写

相应的程序即可实现发出不同频率的声音。

6、设置模块

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

四、软件设计

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

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

1、程序流程图

图6 主程序流程框图

7

电气与电子信息工程学院 课程设计报告

、主程序

#include #include

#define uchar unsigned char #define uint unsigned int

sbit RS=P2^0; //数据/命令选择端 sbit RW=P2^1; //读/写选择端 sbit E=P2^2; //1602使能 sbit IO=P1^0; //DS1302数据口 sbit SCLK=P1^1;//DS1302串行时钟 sbit RST=P1^2; //DS1302时钟复位脚 sbit DQ=P1^3; //DS18B20温度 sbit K1=P3^3; //功能 sbit K2=P3^4; //增加 sbit K3=P3^5; //减少 sbit K4=P3^6; //确定 sbit K5=P3^7; //取消 sbit led=P2^4;//温度报警

sbit buzz=P2^3;// 蜂鸣器报警 uchar data LCD_DSY_BUFFER1[]={\ uchar data LCD_DSY_BUFFER2[]={\ uchar data Temp_BUFFER[8];

char *week[]={\ uchar days[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; uchar data DateTime[7];//秒、分、时、日、月、周、年 uchar Adjust_Index=-1;//时钟调节标志 uint tvalue;//温度值

uchar tflag;//温度正负标志

//微妙延时程序(约为10us(小于)) void delayus(uint us) {

while(us--); } //毫秒延时程序

void delayms(uint ms) {

uint i,j;

for(i=ms;i>0;i--) for(j=110;j>0;j--); } //写LCD命令寄存器

void Write_LCD_Command(uchar cmd) { RS=0; RW=0; P0=cmd;

8

2

电气与电子信息工程学院 课程设计报告

E=1;

delayms(5); E=0;

}//写LCD数据寄存器

void Write_LCD_Data(uchar dat) { RS=1; RW=0; P0=dat; E=1;

delayms(5); E=0;

}//显示字符串

void LCD_ShowString(uchar x,uchar y,uchar *str) {

uchar i=0; if(y==0)

Write_LCD_Command(0x80|x); else if(y==1)

Write_LCD_Command(0xc0|x);

for(i=0;i<16&&str[i]!='\\0';i++) Write_LCD_Data(str[i]); }//刷新LCD显示缓冲区 void Refresh_LCD_BUFFER() {

LCD_DSY_BUFFER1[2]=DateTime[6]/10+0x30; LCD_DSY_BUFFER1[3]=DateTime[6]+0x30; LCD_DSY_BUFFER1[5]=DateTime[4]/10+0x30; LCD_DSY_BUFFER1[6]=DateTime[4]+0x30; LCD_DSY_BUFFER1[8]=DateTime[3]/10+0x30; LCD_DSY_BUFFER1[9]=DateTime[3]+0x30; LCD_DSY_BUFFER2[0]=DateTime[2]/10+0x30; LCD_DSY_BUFFER2[1]=DateTime[2]+0x30; LCD_DSY_BUFFER2[3]=DateTime[1]/10+0x30; LCD_DSY_BUFFER2[4]=DateTime[1]+0x30; LCD_DSY_BUFFER2[6]=DateTime[0]/10+0x30; LCD_DSY_BUFFER2[7]=DateTime[0]+0x30; }//LCD初始化

void Initialize_LCD() { E=0;

Write_LCD_Command(0x38); Write_LCD_Command(0x0c); Write_LCD_Command(0x06);

9

电气与电子信息工程学院 课程设计报告

Write_LCD_Command(0x01);

} //向DS1302中写入一字节 (上升沿写入) void Write_Byte_TO_DS1302(uchar x) {

uchar i;

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

IO=x&0x01; //每次传输低字节 SCLK=0; delayus(2); SCLK=1;

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

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

uchar i,dat=0x00; for(i=0;i<8;i++) {

if(IO)

dat|=0x80; SCLK=1; delayus(2); SCLK=0; dat>>=1; }

return dat/16*10+dat; //将读出的BCD码值转化为十进制 }//从DS1302的指定地址读取一字节数据 uchar Read_Data(uchar addr) {

uchar dat; RST = 0; SCLK=0; RST=1;

Write_Byte_TO_DS1302(addr); //先写地址在读取 dat = Get_Byte_FROM_DS1302(); RST=0; SCLK=1; return dat;

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

void Write_DS1302(uchar add,uchar num) {

RST=0;

10

电气与电子信息工程学院 课程设计报告

SCLK=0; RST=1;

Write_Byte_TO_DS1302(add); //先写地址再写数据 Write_Byte_TO_DS1302(num); RST=0; SCLK=1;

}//读取当前日期时间 void GetDateTime() {

uchar i,addr=0x81; //读取秒地址开始(地址最高位10表示要读/写clock数据, //最低位表示是读(1)还是写(0) for(i=0;i<7;i++) {

DateTime[i]=Read_Data(addr); addr+=2;

} }//禁止涓流充电 void denot() {

Write_DS1302(0x8e,0x00); //写控制字节,取消写保护 Write_DS1302(0x90,0x8b);//禁止涓流充电 Write_DS1302(0x8e,0x80);//加保护 }//写改动后的数据到DS1302中 void SetDateTime() {

uchar i;

Write_DS1302(0x8e,0x00); //写控制字节,取消写保护 for(i=0;i<7;i++) {

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

Write_DS1302(0x8e,0x80);//加保护 }//判断是否为闰年

uchar IsLeapYear(uint y) {

if((y%4==0&&y0!=0)||(y@0==0))return 1; else return 0;

}//根据设定的日期自动刷新星期 void RefreshWeekday() {

uint i,d,w=5;//已知1999.12.31是周五 for(i=2000;i<2000+DateTime[6];i++) {

d=IsLeapYear(i)?366:365; w=(w+d)%7; }

11

电气与电子信息工程学院 课程设计报告

for(d=0,i=1;i

DateTime[5]=(w+d)%7+1; }//根据按键情况调整时间

void DateTime_Adjust(char x) {

switch( Adjust_Index) {

case 6://年 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;

case 4://月 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();

12

电气与电子信息工程学院 课程设计报告

break; case 3://日

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; case 2://时 if(x==1) {

DateTime[2]++; if(DateTime[2]==24)

DateTime[2]=0; } else {

DateTime[2]--;

if(DateTime[2]==0xff) DateTime[2]=23; }

break; case 1://分 if(x==1) {

DateTime[1]++; if(DateTime[1]==60)

DateTime[1]=0;

} else {

DateTime[1]--;

13

电气与电子信息工程学院 课程设计报告

if(DateTime[1]==0xff) DateTime[1]=59; }

break; case 0://秒 if(x==1) {

DateTime[0]++; if(DateTime[0]==60)

DateTime[0]=0;

} else {

DateTime[0]--;

if(DateTime[0]==0xff) DateTime[0]=59; }

break;

} } //复位,初始化DS18B20 void dsreset() { do{

DQ=1; //DQ复位 delayus(4); //延时

DQ=0; //DQ拉低

delayus(75); //精确延时480us~~960us DQ=1; //拉高 delayus(5); }

while(DQ==1);

delayus(50); //最少480us } //读一个字节函数 uchar tmpread(void) {

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

{ DQ = 0; //给脉冲信号 dat>>=1;

DQ = 1; //给脉冲信号 if(DQ) dat|=0x80;

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

14

电气与电子信息工程学院 课程设计报告

}

return(dat); } //写一个字节函数

void tmpwritebyte(uchar dat) {

uint i; uchar j; bit testb;

for(j=1;j<=8;j++) {

testb=dat&0x01; //低位在前 dat=dat>>1;

if(testb) //写 “1“ {

DQ=0;

i++;i++; DQ=1;

i=8;while(i>0)i--; }

else //写 ”0\ {

DQ=0;

i=8;while(i>0)i--; DQ=1; i++; i++;

} } } //开始获取温度并转换 void TempChang() {

dsreset();

delayms(1);

tmpwritebyte(0xcc);//*跳过读序列号*/ tmpwritebyte(0x44);//*启动温度转换*/ }// 获取温度并转换

Get_Temp() {

uchar a,b; dsreset(); delayms(1);

tmpwritebyte(0xcc);//*跳过读序列号*/ tmpwritebyte(0xbe);//*读取温度*/ a=tmpread(); b=tmpread(); tvalue=b;

15

电气与电子信息工程学院 课程设计报告

tvalue<<=8;

tvalue=tvalue|a; if(tvalue<=0x07ff) tflag=0; else {

tvalue=~tvalue+1; tflag=1; }

tvalue=tvalue*0.625+0.5;//温度值扩大10倍,精确到1位小数, return(tvalue); //小数点第二位四舍五入 }

//温度报警

void tempbaojing() {

uchar c;

if((tvalue>=0x040)&(tvalue<=0x00)) {

for(c=0;c<5;c++) {buzz=~buzz; delayms(10);} } }

//温度值显示模块

void DS18B20Disp()//温度值显示 {

Temp_BUFFER[1]=tvalue/1000+0x30;//百位数 Temp_BUFFER[2]=tvalue00/100+0x30;//十位数 Temp_BUFFER[3]=tvalue0/10+0x30;//个位数 Temp_BUFFER[4]=0x2e; //写小数点 Temp_BUFFER[5]=tvalue+0x30;//小数位 Temp_BUFFER[6]=0xdf; //写温度单位 Temp_BUFFER[7]=0x43; if(tflag==0)

Temp_BUFFER[0]=0x20;//正温度不显示符号 else

Temp_BUFFER[0]=0x2d;//负温度显示负号:- if(Temp_BUFFER[1]==0x30) {

Temp_BUFFER[1]=Temp_BUFFER[0];//如果百位为0,不显示 Temp_BUFFER[0]=0x20; if(Temp_BUFFER[2]==0x30) {

Temp_BUFFER[2]=Temp_BUFFER[1];//在百位为0的同时十位为0,不显示 Temp_BUFFER[1]=0x20;

16

电气与电子信息工程学院 课程设计报告

} } } //主函数 void main() {

uchar tcount=0; Initialize_LCD(); denot(); EA=1; EX0=1; IT0=1; while(1) {

TempChang(); Get_Temp(); tempbaojing(); DS18B20Disp();

LCD_ShowString(8,1,Temp_BUFFER); if( tvalue>=310) {

tcount++; //单片机没执行到此需要约0.2s; if(tcount==2) {

tcount=0; led^=1; } }

else led=1;

if(Adjust_Index==-1) GetDateTime();

Refresh_LCD_BUFFER();

LCD_ShowString(0,0,LCD_DSY_BUFFER1); LCD_ShowString(0,1,LCD_DSY_BUFFER2);

LCD_ShowString(11,0,week[DateTime[5]-1]); } }

//中断0服务程序

void int0()interrupt 0 {

if(K1==0) {

delayms(100); if(K1==0) {

while(!K1);

17

电气与电子信息工程学院 课程设计报告

if(Adjust_Index==-1||Adjust_Index==0) Adjust_Index=7; Adjust_Index--;

if(Adjust_Index==5) Adjust_Index=4;//跳过星期的调整,自行刷新 switch(Adjust_Index) {

case 6: Write_LCD_Command(0x8f); //写‘N’ Write_LCD_Data(0x4e); break;

case 4: Write_LCD_Command(0x8f); //写‘Y’ Write_LCD_Data(0x59); break;

case 3: Write_LCD_Command(0x8f); //写'R' Write_LCD_Data(0x52); break;

case 2: Write_LCD_Command(0x8f); //写‘S’ Write_LCD_Data(0x53); break;

case 1: Write_LCD_Command(0x8f);

Write_LCD_Data(0x46); //写'F' break;

case 0: Write_LCD_Command(0x8f);

Write_LCD_Data(0x4d); //写‘M’ break; } } }

else if(K2==0&&Adjust_Index!=-1)//加 {

delayms(100); if(K2==0) {

while(!K2);

DateTime_Adjust(1); } }

else if(K3==0&&Adjust_Index!=-1)//减 {

delayms(100); if(K3==0) {

while(!K3);

DateTime_Adjust(-1); }

18

电气与电子信息工程学院 课程设计报告

}

else if(K4==0&&Adjust_Index!=-1)//确定 {

delayms(100); if(K4==0) {

while(!K4); SetDateTime(); Adjust_Index=-1;

Write_LCD_Command(0x8f); //去除标志位 Write_LCD_Data(0x20); } }

else if(K5==0&&Adjust_Index!=-1)//取消 {

delayms(100); if(K5==0) {

while(!K5); Adjust_Index=-1;

Write_LCD_Command(0x8f); //去除标志位 Write_LCD_Data(0x20); } } }

五、调试

1、建立工程和仿真图

(1)打开proteus软件,新建一个工程,然后在工作窗口内画好原理图并保存。 (2)打开keil软件新建一个工程,选择所用单片机的型号,然后新建一个文件保存为.c文件并添加到工程中去,开始写源程序,写好后编译生成Hex文件。 (3)将生成的Hex文件下载到单片机内,观察结果,并调试,观察数码管上是否有相应正确的变化。若结果不正确,思考问题的所在,修改源程序,继续调试,直到观察到正确的运行结果。

19

电气与电子信息工程学院 课程设计报告

2、keil软件调试结果

图7 C程序调试结果

3、proteus软件仿真结果

图8 仿真结果

20

电气与电子信息工程学院 课程设计报告

六、实物的组装与调试

1.实物的组装

由于班上每组同学设计题目,所以采取的是手工焊接。于是我自己画pcb板,可是一上午过去了,还是画不好,下午只好根据已画的pcb及原理图来对元器件进行摆放和布局,这对电路板最后的走线增添了一定的难度。

2、实物焊接

小小的板,在我们的不懈努力下终于焊好了。焊接电路如下图。

图9 焊接实物图

3、调试

电路焊接完成后,插上usb线,加上5v电压,只有电源供电的指示灯亮着,

而显示器没有任何反应。于是,开始排查电路中那个模块出现了问题。首先当然想到的是显示器总存在着虚焊的点。利用万用表,测着每个引脚与接地短的电压,发现了果然有几个点存在着虚焊现象。排除这一问题后,加上电压,显示器亮了,却没有显示日期。结果发现AT89C51芯片没有加载程序。将其改正后,电路基本上实现了我们所需的日期和温度的显示功能。

21

电气与电子信息工程学院 课程设计报告

当我们尝试着让每个键是否能正常调时时,发现全部按键按下没有什么反应。刚开始想着是否是按键出现了问题,利用万用表检测,发现按键工作状态是对的。最终将问题锁定在了74HC08芯片上,结果发现少接了一根线。接好后,按键都能正常调时了。经过不懈的努力我们的万年历终于做成功了。调试结果如下图:

图10 调试实物图

22

电气与电子信息工程学院 课程设计报告

七、心得体会

本次课程设计是做一个多功能的电子万年历。经过一学期的学习后,应用起Proteus软件时便显得得心应手,对程序的编译,以及生成相应的hex文件,将汇编源程序加载等也能熟练掌握。而且通过此次做电子万年历使我对单片机更加感兴趣了,虽然我还没有能力自己编写复杂的程序,但我将会在以后的学习中更加深入地学习它。

通过这两周的课程设计,我学到了不少的知识。把以前没有学好的模拟电路的知识进行了补充和加强,这使我受益匪浅。并加深了我对于单片机和数字电路的认识,相信在今后的学习和工作中我会做的越来越好。通过查阅大量的资料,我获得了以前在课堂上学不到的东西,我想这对于以后的毕业设计,或者工作也好,都是很有帮助的。

通过本次课程设计,我更进一步地熟悉了芯片的结构并掌握了各芯片的工作原理和其具体的使用方法。调试过程是一个考验人耐心的过程。当时,显示器就是不显示日期,在检查了多次电路之后,还是没找到到问题。最后在请教老师后,才知道是显示器的对比度没有调整好。经过不懈的努力,我们的万年历终于成功制作出来了。

经过这次课程设计,让我懂得了要熟练地掌握课本上的知识,按部就班脚踏实地去做事,这样才能及时解决实际中出现的问题。

23

电气与电子信息工程学院 课程设计报告

附录 元件清单

器件 电阻 R1 电阻 R2 电阻 R5 电容 C1、C2 电容 C3 单片机 U1 U2 U4 与门 U5 红色发光二极管D1 按键开关 K1-K5 晶振 X1 晶振 X2 液晶显示器LCD1 上拉电阻RP1 可调电阻RV1 万能电路板 USB母接头 USB线 直流电源B1 规格 10K 300 4.7k 22pF 10uF AT89C51 DS1302 DS18B20 AND-5 LED-RED BUTTON CRYSTAL CRYSTAL LM016L RESPACK-8 POT-LIN 9*12 3V 表1 元件清单

数量 1 1 1 2 1 1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 备注 CAP-ELEC 带底座 带底座 带底座 带底座 12MHz 32768Hz 带底座 10K 10K 两端都为USB接口 参考文献

【1】.张靖武.周灵彬.单片机原理、应用与PROTEUS仿真。 【2】.江志红.51单片机技术与应用系统开发案例精选。 【3】.周润景.基于PROTEUS的51单片机设计与仿真。 【4】.王守中.51单片机开发入门与典型实例。 【5】.张齐.朱宁西.单片机系统设计与开发。 【6】.周立功单片机开发网。 【7】.天津锐志单片机开发网。

【8】.维纳电子DS18B20温度传感器中文PDF资料。 【9】.ATMEL公司AT89S52单片机中文PDF资料。

【10】.长沙太阳人电子有限公司通用型1602液晶PDF资料。

24

本文来源:https://www.bwwdw.com/article/2hfx.html

Top