单片机七人表决器
一. 方案设计
1. 设计题目:七人表决器。
2. 实训要求
利用AT89S51单片机设计并制作会议表决计票器电路。具体要求如下:
1、可供57个人进行表决,每个人有一个“同意”和一个“反对”按键,表决时两个键先按下的一个有效,若再按另一个键将清楚前一次按键的效能;每次表决每个按键只能是第一次按的有效,多按的次数无效,除非前一次按键的效能已被清楚或没有生效。
2、会议主持人可利用按键控制表决开始和结束;开始表决后,点亮黄色指示灯,表示可以进行表决,同时清楚原来的表决结果;结束表决后显示表决结果;“同意”多于“反对”点亮绿色指示灯,反之点亮红色指示灯。
3、在实现上述功能的基础上增加“同意”数和“反对”数的显示。
二.硬件电路设计和原理。
1. 硬件设计思路:
设计题目为5—7人表决器,题目选为七人表决器,七个按键表示同意,七个按键表示反对,各按键与单片机的输入端口相连,因此可选用单片机的四个I/O口,因为在单片机内部P1和P2都有上啦电阻,而P0没有上啦电阻,要在外部加上一个上拉电阻,为了简化电路,把P1和P2口选为按键同意和反对的输入端,因为表决考试和结束要
利用主持人按键来控制,我采用外部中断0和外部中断一来控制其开始和结束;设计要求中需要四张灯,分别为2个红灯,一个黄灯,一个绿灯,其中三个灯用于输出显示,可用单片机的I/O口,另外一个红灯作为电源灯来显示,判断是否通电,因为P1口和P2口用做按键的同意和反对,把P2剩余的I/O口与三个灯连接,分别连接在P2.3,P2.4,P2.5口,因为P0口是低电平有效所以我的P0口与LED 现实器相连用于显示反对与同意的人数的多少,采用动态显示的方式,为了保证两个显示器不再相同时间显示相同的数字,所以LED 显示器的公共端受另外一组信号的控制,采用延时的方式让它们分别显示出来。
2. 元件参数确定:
设计中需要四盏灯,分别为两个红灯,一个绿灯,一个黄灯,P0口的输出端输出高电平一般为5伏左右,最大电流为五毫安,因此必须加上限流电阻,我选用的是470欧的电阻,然后将单片机的最小系统加入此次的电路中。
3. 元件清单:
14个开关用于7人同意与反对按键,另外两个开关用做控制投票开始和结束的总开关。
电容:用于单片机的最小系统。
发光二极管:用于表示投票开始与结束,和最后同意与反对票数的对比情况。
电阻:用于限流。
单片机8051芯片:用于编程。
电源接头:提供电源。
LED 显示器:用于显示投票中同意与反对票数的多少。
4. 电路工作原理简述。
当主持人按下开始键,外部中断0响应后,黄灯亮起,到外部中断服务程序,开始进行投票,7人开始表决,7个人分别按下同意或反对,然后有团建来处理和分析“同意”和“反对”的人数的多少,当主持人按下结束键时,停止投票。当最后结果“同意”人数多于“反对”人数时,亮起绿灯,当最后结果“同意”人数少于“反对”人数时,亮起红灯,把其最后的结果显示在两个LED 显示器上面,最终达到设计的基本目标。
5. 电路工作原理图:
6. 电路实物图:
三.内容
1. 软件设计思路:
1). 软件初始化:
根据硬件开关与显示灯的接法对单片机进行初始值的设计,因为是低电平有效,故初始化设置为高电平有效。
2. )模块设计思路与各模块之间的联系:
用查询的方式来看按键是否被按下,若按下,点亮黄灯,开始表决,若同意或反对就在其对应的寄存器中自加一,知道总开关呢按键结束后,在比较其大小,并把最后结果存放在LED 显示器当中。
2. 软件总体功能:
1) 用于检测开始键是否被按下,按下时表决器才有用才开始表决。
2) 开始表决后循环检测对应的同意和反对是否被按下,并统计其同意总数和反对总数。
3) 等待中断若结束按键被按下,在中断处理中比较,并点亮相应的显示灯。
4) 把同意的票数和反对的票数分别显示在LED 显示器上。
3. 程序:
ORG 0000H
AJMP MAIN
ORG 0003H
SETB F0
SETB TR0
RETI
ORG 000BH
AJMP INTT0
ORG 001BH
AJMP INTT1
ORG 0030H
MAIN: MOV SP,#60H
MOV TMOD,#11H
MOV TL0,#0B0H
MOV TH0,#03CH
MOV R1,#20
MOV R2,#5
CLR P3.0
SETB EA
SETB ET0
SETB EX0
SETB IT0
INDEX:MOV A,P1
ANL A,#0FH
MOV 28H,A
LCALL DELAY
MOV A,P1
ANL A,#0FH
CJNE A,28H,RETURN
KEY: CJNE A,#0EH,KEY2
CLR P1.0
JB F0,DD
SETB P3.0
LCALL SIXUNHUAN
DD: LCALL AST
KEY2: CJNE A, #0DH,KEY3
CLR P1.1
JB F0,DD1
SETB P3.0;
LCALL SIXUNHUAN
DD1: LCALL AST
KEY3: CJNE A,#0BH,KEY4
CLR P1.2
JB F0,DD2
SETB P3.0
LCALL SIXUNHUAN
DD2: LCALL AST
KEY4: CJNE A,#07H,KEY5
CLR P1.3
JB F0,DD3
SETB P3.0
LCALL SIXUNHUAN
DD3: LCALL AST
KEY5: CJNE A, #0DH,KEY6
CLR P1.4
JB F0,DD4
SETB P3.0;
LCALL SIXUNHUAN
DD4: LCALL AST
KEY6: CJNE A, #0DH,KEY7
CLR P1.5
JB F0,DD5
SETB P3.0;
LCALL SIXUNHUAN
DD5: LCALL AST
KEY7: CJNE A, #0DH, RETURN
CLR P1.6
JB F0,DD6
SETB P3.0;
LCALL SIXUNHUAN
DD6: LCALL AST
RETURN:NOP
AJMP INDEX
DELAY:MOV R6,#13
DELAY1:MOV R5,#250;250
DELAY2:NOP
DJNZ R5,DELAY2
DJNZ R6,DELAY1
RET
AST: CLR ET0
SETB ET1
MOV TL1,#0E0H
MOV TH1,#03CH
SETB TR1
MOV R4,#20
MOV R3,#9
AJMP $
SIXUNHUAN:CLR EA
SJMP $
INTT0:MOV TL0,#0B0H
MOV TH0,#03CH
DJNZ R1,LOOP1
MOV R1,#20
DJNZ R2,LOOP2
MOV A,#0
MOV DPTR,#TBB
MOVC A,@A+DPTR
MOV P2,A
CLR EA
SJMP $
LOOP2:MOV A,R2
MOV DPTR,#TBB
MOVC A,@A+DPTR
MOV P2,A
LOOP1:RETI
INTT1:MOV TL1,#0B0H
MOV TH1,#03CH
DJNZ R4,LOOP4
MOV R4,#20
DJNZ R3,LOOP
MOV A,#0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
CLR EA
SJMP $
LOOP: MOV A,R3
MOV DPTR,#TBB
MOVC A,@A+DPTR
MOV P2,A
LOOP4:RETI
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH DB 77H,7CH,39H,5EH,79H,71H
END
四. 心得体会
课程设计,我认为最重要的就是做好设计的预习,认真的研究老师给的题目,老师对实验的讲解要一丝不苟的去听去想。要重视程序的模块化,修改的方便,也要注重程序的调试,掌握其方法。硬件的设计跟焊接都要我们自己动手去焊,软件的编程也要我们不断的调试,最终一个能完成课程设计的劳动成果出来了。
在实训过程中, 也暴露了许多问题. 不够细心焊错了线,由于对课本理论的不熟悉导致编程出现错误等等. 但我们必须有有足够的挑战困难的勇气.
通过这两周的实训,我学习到了很多从前没有接触过的知识,使我眼界打开,感受颇深。基本的动手能力是一切工作和创造的基础和必要条件。
通过实训,同学们的友谊也增进了不少,很多不太懂的地方在同学们的帮助下完成了。
我们兢兢业业的老师,他们也顶着酷热和我们一起忙活,看着围在他身边的那一圈圈的人,他也总会耐心的为我们讲解,直到我们听懂为止。
最后我希望我们班能在以后的生活、学习中表现得更出色,更团结。老师们能够笑脸常开,万事如意!