typora-root-url: ./
【毕业设计】1-基于单片机的城市轨道交通列车超速防护系统_里程表设计(原理图+PCB+源码+仿真工程+答辩论文)
文章目录
- typora-root-url: ./
- 【毕业设计】1-基于单片机的城市轨道交通列车超速防护系统_里程表设计(原理图+PCB+源码+仿真工程+答辩论文)
- 任务书
- 设计说明书
- 摘要
- 设计框架架构
- 设计说明书及设计文件
- 源码展示
任务书
以动车组作为研究对象,对城市轨道交通列车超速防护系统展开分析与设计。基于单片机实现城市轨道交通列车超速防护系统的设计。 1、画出控制系统原理框图,对其进行说明。 2、完成控制系统的硬件电路原理图设计。 3、进行软件设计并调试仿真,达到相应的控制要求。
资料链接
原理图工程文件
PCB工程文件
仿真模型工程文件
源代码工程
答辩论文低重复率文档,22404字
英文文献及翻译
任务书
设计说明书
摘要
本次设计城市轨道交通列车超速保护系统装置,根据当前的背景研制出一款可以实现时间显示,实时速度显示,公里数显示,并可以通过阈值调节实现设定速度报警的功能。系统设计流程为系统方案确认,电路原理图设计,程序流程设定,程序编写,仿真电路搭建,测试。设计过程均以模块化方式设计,在硬件电路设计过程中构成有蜂鸣器,液晶显示器,时钟芯片DS1302、电源、单片机最小系统共同组成一个硬件电路,在软件部分通过对系统的软件流程绘制,驱动编写,并且实现最终的软件框架。再通过模块化方式对系统程序进行设计,最后通过仿真软件对当前电路软件进行测试。验证了系统预期功能并提出改进方案设想预期功能,系统设计综合全部完成。
设计框架架构
前 言 1
第一章 绪论 2
第一节 研究背景 2
第二节 研究意义 2
第三节 本文的主要研究内容 3
第四节 本章小结 4
第二章 系统整体方案设计 5
第一节 系统方案概述 5
第二节 系统整体方案 5
第三节 元器件选择 6
一、主控芯片选择 6
二、显示器示方案选择 6
三、报警元件选择 8
第四节 测速方案 8
一、频率的测量方法 9
二、速度的实现 10
第五节 本章小结 11
第三章 系统硬件电路设计 12
第一节 单片机介绍 12
一、单片机芯片介绍 12
二、单片机最小系统电路设计 14
第二节 测速电路设计 15
第三节 按键及电源电路设计 16
第四节 液晶显示电路设计 17
第五节 存储电路设计 17
第六节 时钟电路设计 18
第七节 报警电路设计 18
第八节 系统总电路设计 19
第九节 本章小结 19
第四章 系统软件设计 20
第一节 系统软件总流程设计 20
第二节 人机交互程序设计 21
一、人机交互程序设计流程 21
二、人机交互驱动子程序 22
第三节 液晶显示驱动程序设计 22
一、液晶显示驱动程序设计流程 22
二、液晶显示驱动子程序 24
第四节 报警驱动程序设计 25
一、报警驱动程序设计流程 25
二、报警驱动子程序 26
第五节 本章小结 26
第五章 系统仿真实现 27
第一节 仿真电路搭建 27
一、仿真软件介绍 27
第二节 仿真系统调试 29
第三节 仿真系统测试 30
一、人机交互测试 30
二、时间读取测试 31
三、速度检测测试 32
第四节 本章小结 33
结 论 34
致 谢 35
参考文献 36
附 录 37
一、英文原文 37
二、英文翻译 40
三、工程图纸 43
四、源代码 44
设计说明书及设计文件
源码展示
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include "Data.h"
#include "DS1302.h"
#include "AT24C02.h"
sbit COUNT_IN=P3^2;
//定义1602相关管脚
sbit rs=P1^4;
sbit en=P1^0;
//键盘定义
sbit K1=P3^4; //设置时间
sbit K3=P3^6; //减按键
sbit K2=P3^5; //加按键
sbit K4=P3^7; //设置半径安全距离
sbit BEEP=P3^0;
uint count;
unsigned long Velocity,Mileage;
uchar code tab1[]={" / / : "}; //14/09/10 16:34 3
uchar code tab2[]={" 0.000km 00km/h"}; //000.000km 00km/h
uchar code tab3[]={"Wheel Radius cm"};
uchar code tab4[]={"Safe Speed km/h"};
uchar code tab5[]={"Sec : "};
uchar Mode=0;
uchar bike_set=0;
uchar a;
char RADIUS,SAFE_SPEED;
bit LED_SEC;
uchar before_sec;
//自定义字符
uchar code num[]={
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//1
0x1f,0x01,0x01,0x1f,0x10,0x10,0x1f,0x00,//2
0x1f,0x01,0x01,0x1f,0x01,0x01,0x1f,0x00,//3
0x11,0x11,0x11,0x1f,0x01,0x01,0x01,0x00,//4
0x1f,0x10,0x10,0x1f,0x01,0x01,0x1f,0x00,//5
0x1f,0x10,0x10,0x1f,0x11,0x11,0x1f,0x00,//6
0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x00,//7
};
void READS();
void SETS();
void delay(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
void init()
{
IT0=1; //INT0负跳变触发
TMOD=0x01;//定时器工作于方式1
TH0=0x3c; //50ms
TL0=0xb0;
EA=1; //CPU开中断总允许
ET0=1;//开定时中断
EX0=1;//开外部INTO中断
TR0=1;//启动定时
}
/********液晶写入指令函数与写入数据函数,以后可调用**************/
void write_1602com(uchar com)//****液晶写入指令函数****
{
rs=0;//数据/指令选择置为指令
P0=com;//送入数据
delay(1);
en=1;//拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}
void write_1602dat(uchar dat)//***液晶写入数据函数****
{
rs=1;//数据/指令选择置为数据
P0=dat;//送入数据
delay(1);
en=1; //en置高电平,为制造下降沿做准备
delay(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
}
//自定义字符集
void Lcd_ram()
{
uint i,j,k=0,temp=0x40;
for(i=0;i<7;i++)
{
for(j=0;j<8;j++)
{
write_1602com(temp+j);
write_1602dat(num[k]);
k++;
}
temp=temp+8;
}
}
void lcd_init()//***液晶初始化函数****
{
Lcd_ram();
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移
write_1602com(0x01);//清显示
write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
for(a=0;a<16;a++)
{
write_1602dat(tab1[a]);//向液晶屏写固定符号部分
}
write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<16;a++)
{
write_1602dat(tab2[a]);//写显示固定符号
}
}
void display()
{
// 1km/h=100m/0.1h 360s
// 10km/h=100m/0.01h 36s
// 100km/h=100m/0.001h 3.6s
if(Mode==0&&bike_set==0)
{
//读时间
Ds1302_Read_Time();
//显示时间
write_1602com(0x80);
write_1602dat(0x30+time_buf1[1]/10);
write_1602dat(0x30+time_buf1[1]%10);
write_1602com(0x80+3);
write_1602dat(0x30+time_buf1[2]/10);
write_1602dat(0x30+time_buf1[2]%10);
write_1602com(0x80+6);
write_1602dat(0x30+time_buf1[3]/10);
write_1602dat(0x30+time_buf1[3]%10);
write_1602com(0x80+9);
write_1602dat(0x30+time_buf1[4]/10);
write_1602dat(0x30+time_buf1[4]%10);
write_1602com(0x80+12);
write_1602dat(0x30+time_buf1[5]/10);
write_1602dat(0x30+time_buf1[5]%10);
write_1602com(0x80+15);
write_1602dat(time_buf1[7]-1);
if(before_sec!=time_buf1[6])
{
before_sec=time_buf1[6];
write_1602com(0x80+11);
write_1602dat(':');
LED_SEC=1;
}
if(LED_SEC==0)
{
write_1602com(0x80+11);
write_1602dat(' ');
}
write_1602com(0x80+0x40);
if(Mileage/1000000==0)
write_1602dat(' ');
else
write_1602dat(0x30+Mileage/1000000);//数字+0x30得到该数字的LCD1602显示码
if(Mileage%1000000/100000==0)
write_1602dat(' ');
else
write_1602dat(0x30+Mileage%1000000/100000);//数字+0x30得到该数字的LCD1602显示码
write_1602dat(0x30+Mileage%1000000%100000/10000);//数字+0x30得到该数字的LCD1602显示码
write_1602com(0x80+0x40+4);
write_1602dat(0x30+Mileage%1000000%100000%10000/1000);//数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+Mileage%1000000%100000%10000%1000/100);//数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+Mileage%1000000%100000%10000%1000%100/10);//数字+30得到该数字的LCD1602显示码
SETS();
write_1602com(0x80+0x40+10);
write_1602dat(0x30+Velocity/10);
write_1602dat(0x30+Velocity%10);//数字+30得到该数字的LCD1602显示码
}
else if(Mode!=0)
{
switch(Mode)
{
case 1:
write_1602com(0x80+0x40);//显示固定符号写入位置
for(a=0;a<16;a++)
{
write_1602dat(tab5[a]);//写显示固定符号
}
write_1602com(0x80+0x40+14);
write_1602dat(0x30+time_buf1[6]/10);
write_1602dat(0x30+time_buf1[6]%10);
write_1602com(0x0F); //打开闪烁
write_1602com(0x80+1);
break;
case 2:
write_1602com(0x80+4);
break;
case 3:
write_1602com(0x80+7);
break;
case 4:
write_1602com(0x80+10);
break;
case 5:
write_1602com(0x80+13);
break;
case 6:
write_1602com(0x80+0x40+15);
break;
case 7:
write_1602com(0x80+15);
break;
case 8:
write_1602com(0x0c);
write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
for(a=0;a<16;a++)
{
write_1602dat(tab1[a]);//向液晶屏写固定符号部分
}
write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<16;a++)
{
write_1602dat(tab2[a]);//写显示固定符号
}
break;
}
}
else if(bike_set!=0)
{
switch(bike_set)
{
case 1:
write_1602com(0x80);//显示固定符号写入位置
for(a=0;a<16;a++)
{
write_1602dat(tab3[a]);//写显示固定符号
}
write_1602com(0x80+0x40);//显示固定符号写入位置
for(a=0;a<16;a++)
{
write_1602dat(tab4[a]);//写显示固定符号
}
write_1602com(0x80+12);
write_1602dat(0x30+RADIUS/10); //车轮半径
write_1602dat(0x30+RADIUS%10);
write_1602com(0x80+0x40+10);
write_1602dat(0x30+SAFE_SPEED/10); //安全速度
write_1602dat(0x30+SAFE_SPEED%10);
write_1602com(0x0F); //打开闪烁
write_1602com(0x80+13);
break;
case 2:
write_1602com(0x80+0x40+11);
break;
case 3:
write_1602com(0x0c);
write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
for(a=0;a<16;a++)
{
write_1602dat(tab1[a]);//向液晶屏写固定符号部分
}
write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<16;a++)
{
write_1602dat(tab2[a]);//写显示固定符号
}
break;
}
}
}