目录
一、设计要求................................................................................. 3
二、设计流程................................................................................. 3
三、原理图元件库......................................................................... 4
四、原理图绘制............................................................................. 8
五、PCB封装与PCB板................................................................ 8
七、proteus软件设计................................................................... 11
八、keil代码设计........................................................................ 12
九、实训心得............................................................................... 15
一、设计要求
1.硬件要求
先设计出原理图,再用Altium Designer软件设计PCB。
2.软件要求
使用proteus、keil5软件,设计单片机程序,且实现以下功能:
1、人体感应
2、当有检测到有人后,判断当前时间,如果是在早上八点前以及晚上九点后,提醒关门语音播报,如果是当前时间是假期(寒假、暑假,寒假时间:1 月 15 日-2 月 15 日,暑假时间:7 月和 8 月),则不管当前时间是几点都进行语音播放提醒。在 20 秒内多次检测到人体,只播报一次
3、 语音播放提醒(可以有多段语音)
二、设计流程
1.选择合适的元器件
2.利用选择的器件设计原理图
3.利用Altium Designer软件设计pcb
4.利用protues、keil软件设计代码以及仿真验证
三、原理图元件库
1.51单片机模块
STC8系列单片机具备较高的运算速度和处理能力、包括通用输入输出口(GPIO)等,方便与各种外部设备连接和交互,适用于一些对功耗有要求的应用,可以使用相关的编程工具进行软件开发。它在许多领域都有应用,比如小型电子设备、智能控制、物联网节点等,可以实现数据采集、控制逻辑执行等功能。
因此,51单片机也常用于单片机初学者学习使用。
单片机模块原理图
Altium Designer软件原理图中的封装模型可以从嘉立创网站中导入,也可以选择直接在Altium Designer软件中绘制,自己设计封装时需要注意引脚是否放置正确。
2.DS1302时钟芯片模块
DS1302 是一款涓流充电时钟芯片模块,其特点功能如下所示。
特点:
①实时时钟功能,可提供准确的时间信息,包括年、月、日、时、分、秒。
②低功耗特性,适合电池供电的应用。
功能:
①具备31字节的静态 RAM,可用于存储一些额外的数据。
②可以通过串行接口与单片机等设备进行通信,方便数据的读写和控制。
③具有闰年自动调整功能。
在实际应用中,DS1302 时钟芯片模块常用于需要精确时间记录和显示的系统,如电子钟、数据记录设备、定时控制装置等。它为系统提供可靠的时间基准,并且相对易于使用和集成。通过对其进行编程和配置,可以满足不同应用场景下对时间管理的需求
时钟模块原理图
由于在该电路设计中,使用时钟芯片模块,而并非将整个电路直接设计在PCB上,因此只要在电路上,引出5个排插即可。
3.红外感应模块
单片机红外感应模块是一种与单片机配合使用,用于检测红外线的模块。它通常包含一个红外传感器,能够检测到物体发射或反射的红外线。当有物体进入其检测范围时,模块会输出相应的信号给单片机。这种模块具有以下特点:
①高灵敏度,可以检测到较远距离的红外信号变化。
②响应快速,能及时反馈物体的出现或移动。
③体积小巧,方便集成到各种设备中。
红外模块图
在该设计中,红外也使用模块设计,因此也只需要引出3个排插即可。
4.CH340G通讯串口芯片
CH340是一个USB总线的转接芯片,通过USB总线提供串口、打印口或者并口。在串口方式下,CH340提供串口发送使能、串口接收就绪等交互式的速率控制信号以及常用的MODEM联络信号,用于将普通的串口设备直接升级到USB总线。
串口驱动模块
5.NV080C语音播放模块
NV080C 语音播放模块是一款功能强大的语音芯片,该模块支持按键控制和 MCU 一线串口控制两种模式,其中按键控制模式包括边沿按键触发、电平触发、随机按键播放、顺序按键播放等多种方式,可直接驱动 0.5W 喇叭,支持 13bit 的 DAC 输出,也可外接模拟功放,满足不同的音频输出需求。
语音模块
四、原理图绘制
按照要求连接电路,并用红色的非电源线将各个模块分块标注,方便检查查看。
原理图
五、PCB封装与PCB板
1.封装
PCB封装指的是将各种原件从原理图放置到电路板上的模型,在设计过程中,最重要的是设计封装过孔的位置、间距以及大小,只有设计完全正确之后,才能在实物上将元器件焊接在电路板上。
部分封装如下:
USB接口封装
0805的LED封装
按钮开关封装
2、PCB设计
由于在以往焊接电路板的过程中,很容易因为焊接问题将电源线与其他线短接,因此本次设计的PCB采用单面设计,首先先将原理图电路在PCB上进行规划,首先考虑USB模块应该放在电路板最外侧以便于数据线的连接,其次再将电路连接相近的原件排列在一起进行布线,同时考虑是否符合布线规则,最后用地线进行铺铜,滴泪用于实现电流更好的传输效果,最后进行仿真验证,按照要求删除不需要的验证条件,验证通过即可。
PCB部分https://blog.youkuaiyun.com/zhjysx/article/details/140369158资源-优快云文库
七、proteus软件设计
1.电路设计
根据设计要求将单片机模块、时钟芯片模块、LCD模块、数码管模块灯放入,并完成线路连接。
Proteus原理图
2.使用说明
本设计用S1~S4四个开关调节LCD显示时间,按下S2按钮,LCE进入位选,再按下S1选择需要调节的年、月、日、时、分、秒、星期等数据值,按下S3表示将数据值调高,按下S4表示将数据值调低;
用开关S5模拟红外信号,当按下S5表示红外模块检测到人,此时数码管进行二十秒倒计时,在此期间再次按下S5,电路无反应,表示二十秒内再次按下无效,且用LED1亮起代表语音播报,且在寒暑假实现全天播报,其他时间早上八点前,晚上九点后不播报;
八、keil代码设计
1.模块化设计
采用模块化编程,可以使得代码看起来更加简洁,并且检查起来也更加方便。
模块化编程模块
本代码将所有代码分成DS1302代码模块、LCD1602代码模块以及主程序代码。
- 部分代码
①内部中断
void Timer1_Routine() interrupt 3
{
static unsigned int T1Count;
TL1 = 0x18;
TH1 = 0xFC; //2ms
T1Count++;
if (!( (DS1302_Time[1] == 1 && (DS1302_Time[2] >= 15 && DS1302_Time[2] <= 28)) ||
(DS1302_Time[1] == 2 && (DS1302_Time[2] >= 1 && DS1302_Time[2] <= 15)) ||
(DS1302_Time[1] == 7 && (DS1302_Time[2] >= 1 && DS1302_Time[2] <= 31)) ||
(DS1302_Time[1] == 8 && (DS1302_Time[2] >= 1 && DS1302_Time[2] <= 31))
))
{
if(!((DS1302_Time[3] <= 8) ||(DS1302_Time[3] >= 21))){
jiance();
}
else{jiance;}
}
if(T1Count>=5000)
{
T1Count=0;
if(m==1){
c--;
LED1=0;
}
if(c<=0){
c=20;
m=0;
LED1=1;
}
b=c/10;
a=c%10;
}
}
将二十秒倒计时以及判断当前时间是否处于寒暑假或者晚上九点后早上八点前等代码放入内部中断当中。
将二十秒倒计时时用中间变量m=1表示,如果m=1则再次按下开关S5无效,如果m=0,则继续检测。
②部分函数
·检测函数
void jiance(){
if(m==0){
if(KEY==0)
{
Delay(20);
while(KEY==0);
Delay(20);
m=1;
Delay(1);
c=20;
}
}
}
用该函数判断当前是否在倒计时。
·数码管位选函数
void shumaguan(){
//ÊýÂë¹ÜÆô¶¯
//µÍλ
S1=1;
S2=0;
P1=ab[b];
delayms(20);
//¸ßλ
S1=0;
S2=1;
P1=ab[a];
delayms(5);
}
用此函数控制数码管高低位位选。
③主程序
void main(){
LCD_Init();
DS1302_Init();
Timer0Init();
Timer1Init();
LCD_ShowString(1,1," - - ");
LCD_ShowString(1,11,"NAME");
LCD_ShowString(2,1," : : ");
DS1302_SetTime();
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
if(MODE==0){MODE=1;TimeSetSelect=0;}
else if(MODE==1){MODE=0;DS1302_SetTime();}
}
switch(MODE)
{
case 0:TimeShow();break;
case 1:TimeSet();break;
}
shumaguan();
}
}
在主程序内调用各个函数,启动LCD1602、DS1304等模块,并且将数码管启动的程序放在主程序内循环。
Timer0Init();
Timer1Init();
LCD_ShowString(1,1," - - ");
LCD_ShowString(1,11,"NAME");
LCD_ShowString(2,1," : : ");
DS1302_SetTime();
可以调用代码在LCD空余处打上自己的班级名字等。
九、实训心得
通过本次实训,重新复习了AD、proteus、keil等软件的使用方法以及51单片机的编写、PCB布局等,收获很多。
在学51单片机时,都是将所有代码放在主程序当中,在这一次实训中学会了如何模块化编程,使得代码看起来更加直观,修改起来更加方便、学会了如何调用DS1302时钟芯片内部的时间;在PCB设计当中,重新掌握了如何铺铜、如何修改设计规则检查中不需要修改的地方、过孔的大小等;通过proteus设计,复习了数码管共阴共阳极的特性。
本次实训对之后的学习、工作起到了很大的作用。
源文件目录
原理图
AD原理图部分https://blog.youkuaiyun.com/zhjysx/article/details/140369158资源-优快云文库
PCB
PCB部分https://blog.youkuaiyun.com/zhjysx/article/details/140369158资源-优快云文库
使用说明
使用说明原文链接https://blog.youkuaiyun.com/zhjysx/article/details/140369158资源-优快云文库
proteus
proteus部分https://blog.youkuaiyun.com/zhjysx/article/details/140369158资源-优快云文库
keil代码
keil5代码原文https://blog.youkuaiyun.com/zhjysx/article/details/140369158资源-优快云文库