51单片机模拟智能物料搬运控制显示系统及答案Word下载.doc
《51单片机模拟智能物料搬运控制显示系统及答案Word下载.doc》由会员分享,可在线阅读,更多相关《51单片机模拟智能物料搬运控制显示系统及答案Word下载.doc(10页珍藏版)》请在冰豆网上搜索。
7、当进入,系统暂停状态下,4个时钟灯以2hz频率亮灭闪烁。
8、当进入,系统停止状态下,4个时钟灯全灭。
二、按键
键盘接口由6个独立按键组成,按键的排序是从实验板的左端到右端,依次为按键1到按键6
1、按键1,设置键
2、按键2,“+”球键
3、按键3,“-”球键/模拟机械手抓球键
4、按键4,系统暂停键
5、按键5,系统停止键
6、按键6,系统运行键
三、显示
由四位数码管组成,用来实现左右不同功能的显示。
1、在单片机上电后,四位数码管显示时钟,前两位显示分钟,后两位显示秒。
目的是记录系统开启后到运行这段期间的时间。
2、当系统运行后不再显示时钟,前两位显示之前预设的抓球数,也就是说预设加球只能设置到99个。
在抓球的过程(也就是按键3第二功能,每按一下为抓一个球)中,后两位显示当前剩余的抓球数直至“00”。
四、蜂鸣器指示
1.系统上电蜂鸣器长鸣两声。
2.蜂鸣器一声长鸣(0.3秒)指示抓球成功。
(三)系统控制要求
1、初始设置
(1)系统上电后,数码管显示为“00.00”
(2)灯5到灯8全灭
(3)灯1以1Hz的频率闪烁
(4)灯2,灯3熄灭
(5)预置抓球总数:
按下“设置”键,先按“+”键使预置抓球总数加1,之后每按一次“+”键”或“-”键,预置抓球总数便可加1或减1,要求预置总数在左边两位数码管显示,同时右边的两位数码管与左边的两位数码管显示一样的数据。
(6)要求预置抓球总数为10(及系统上电默认的抓球总数)。
2、系统运行
按“运行”键启动系统运行、数码管左边二位显示抓球总数,右边两位显示剩余的抓球数。
同时“+”键“-”键和“设置”键按失效。
运行过程为:
(1)按下按键3表示机械手抓到球并放球成功,蜂鸣器长鸣一声。
此时数码管右边二位显示当前剩余球数,即:
每放一个球,剩余抓球数便减1。
(2)重复上述步骤,直到抓完10个球,剩余抓球数显示为“00”,系统自动停止运行。
3、系统工作过程中,按“停止”键可立即结束系统运行,四位数码管显示熄灭。
4、系统运行中间,任意时刻按“暂停”键都可以暂停系统工作,数码管显示数据不变,并且4个时钟灯以2Hz频率亮灭闪烁;
当重按“运行”键时,系统能从暂停前状态继续运行,并且4个时钟灯全亮表示系统在运行状态。
注意:
系统上电按一下设置键,才能进入设置状态,才可以加减预设球数,同时数码管前两位显示“10”,后两位显示“10”,此时时钟暂停不显示;
按一下按键2,加一,显示变为“11.11”;
如果按键3,这两边的数字减一,显示变为“09.09”。
在按一下设置键,退出设置状态,加减键失灵,并且显示时钟,时钟继续走。
参考程序(C语言)
#include<
reg52.h>
#defineSEGP2
sbitSETKEY=P3^0;
sbitPARKEY=P3^1;
sbitADDKEY=P3^2;
sbitSUBKEY=P3^3;
sbitSTOPKEY=P3^5;
sbitRUNKEY=P3^6;
sbitSPK=P3^7;
sbitLED1=P0^0;
sbitLED2=P0^1;
sbitLED3=P0^2;
sbitLED4=P0^3;
sbitLED5=P0^4;
sbitLED6=P0^5;
sbitLED7=P0^6;
sbitLED8=P0^7;
unsignedcharTAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedchardisp[4]={0xc0,0xf9,0xc0,0xf9};
unsignedchardisp1[4]={0xc0,0xf9,0xc0,0xf9};
unsignedcharnum=10,stat=0;
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;
i<
x;
i++)
for(j=0;
j<
120;
j++);
}
voidspker(unsignedcharx1)
unsignedchari;
for(i=0;
x1;
SPK=1;
delay(500);
SPK=0;
voidkeyscan(void)
unsignedcharstat=0;
if(SETKEY==0)
delay(20);
stat=1;
LED2=0;
while(SETKEY==0);
if(RUNKEY==0)
stat=2;
while(RUNKEY==0);
if(STOPKEY==0)
stat=3;
LED5=LED6=LED7=LED8=1;
while(STOPKEY==0);
if(PARKEY==0)
stat=4;
while(PARKEY==0);
voidTMER0_INT(void)interrupt1
staticunsignedcharflag=0,seconds=0,min=0,h=0,k=0,stat=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(flag++==20)
flag=0;
LED1=~LED1;
if(stat==0)
{
h++;
switch(h-1)
{case0:
{LED5=0;
LED8=1;
break;
case1:
{LED6=0;
LED5=1;
}
case2:
{LED7=0;
LED6=1;
case3:
{LED8=0;
LED7=1;
case4:
{LED5=0;
h=1;
if(seconds++==60)
{
seconds=0;
min++;
disp[0]=TAB[seconds%10];
disp[1]=TAB[seconds/10];
disp[2]=TAB[seconds%10]+0x80;
disp[3]=TAB[seconds/10];
if(stat==3)
if(k++==2)
k=0;
LED5=LED6=LED7=LED8=~LED5;
voidINT_INT0(void)
interrupt0
if(stat==1)
{
if(ADDKEY==0)
while(ADDKEY==0);
LED3=0;
delay(500);
num=(num<
100)?
num+1:
0;
LED3=1;
disp[2]=TAB[num%10]+0x80;
disp[1]=TAB[num/10];
disp[0]=TAB[num&
10];
disp[3]=TAB[num/10];
}
voidINT_INT1(void)
if(SUBKEY==0)
while(SUBKEY==0)
LED4=0;
num=(num>
0)?
num-1:
99;
LED4=1;
if(stat==2)
LED8=LED5=LED6=LED7=0;
spker
(1);
disp1[3]=TAB[num/10];
disp1[2]=TAB[num%10]+0x80;
disp1[1]=TAB[num/10];
disp1[0]=TAB[num&
voidmain(void)
unsignedchari;
TMOD=0x01;
IE=0x87;
TR0=1;
LED1=0;
while
(1)
for(i=0;
4;
SEG=disp[3-i];
P1=i;
delay(4);
if(stat==1||stat==2)
SEG=disp1[3-i];
keyscan();
}
10