单片机综合实验报告.docx
《单片机综合实验报告.docx》由会员分享,可在线阅读,更多相关《单片机综合实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
单片机综合实验报告
单片机综合实验报告
题目:
电子时钟(LCD显示)
班级:
姓名:
学号:
指导老师:
时间:
一、实验内容:
以AT89C51单片机为核心的时钟,在LCD显示器上显示当前的时间:
使用字符型LCD显示器显示当前时间。
显示格式为“时时:
分分:
秒秒”。
用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。
功能键K1~K4功能如下。
K1—进入设置现在的时间。
K2—设置小时。
K3—设置分钟。
K4—确认完成设置。
程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:
00:
00”,然后开始计时。
二、实验电路及功能说明
本系统采用STC89C52单片机,DS1302时钟芯片及18B20温度传感器作为主要硬件进行设计开发,通过12864液晶显示器及键盘作为人机交互。
充分发挥了各部分的性能及特点,操作简单,界面简洁易懂。
实物系统实现了以下功能:
数字式时钟显示
起始时间设置
室温实时显示
全机热复位
显示器灰度可调
1)单片机电路
单片机电路采用STC89C51RC作为主控芯片,芯片内集成了通用8位中央处理器和ISPFlash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,指令集结构简单。
芯片外接11.05926MHz及两片0603封装20P贴片电容作为晶振电路,为单片机提供时钟信号。
2)复位电路
RST为单片机的复位引脚。
当连续输入两个机器周期以上高电时为有效,用来完成单片机的复位初始化操作,复位后程序计数器PC=0000H,即复位后将从程序储存器的0000H单元读取第一条指令代码。
系统采用上电复位:
加电后给RST一个高电平脉冲。
简单的措施是阻容串联,电容接电源、电阻接地、中间节点接RST。
加电瞬间,电容两侧电压差为0,两侧均为高,RST脚为高,随后C通过R放电使RST节点到0。
3)12864显示电路
12864是128*64点阵液晶模块的点阵数简称,内部集成字库,采用串行及并行两种通信方式与MCU通信。
本系统采用串行方式通信,通过改变V0端口电压改变背光对比度。
4)DS1302时钟电路
DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域.DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软年自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
采用串行I/O通信方式,相对并行来说比较节省IO口的使用。
DS1302时钟芯片功耗低,它在工作电压2.0V的时候,工作电流小于300nA。
5)温度采集电路
温度采集电路DS18B20温度传感器,信号线采用4.7k电阻上拉。
6)独立键盘
设置4个按键组成独立键盘,共用10K对地限流电阻。
7)下载电路
下载电路外引P3.0(RXD)、P3.1(TXD),使用STC原厂烧录器下载程序。
8)供电电路
全机供电采取12V锂聚合物电池,它具有能量高、小型化、轻量化等特点,方便使用。
因MCU及外围电路工作电压为5V,故采用7805进行直流降压。
7805三端稳压IC来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。
根据硬件电路设计规则,虽然整机采用直流供电,为了适应后期变压器供电可能引入的交流成分,在稳压芯片前设置了470uF/25V电解电容及104瓷片电容进行滤波,并在各个芯片供电输入前设置了瓷片电容用来滤除高频信号干扰。
三、实验程序流程图:
四、实验结果分析
经测试,系统程序运行稳定可靠,时间精度准确,整机掉电后,系统时间仍可维持正常计时。
人机交互界面简洁。
五、心得体会
在为期一个学期的单片机实验课程中,承蒙高林老师的耐心指导和讲解。
通过综合实验的开发加强了我动手能力。
在系统设计过程中得到了创新实践中心开发平台提供的硬件支持和开发环境,使我顺利完成了本次实践制作,在此一并表示感谢。
六、程序清单
主函数:
/*************************************************
带温度显示的数字时钟
白赫031140504
实验操作:
KEY1-进入设置KEY2-设置小时KEY3-设置分KEY4-确定
*************************************************/
#include//使用<>,优先从安装文件目录查找
#include"led.h"
#include"key.h"
#include"18b20.h"
#include"lcd.h"
#include"ds1302.h"
voiddelay_ms(uintt);//延时nms
voidset(void);//设置时间
voidshow_time(void);//显示时间
voidmain(void)
{
uchari=0,key=0;
intt=0;//温度
LED_Init();
LCD_Init();//12864初始化
KEY_Init();//按键初始化
Ds1302_Init();//ds1302初始化
DS18B20_Init();//DS18B20初始化
//启动显示界面
LCD_writeString(0,1,"超级电子时钟");
LCD_writeString(2,0,"031140504");
LCD_writeString(2,5,"白赫");
LCD_writeChar(3);
LCD_writeString(3,3,"");
LCD_writeChar('D');LCD_writeChar('r');LCD_writeChar(':
');
LCD_writeString(3,5,"高林");
while
(1)
{
key=KEY_scan();//获取键值
if(key==1)//按下1键,进入设置
{
set();//进行时间设置
Ds1302_Write_Time();//更新时间参数
show_time();//显示时间
}
else//如果没有进入设置
{
Ds1302_Read_Time();//读取时间参数
show_time();//显示时间
delay_ms(50);//防止温度显示错位,加一个小延时
t=ReadTemperature();//读取温度
LCD_Wendu(t);//显示温度
}
delay_ms(50);
i++;
if(i>10)
{
LED=!
LED;//闪烁灯,指示程序正在运行
i=0;
}
}
}
/***********************************************
@函数名:
delay_ms()
@描述:
进行nms延时
@输入:
t-延时的时间
@返回:
void
************************************************/
voiddelay_ms(uintt)
{
uinti,j;
for(i=0;ifor(j=0;j<115;j++);
}
/***********************************************
@函数名:
set()
@描述:
时间设置的主要部分
@输入:
void
@返回:
void
************************************************/
voidset(void)
{
ucharkey_flag=1,key=0;
while(key_flag)//按下1键,进入循环扫描,知道key4按下,key_flag置0才退出
{
key=KEY_scan();//扫描按键
if(key!
=0)//如果有键按下
{
switch(key)
{
case2:
//小时设置
{
time[4]+=1;
if(time[4]>23)//如果小时值大于23,则重新置为0
time[4]=0;
LCD_writeNumber(1,1,time[4]);//显示小时值
}break;
case3:
//分钟设置
{
time[5]+=1;
if(time[5]>59)//如果分钟值大于59,则重新置为0
time[5]=0;
LCD_writeNumber(1,3,time[5]);//显示分钟值
}break;
case4:
key_flag=0;break;//确定,key_flag置0,退出while(key_flag)循环
}
}
}
}
/***********************************************
@函数名:
show_time()
@描述:
显示时间的函数
@输入:
void
@返回:
void
************************************************/
voidshow_time(void)
{
LCD_writeNumber(1,1,time[4]);//时
LCD_writeChar('');
LCD_writeChar(':
');
LCD_writeNumber(1,3,time[5]);//分
LCD_writeChar('');
LCD_writeChar(':
');
LCD_writeNumber(1,5,time[6]);//秒
}
按键函数
#include"key.h"
voidKEY_Delay(void)
{
inti,j;
for(i=0;i<10;i++)
for(j=0;j<110;j++);
}
/***********************************************
@函数名:
KEY_Init()
@描述:
初始化按键四个IO为高
@输入:
void
@返回:
void
************************************************/
voidKEY_Init(void)
{
key1=1;
key2=1;
key3=1;
key4=1;
}
/***********************************************
@函数名:
KEY_scan()
@描述:
按键检测程序
@输入:
void
@返回:
按键的标号
************************************************/
ucharKEY_scan(void)
{
if(key1==0||key2==0||key3==0||key4==0)
{
KEY_D