单片机技术课程设计:乒乓球电子计分器方案与实现详解
微控制器技术课程设计手册的设计主题:乒乓球电子得分手目录1。设计任务和要求22。解决方案设计和演示23。硬件电路设计34。软件设计85。安装和调试85。使用指令13。vi。使用说明157。经验16参考附录电路示意图电路PCB图组件列表详细的程序列表评分评估表1。设计任务和要求1。设计电子乒乓球得分手。 2。它可以用按钮控制分数并在数字管上显示,并可以单击一键切换。 2。计划设计和论证1。总体设计分析微控制器具有较高的集成和良好的多功能性,尤其是它具有独特的优势,例如尺寸较小,体重轻,低能量,廉价价格,高可靠性,高可靠性,强大的反干扰能力和易于使用。因此,这使用微控制器作为此设计的核心组件。使用7段公共阳性作为显示设备。该设计旨在连接一个7段的公共阳性LED显示屏,以记录两支球队的得分。比赛完成后,按S2键1分。如果得分计算错误地计算,请按S3键为1点。在游戏结束时按键,以清除两支球队的记分板。 3.硬件电路设计89S51微控制器MCS-51微控制器是Inte在1980年在美国发射的产品。 8751。到目前为止,MCS-51核心系列兼容微控制器仍然是使用的主流产品。例如,当前流行的89S51文献甚至指MCS-51系列微控制器。 8051是早期最典型的代表性工作。 MCS-51微控制器具有深远的影响。许多公司已经推出了兼容的系列微控制器,也就是说,MCS-51内核实际上已成为8位微控制器的标准。其他公司的51个微控制器产品都是与MCS-51核心兼容的产品。同一程序在每个微控制器制造商的硬件上都有相同的结果,例如Atmel的89C51(停产),89S51,()和()和()等。我们经常称为89c51的89c51是指Atmel的89c51微控制器。同时,原始功能(例如时钟)都得到了增强。更好的是,原始的ROM(一次性写入)是由Flash提出的(程序内存的内容至少可以重写1000次),并且性能已经非常优于8051。但是,就市场化而言,PICCamp挑战了89C51。 89C51最致命的缺陷是它不支持ISP(在线更新程序)功能。必须添加诸如ISP功能之类的新功能,以更好地继续MCS-51的传说。在这种情况下,89S51取代了89C51。现在,89S51已成为实际应用市场上的新宠儿。作为第一个市场份额,Atmel现在已经停止生产,并将被取代。 89S51改善了其流程。 89S51采用了0.35的新过程,从而降低了成本并提高功能并提高竞争力。
/LS51微控制器是具有4KB在线课程编程闪存的低功率微控制器。它与通用80C51系列微控制器的命令系统和引脚兼容。片上闪光灯可以使用非易失性内存在线重编程或编程。他在一个芯片上集成了通用CPU和在线可编程Flash,以形成强大,灵活的使用且具有成本效益的微控制器。它具有以下特征: - 片上程序内存包含4KB的闪存,允许在线编程,并且严重性周期可以达到1000次; - 片上数据存储器包含128个字节RAM; -I/O端口具有32个可编程I/O线路; - 中断系统具有一个中断结构,具有6个中断源,5个端子向量和2个中断优先级; - 串行端口是一个完整的双重工业串行通信端口; - 带有两个数据指针DPTR0和DPTR1; - 通过节省模式和电源降低模式的低功耗电力节省模式; - 包括3级程序锁定位置; - 电源电压为4.0-5.5V-振荡器频率0-33MHz() - 带有片上的看门狗计时器; - 灵活的在线片上编程模式(字节和页面编程模式); - 电源关闭旗模式pof; 89S51与89C51相比,添加的新功能包括: - 添加了许多新功能,性能得到了极大的改进,价格基本保持不变,甚至低于89C51! -ISP在线编程功能。此功能的优点是,微控制器内存中的重写程序不需要从工作环境中剥离芯片。
https://img1.baidu.com/it/u=1898817219,3681500428&fm=253&fmt=JPEG&app=138&f=JPEG?w=552&h=500
这是一个功能强大且易于使用的功能。 - 最大工作频率为33MHz,极限工作频率的89C51为24m,这意味着S51的工作频率较高,因此具有更快的计算速度。 - 使用双工UART串行通道。 - 内部集成监管计时器不再需要像89C51那样连接到外部看门狗计时器单元电路。 - 双数据指标。 - 电源关闭标志。 - 一种全新的加密算法,使89S51的解密不可能,并且该计划的机密性得到了极大的增强,因此可以有效保护知识产权免受侵权。 - 兼容性:与所有51个单词系列产品兼容。例如,早期的MCS-51兼容产品,例如8051、89C51等。换句话说,教科书和在线教程中的所有程序(无论教科书中使用的微控制器是否是8051,89C51,MCS-51等),MCS-51等,仍然可以在89S51上的USUAL上运行,这是又称又称又称又是又称又有能力的。引脚布置和功能P0端口:P0端口是一个8位排水级的双向I/O端口,每个引脚都可以吸收8TTTL门电流。当P1端口的引脚首次写入1时,将其定义为高阻抗输入。 P0可用于外部程序数据存储器,可以将其定义为数据/地址的第八位。编程FIASH时,P0端口用作原始代码输入端口。当Fiash执行验证时,P0会输出原始代码,并且必须将P0的外部拉高。
P1端口:P1端口是一个8位双向I/O端口,内部提供了上拉电阻。 P1端口缓冲区可以接收并输出4TTL门电流。将P1端口引脚写入1后,将其内部拉到高高,可以用作输入。当将P1端口拉到外部低至低时,它将输出电流,这是由于内部拉力引起的。在Flash编程和验证期间,接收端口P1作为第八位地址。 P2端口:P2端口是带有内部上拉电阻器的8位双向I/O端口。 P2端口缓冲区可以接收并输出4个TTL门电流。当P2端口写入“ 1”时,其销钉将被内部上拉电阻向上拉,并用作输入。因此,当作为输入时,将P2端口的引脚向外拉到输出电流。这是由于内部上拉。当P2端口用于访问外部程序内存或16位地址外部数据存储器时,P2端口将输出地址的上八位。当给出地址“ 1”时,它会利用内部上拉优势,在读取和写入外部八位地址数据存储器时,P2端口会输出其特殊功能寄存器的内容。 P2端口在闪存编程和验证期间接收高八位位地址信号和控制信号。 P3端口:P3端口引脚是8个双向I/O端口,具有内部上拉电阻,可以接收并输出4 TTL门电流。当P3端口写入“ 1”时,将它们内部升至高并用作输入。作为输入,由于外部下拉为低,因此P3端口将由于上拉而输出电流(ILL)。 2)钥匙和时钟部分主要由三个部分组成:加上点按钮,减法按钮和重置按钮。
其中,S1是按钮,S2是加上按钮,而S3是点按钮。 4。软件设计的操作过程和工作过程在程序设计过程中起着重要的指导作用。因此,在软件设计之前,应首先分析乒乓球匹配得分手的工作原理。游戏开始时,首先确定哪个球队得分,并每次增加1分。如果您不小心添加了错误的点,请按键减去分量点。 S4控制得分。游戏启动后,首先按重置键清除现场分数,然后按S1切换添加或减数点的双方。根据对工作流程的上述分析,可以将软件设计分为以下模块:1。键盘扫描UINT8(void){uint8键; if((()== 0x0f)(0xff)(0xff); delay(10); delay(10); if(()= = = = 0x0f)(0x0f)(0xff)(0xff); key =; way; while()!显示函数void(void){uint8 num = 0; uint8 temp0,temp1,temp2,temp3,temp5,temp6,temp7; if(i == 1){temp0 = jifen; temp1 = xa; temp2 = xa/10; temp3 = da; temp5; temp5 = db; temp6 = xb; temp7 = xb/10; } if(i == 2){temp0 = jifen; temp1 = xa; temp2 = xa/10; temp3 = da; temp5; temp5 = db; temp6 = xb; temp7 = xb/10; } p2 = 0xff;(num){情况0:p0 = ; break; case 1:p0 = ; break; case 2:p0 = ; break; case 3:p0 = ; break; case 4:p0 = 0xf6 = 0xf6; case 5:case 5:p0 = ; 7:p0 = ; break;} p2 = ; num ++; if(num == 8)num = 0;} mainmain(){uint8 c; init(); while(1){c =(){case s1;(c){case s1:s_1() s_4(); break;}}} 4。延迟函数void delay(t){i,j; for(i = 0; it; i ++)for(j = 0; j113; j ++);} 5。其他程序void s_1(){i ++; if(i == 3)i = 1;} void s_2(){if(i == 1){xa = xa = xa+jifen;} if(i == 2) s_3(){if(i == 1){xa = xa-jifen;} if(i == 2){xb = xb-jifen;}}} void s_4(){if(i == 1){da = da+jifen; xa = 0; xb = 0;} if(i == 2){db = db = db+jifen; xb = 0; xa = 0;}} void Init(图表:5。安装和调试1。调试条件和方法:1)检查连接电路是否未打开。不要急于上台。首先,仔细检查接线是否正确,包括错误的电线,很少的电线和多个电线。
多线通常是由销钉时错误引起的,或者在更换接线时忘记卸下原始的旧电线。它们经常发生在实验中,在检查电线时很难找到。他们经常在调试期间给人们一个幻想,认为问题是由重要的部分引起的。为了避免做出错误的判断,通常使用两种电线搜索方法:一个是根据设计的电路图检查已安装的电路,并按照一定顺序在安装的电路中逐一检查电路图上的连接。此方法更容易找到错误行和几行。另一种方法是根据实际电路图比较电路示意图,并检查两个组件引脚的方向,以找出电路图上是否存在每个位置。此方法不仅可以找到误差线和很少的行,而且还可以检查是否有很多行。无论使用哪种方法检查电线,请确保标记电路图上搜索的电线,并检查每个组件使用的引脚数是否与图形匹配。搜索时,最好使用指针万用表的“ R×1”或数字万用表的“ X”。直观地检查电源,接地线和组件销之间是否有短路;连接线的接触是否差;二极管,晶体管,电解电容器等之间是否存在错误连接。集成电路是否相等。 2)打开电源并观察精确测得的电源电压。电源打开后,请勿急于测量数据和观察结果。首先,观察是否存在异常现象,包括是否存在烟雾,是否存在异常气味,手部模具元件是否热,电源中是否有短路等。
https://img2.baidu.com/it/u=1720233103,618403307&fm=253&fmt=JPEG&app=120&f=JPEG?w=889&h=500
然后测量每个组件引脚的电源电压,而不仅仅是测量每个通道的总电源电压以确保组件的正常运行。 3)块调试包括两个方面:测试和调整。测试是在安装后测量电路的参数和工作状态。调整是指根据测试纠正电路的参数以满足设计要求。为了使测试顺利进行,应在设计的电路图上标记每个点的潜在值,相应的波形和其他数据。有两种测试方法:第一个是使用安装和调试时安装和调试的方法,也就是说,根据示意图上的功能将复杂的电路分为块,逐渐扩大安装范围并根据块调试的基础进行调试,并最终完成整个机器的调试。该方法可以及时检测问题,因此这是一种常见方法,尤其是对于新设计的电路。另一种方法是安装整个电路并实现一次性调试。此方法适用于简单的电路或形成产品。块调试是根据其功能将电路分为不同的部分,每个部分都被视为模块。理想的调试程序是根据信号流动方向执行的,因此可以将之前调试的输出信号用作下一阶段的输入信号,以创建最终关节调试的条件。 4)在块调试过程中,调试范围逐渐扩大,因此实际上已经完成了一些本地调试工作。只要您进行每个功能块之间的接口电路调试,然后打开所有电路,就可以实现整个机器接头调试。整个机器关节调试只需要观察动态结果,即将各种测量仪器和系统本身提供的信息与设计指标进行比较,发现问题,然后进一步修改电路参数,直到它们完全满足设计要求。
:静态0-15MA;在动态扫描过程中,平均电流为4-5mA,峰值电流为50-60mA。2: PCB 3:list code name model and1R9-R164. chip 11. C1-C2chip chip -R8/R17200Ω8C11 470uF/chip-Q8 -LED2tube 212S1-S5触摸开关插座1附录4:详细的编程#。 char uint8; int;#s1 0x0e#s2 0x0d#s3 0x0b#s4 code [] = {0xc0,0xf9,0xa4,0xb0,0x99,0x99,0x92,0x82,0x5,0xf8,0x8,0x80,0x80,0x90,0x90,0xbf,0xbf,0xf,0xf,0xf,0xff6,0xff} ffe {0xff} ffe}; uints; uints; uints; uint; uint; uint; uint; uint; uint; uint; uint; uint; uint; uint; uint; uint; uint; uint; uint; uint] 0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uint8 da = 0,xa = 0,db = 0,xb = 0,i = 1,jifen = 1,jifen = 1; void delay(t){i,j; for(i = 0; i = 0; i = 0; i++)for(i = 0; i++) num = 0; uint8 temp0,temp1,temp2,temp3,temp5,temp6,temp7;如果(i == 1){temp0 = jifen; temp1 = xa; temp2 = xa/10; temp3 = da; temp5 = db; temp6 = xb; temp7 = xb/10;} if(i == 2) xb; temp7 = xb/10; } p2 = 0xff;(num){情况0:p0 = ; break; case 1:p0 = ; break; case 2:p0 = ; break; case 3:p0 = ; break; case 4:p0 = 0xf6 = 0xf6; case 5:case 5:p0 = ; 7:p0 = ; break;} p2 = ; num ++; if(num == 8)num = 0;} uint8(void){uint8 key; if(()== 0x0f)(0xff)(0xff)(0xff); delay(10); 10; if(()= = = = = = = = 0x0f)(0x0f)(0x0f)(0x0f); key = eke = nee = 0.0; s_1(){i ++; if(i == 3)i = 1;} void s_2(){if(i == 1){xa = xa+jifen;} if(i == 2){xb = xb = xb+jifen;}}}} void s_3(){if(i == 1){xa = xa-jifen;} if(i == 2){xb = xb-jifen;}} void S_4(){if(i == 1){ da = da+jifen; xa = 0; xb = 0;} if(i == 2){db = db+jifen; xb = 0; xa = 0;}} void init(){tmod = 0x01; th0 = 0xf8; th0 = 0xf8; tl0; tl0 = 0x30; tr0 = 1; tr0; tr0; tr0; tr0; ie = 0x82; c; init(); while(1){c =();(c){case s1:s_1(
页:
[1]