【毕业设计】34-基于单片机的智能数字电子定时器/电子时钟系统设计(原理图工程+PCB工程+源码+仿真工程+答辩论文)
资料要求
资料包含:毕业设计全套资料(精品)
原理图工程文件
原理图截图
PCB工程文件
仿真模型工程文件
仿真截图
答辩论文低重复率文档
英文文献及翻译
visio流程图工程
详情请私信!
任务书
设计说明书
摘要
随着社会的进步,经济水平的提高,人们开始通过定时器来规划自己的时间,传统的时钟不能通过移动的方式,只能将其挂在墙上或者钟楼塔的形式出现。针对此问题,本次系统设计了一款智能数字电子定时器器系统,可以实现定时、启动、停止、数字显示、报警、闹钟设置等多项功能。设计系统采用STC89C52单片机控制,DS1302计时芯片作为系统定时;通过液晶显示器LCD1602显示当前时间或者设置闹钟信息;通过按键来控制,时间暂停,闹钟设定等功能。系统设计分为硬件电路设计和软件部分设计,在设计过程中考虑到系统的稳定性和抗干扰能力甚至是兼容性,最后使用仿真软件将系统功能仿真测试。
本文首先对智能数字电子定时器系统的现状以及未来趋势进行分析,进而确定系统的总体方案和系统框架。然后进行智能数字电子定时器系统的硬件设计、电路分析、总电路图的绘制。智能数字电子定时器的软件设计根据系统的功能绘制主程序流程图,并分别绘制各个子程序流程图,在此基础上编写程序,最终编译生成HEX文件。最后对智能数字电子定时器系统进行仿真实现,将程序导入到单片机中,进行调试,并测试验证功能。
设计框架架构
设计说明书及设计文件
源码展示
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include "eeprom52.h"
#include "nongli.h"
#include "intrins.h"
bit flag_200ms ;
bit flag_100ms ;
sbit beep = P1^4; //蜂鸣器定义
bit flag_beep_en;
uint clock_value; //用作闹钟用的
sbit dq = P2^0; //18b20 IO口的定义
uint temperature ; //温度变量
uchar flag_nl; //农历 阳历显示标志位
uchar menu_1,menu_2;
uchar key_time,flag_value; //用做连加的中间变量
bit key_500ms ;
uchar n_nian,n_yue,n_ri; //农历显示的函数
#include "ds1302.h"
#include "lcd1602.h"
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, fen1);
byte_write(0x2001, shi1);
byte_write(0x2002, open1);
byte_write(0x2058, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
fen1 = byte_read(0x2000);
shi1 = byte_read(0x2001);
open1 = byte_read(0x2002);
a_a = byte_read(0x2058);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
fen1 = 3;
shi1 = 8;
open1 = 1;
a_a = 1;
write_eeprom(); //保存数据
}
}
/******************1ms 延时函数*******************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/******************写星期函数*******************/
void write_week(uchar hang,uchar add,uchar week)//写星期函数
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
switch(week)
{
case 1:write_data('M');//星期数为1时,显示
write_data('O');
write_data('N');
break;
case 2:write_data('T');//星期数据为2时显示
write_data('U');
write_data('E');
break;
case 3:write_data('W');//星期数据为3时显示
write_data('E');
write_data('D');
break;
case 4:write_data('T');//星期数据为4是显示
write_data('H');
write_data('U');
break;
case 5:write_data('F');//星期数据为5时显示
write_data('R');
write_data('I');
break;
case 6:write_data('S');//星期数据为6时显示
write_data('T');
write_data('A');
break;
case 7:write_data('S');//星期数据为7时显示
write_data('U');
write_data('N');
break;
}
}
/*************时钟显示***************/
void init_1602_ds1302()
{
write_sfm2_ds1302(1,1,shi); //显示时
write_sfm2_ds1302(1,4,fen); //显示分
write_sfm2_ds1302(1,7,miao); //显示秒
write_week(2,12,week);
if(flag_nl == 0) //显示阳历
{
write_sfm2_ds1302(2,2,nian); //显示年
write_sfm2_ds1302(2,5,yue); //显示月
write_sfm2_ds1302(2,8,ri); //显示日
}
else //显示农历
{
// write_sfm2_ds1302(2,2,n_nian); //显示年
// write_sfm2_ds1302(2,5,n_yue); //显示月
// write_sfm2_ds1302(2,8,n_ri); //显示日
}
}
/*************定时器0初始化程序***************/
void init_time0()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/*************闹钟报警函数***************/
void menu_dis()
{
static uchar mm,value;
if(flag_100ms == 1) //100ms执行一次
{
flag_100ms = 0;
if(open1 == 1) //如果闹钟打开
{
if((miao == 0) && (fen == fen1) && (shi == shi1))
{
flag_beep_en = 1; //有报警 打开蜂鸣器响的标志位
}
if(flag_beep_en == 1) //闹钟以被打开
{
clock_value++;
if(clock_value <= 30)
beep = ~beep; //蜂鸣器叫3秒
else if(clock_value > 30)
{
beep = 1; //蜂鸣器停1秒
if(clock_value > 40)
{
clock_value = 0;
}
}
// 1 分钟后自动关闭闹钟
value ++;
if(value >= 10)
{
value = 0;
mm++;
if(mm >= 60)
{
mm = 0;
flag_beep_en = 0;
beep = 1;
}
}
}
}
}
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P3 |= 0xff; //对应的按键IO口输出为1
if((P3 & 0xff) != 0xff) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P3 & 0xff) != 0xff) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P3 & 0xff)
{
case 0xfe: key_can = 4; break; //得到按键值
case 0xfd: key_can = 3; break; //得到按键值
case 0xfb: key_can = 2; break; //得到按键值
case 0xf7: key_can = 1; break; //得到按键值
}
// write_sfm2(1,0,key_can); //显示按键值
}
}
else
key_new = 1;
}