电子设计报告.docx
- 文档编号:12579137
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:24
- 大小:257.14KB
电子设计报告.docx
《电子设计报告.docx》由会员分享,可在线阅读,更多相关《电子设计报告.docx(24页珍藏版)》请在冰点文库上搜索。
电子设计报告
教师评价
优+
良+
中+
及格+
不及格+
教师签名
日期
2014.
优
良
中
及格
不及格
优-
良-
中-
及格-
不及格-
电子设计——拔河
中国矿业大学计算机科学与技术学院电子信息科学系
班级:
信科学号:
xxxxxxxx,姓名:
XX
日期:
2014年6月20日
1.概述
本课程我的选题是电子拔河器。
采用上学期所焊接的51单片机板子,用8个led的左右移动反映两个人按键的快慢,并将按键次数及结果显示在8位数码管上。
游戏采用3局2胜制。
2.需求分析
该电子拔河器实现容易,规则简单,娱乐性强。
电路介绍:
该单片机开发板以AT89S51,52系列单片机为基础,选定增强型的STC89C52RC系列单片机作为开发板主芯片,由专业的电路设计工具软件AltiumDesigner绘制的电路原理图。
本实验电路的基本元器件包含:
STC89C52RC单片机、共阴极8位数码管、16位LED发光二极管、6个按键按键查询,按键中断、RS-232串行通信接口、蜂鸣器、USB供电系统。
芯片介绍:
STC89C52RC:
实现本次实验的重要芯片,针对AT89S52系列单片机ISP功能的不稳定,特选定增强型的STC89C52RC系列单片机作为开发板主芯片。
STC89C51RC系列单片机是宏晶科技推出的新一代超强抗干扰/高速/低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可任意选择,最新的D版本内部集成MAX810专用复位电路。
ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器,可通过串口(P3.0/P3.1)直接下载用户程序,8K程序3秒即可完成一片。
原理介绍:
为实现拔河游戏的效果。
本实验的原理图包含四个主要部分:
主芯片STC89C52RC、LED二极管、八位数码管、按键。
STC89C52RC,该芯片具有40个引脚,包含32个通用I/O口。
P0端口(P0.0~P0.7,39~32引脚):
本实验中,P0端口,主要用来控制LED二极管的显示(通过一只亮的LED二极管的左右移动来模拟拔河的过程)、八位数码管(显示双方各自按键次数,以及比分和结果)。
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。
此时,P0口内部上拉电阻有效。
在FlashROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。
验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):
本实验中,使用P1.4控制喇叭,发出滴滴声来提醒比赛结束。
使用P1.6、P1.7口来选择倒计时时间(按P1.6选择5s倒计时,按P1.7选择10s倒计时)P1口是一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流(
)。
P2端口(P2.0~P2.7,21~28引脚):
本实验中P2口主要用来控制选择八位数码管显示数字的位置。
P2口是一个带内部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。
P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(
)。
P3端口(P3.0~P3.7,10~17引脚):
在本次实验中P3口使用其复用功能,用P3.2
(外部中断0)和P3.3
(外部中断1)来检测并记录按键数。
P3是一个带内部上拉电阻的8位双向I/O端口。
P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。
P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流(
)。
在对FlashROM编程或程序校验时,P3还接收一些控制信号。
P3口除作为一般I/O口外,还有其他一些复用功能,如下表所示:
引脚号
复用功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0的外部输入)
P3.5
T1(定时器1的外部输入)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器读选通)
RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。
看门狗计时完成后,RST引脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/
(30引脚):
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在Flash编程时,此引脚(
)也用作编程输入脉冲。
(29引脚):
外部程序存储器选通信号(
)是外部程序存储器选通信号。
当AT89C51RC从外部程序存储器执行外部代码时,
在每个机器周期被激活两次,而访问外部数据存储器时,
将不被激活。
/VPP(31引脚):
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,
必须接GND。
注意加密方式1时,
将内部锁定位RESET。
为了执行内部程序指令,
应该接VCC。
在Flash编程期间,
也接收12伏VPP电压。
XTAL1(19引脚):
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2(18引脚):
振荡器反相放大器的输入端。
实现拔河的电路原理图如下所示:
STC89C52芯片:
STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
HD74LS244P芯片:
逻辑功能:
八缓冲/线驱动;附加功能:
三态输出;传播延迟:
18ns;电源电压:
4.75V~5.25V;工作温度:
-20℃~75℃;逻辑系列:
74LS;封装:
PDIP-20
CH340G芯片:
全速USB设备接口,兼容USBV2.0,外围元器件只需要晶体和电容;仿真标准串口,用于升级原串口外围设备,或者通过USB增加额外串口;计算机端Windows操作系统下的串口应用。
MAX232芯片:
驱动芯片类型:
线路驱动器/接收器;接口:
RS232,V.28/V.24;电源电压范围:
4.5V--5.5V;封装类型:
双列直插;工作温度范围:
-40°C~+85°C;封装类型:
DIP;器件标号:
232;接口类型:
RS-232;电源电压最大:
5.5V
3.软件功能模块图
实现电子拔河器的功能,该游戏的实现可以分为5个主要模块,该软件功能模块图如下:
主程序模块:
实现拔河过程的主要模块。
按键检测模块:
用来检测按键数并记录,以此决定那只亮的LED二极管的左右移动;以及判断该局的输赢者;在游戏初始阶段选择倒计时时间。
LED发光二极管移动模块:
根据A、B按键次数来决定相应LED灯的亮,用来模拟拔河过程中绳子标志的左右移动。
数码管显示模块:
根据A、B按键次数。
显示相应A、B的按键次数;
显示每局输赢者;
显示最终比分。
定时器中断倒计时模块:
根据选择,当检测到有键按下(游戏开始)就开始倒计时。
若游戏在一定时间内不能结束(到达边界)便终止游戏,并显示A、B按键数。
主程序初始化模块:
在每一局结束后,初始化程序然后开始新的一局。
直到分出胜负。
4.程序流程图
根据本实验要求所绘程序流程图如下:
按键模块流程图:
LED灯模块流程图:
数码管模块图:
定时器模块:
实现电子拔河的代码如下:
(基于C语言,在Keil3平台上编写)
#include
//LED灯和数码管
unsignedcharcodeLEDcode1[]=
{0xfe,0xfd,0xfb,0xf7,0xe7,0xef,0xdf,0xbf,0x7f};
unsignedcharcodeLEDcode2[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//设置变量
unsignedlongintcount;
unsignedintt;
unsignedinttime;
unsignedintinter;
unsignedchari;
unsignedcharj;
unsignedchark;
unsignedcharm;
unsignedcharn;
unsignedcharq;
unsignedcharm1=0;
unsignedcharn1=0;
unsignedcharjieshu;
//外部中断键位
sbitSP1=P3^2;
sbitSP2=P3^3;
sbitSP3=P1^6;
sbitSP4=P1^7;
sbitSPOUT=P1^4;
//延时子程序
voiddelay1ms(void)
{
unsignedchari,j;
for(i=2;i>0;i--)
for(j=248;j>0;j--);
}
voiddelay5ms(void)
{
unsignedchari,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--);
}
voiddelay02s(void)
{
unsignedchari,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
//定时中断1初始化子程序
voidtimer1_init()
{
TMOD|=0x10;
TMOD&=0xdf;
TH1=0x3c;
TL1=0xce;
TR1=1;
}
voidint_init()
{
EA=1;
ET1=1;
}
//外部中断初始化子程序
voidout_init()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
}
//主程序初始化
voidchushihua()
{
SPOUT=0;
P0=0xe7;
P2=0xff;
k=4;
t=0;
i=0;
j=0;
m=0;
n=0;
q=0;
do{delay1ms();}
while((SP3&&SP4)!
=0);
if(SP3==0)
{time=100;}
else
{
if(SP4==0)
{time=200;};
}
do{delay1ms();}
while((INT0&&INT1)!
=0);
timer1_init();
int_init();
out_init();
}
//比分判断
voidbifen()
{
if((m1==2)&&((n1==0)||(n1==1)))
{
while
(1)
{
P0=LEDcode2[m1];
P2=0xbf;
delay1ms();
P0=LEDcode2[n1];
P2=0xef;
delay1ms();
P0=0x30;
P2=0xfd;
delay1ms();
P0=0x3e;
P2=0xfe;
delay1ms();
}
}
if((n1==2)&&((m1==0)||(m1==1)))
{
while
(1)
{
P0=LEDcode2[m1];
P2=0xbf;
delay1ms();
P0=LEDcode2[n1];
P2=0xef;
delay1ms();
P0=0x5b;
P2=0xfd;
delay1ms();
P0=0x3e;
P2=0xfe;
delay1ms();
}
}
}
//数码管显示子程序
voidxianshi()
{
P0=LEDcode2[m/10];
P2=0x7f;
delay1ms();
P0=LEDcode2[m%10];
P2=0xbf;
delay1ms();
P0=LEDcode2[n/10];
P2=0xdf;
delay1ms();
P0=LEDcode2[n%10];
P2=0xef;
delay1ms();
}
//显示比赛结果子程序
voidwiner()
{
SPOUT=1;
delay02s();
SPOUT=0;
delay02s();
SPOUT=1;
delay02s();
SPOUT=0;
for(inter=250;inter>0;inter--)
{xianshi();
if(m>n)
{P0=0x30;
P2=0xfd;
delay1ms();
P0=0x3e;
P2=0xfe;
delay1ms();
}
else
{if(m==n)
{P0=0x3f;
P2=0xf0;}
else
{delay1ms();
P0=0x5b;
P2=0xfd;
delay1ms();
P0=0x3e;
P2=0xfe;
delay1ms();
}
}
}
}
//主函数
voidmain(void)
{
chushihua();
while
(1)
{count=15000;
i=0;
j=0;
while(count>0)
{count--;
}
if(i>j)
{
if(k==0)
{P0=LEDcode1[0];
q=1;
m1++;
winer();
bifen();
chushihua();}
else
{k--;
P0=LEDcode1[k];}
}
else
{if(i==j)
{P0=LEDcode1[k];}
else
{
if(k==8)
{P0=LEDcode1[8];
q=1;
n1++;
winer();
bifen();
chushihua();}
else
{k++;
P0=LEDcode1[k];}
}
}
}
}
//定时10s中断
voidinterrupt_timer1()interrupt3
{
TH1=0x3c;
TL1=0xce;
t++;
if((t==time)&&(q==0))
{
if(m>n)
{m1++;}
else
{
if(m==n)
{m1++;
n1++;}
else
{n1++;}
}
winer();
bifen();
chushihua();
}
}
//外部中断,检测按键按下并计数
int0()interrupt0
{
if(INT0==0)
{
delay5ms();
if((INT0==0)&&(q==0))
{
i++;
m++;
}
}
}
int1()interrupt2
{
if((INT1==0)&&(q==0))
{
delay5ms();
if(INT1==0)
{
j++;
n++;
}
}
}
5.实验分析和调试
本次实验的主题是电子拔河。
虽然简单,但也并不容易。
在实现电子拔河的效果过程中遇到不少障碍,如下:
第一、对C语言不熟悉,因为平时比较侧重于java语言的学习,对C语言的应用便较为生疏。
时常混淆了两种语言不同用的用法。
不断上网查资料、翻书,得以解决。
第二、对单片机基础部分了解不够,在按键检测时,一开始使用了顺序语句导致一个按键按下时另一个按键检测模块无法运行。
后来采用外部中断的方法来解决的。
第三、逻辑错误难以发现。
在编写代码的过程中,经常出现因为考虑不全面而导致的逻辑错误,虽然编译正常,但无法完全实现所需功能和效果。
最后一遍遍按照软件的程序流程图进行检查,才发现错误所在。
6.结论
通过这次的电子拔河器的制作,我对C语言和单片机的基础知识都有了一定了解。
本次电子设计主要在于初始的软件模块的设计、程序流程图的设计、编程和调试。
涉及到C语言的设计开发、汇编语言的基础应用。
在本次的电子设计中,为了实现拔河的功能和效果,我查阅了不少资料。
为了画电路原理图,我学习了AltiumDesigner软件的使用;为了实现拔河的功能,我学习并实践了单片机上汇编语言的应用和C语言的基础编程;我还学习了在Keil3平台编写代码的过程。
7.参考文献
[1]杨恢先.单片机原理及应用[M].北京:
人民邮电出版社,2009
[2]皮大能.单片机课程设计指导书[M].北京:
北京理工大学出版社,2010
[3]唐国民.C语言程序设计[M].北京:
清华大学出版社,2009
[4]史济民.软件工程——原理、方法与应用[M].北京:
高等教育出版社,2009
[5]51单片机C语言编程入门[M].中国科技大学业余无线电协会编
8.结论
通过这次电子拔河器的制作,我收获了很多东西,不仅仅是学习到如何从总体设计开发一个简单的游戏,也不仅仅是学习到了C语言、汇编语言的使用。
这次的课题在实现中也遇到不少问题,也有过花费数小时而不得解的情况,但最终都基本解决了。
经过这些问题的考验,我对于问题的分析更仔细了,对于问题的处理更耐心了。
相信下一次我会做的更好更快。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子设计 报告