51单片机模拟智能物料搬运控制显示系统及答案.doc
《51单片机模拟智能物料搬运控制显示系统及答案.doc》由会员分享,可在线阅读,更多相关《51单片机模拟智能物料搬运控制显示系统及答案.doc(10页珍藏版)》请在冰豆网上搜索。
![51单片机模拟智能物料搬运控制显示系统及答案.doc](https://file1.bdocx.com/fileroot1/2022-10/30/0747b95f-7e30-409d-8dca-617c057665dc/0747b95f-7e30-409d-8dca-617c057665dc1.gif)
单片机模拟智能物料搬运控制显示系统
总体要求:
请你在三小时(180分钟)内完成
1.请你仔细阅读并理解模拟智能物料搬运显示与控制系统的控制要求和有关说明根据你的理解,选择你所需要的控制模块和元器件。
2.在赛场提供的图纸上,画出模拟智能物料搬运显示与控制系统的模块接线图,并在纸的右下角填写你的竞赛工位号。
3.请你编写模拟智能物料搬运控制系统的控制程序,存放在F盘中以工位号命名的文件夹内。
4.请调试你编写的程序,检测和调整有关元器件设置,完成模拟智能物料搬运显示与控制系统的整体调试,使该智能物料搬运控制系统能实现规定的控制要求,并将相关程序“烧入”单片机中。
操作面板
一、指示灯
状态指示灯由八个发光二极管组成,灯的排序是从实验板的左端到右端,依次为灯1到灯8。
1、灯1,系统运行指示灯,通电后,灯1一直以1Hz的频率闪烁。
2、灯2,为设置灯,在设置状态下,灯2一直亮着,退出设置后,灯2灭。
3、灯3,为在设置状态下加球灯,按一下加球键灯亮一下
4、灯4,为在设置状态下减球灯,按一下减球键灯亮一下
5、灯5—灯8,为时钟灯,当上电时灯5到灯8全灭,同时数码管显示“00.00”,表示“0分0秒”。
当时钟走一秒时,显示“00.01”时仅时钟灯5亮;显示“00.02”时仅时钟灯6亮;显示“00.03”时仅时钟灯7亮;显示“00.04”时仅时钟灯8亮;显示“00.05”时又返回仅时钟灯5亮,按照这个规律流水下去,且当小数点后的数等于60的时候,前面的数字加1,后面的数字归零,及显示“00.59”后的下一秒显示“01.00”,并且时钟灯全灭,如此循环下去。
6、当进入,机械手模拟抓球状态下,也就是系统运行时,4个时钟灯全亮。
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
#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 for(j=0;j<120;j++);
}
voidspker(unsignedcharx1)
{
unsignedchari;
for(i=0;i {
SPK=1;delay(500);
SPK=0;delay(500);
}
}
voidkeyscan(void)
{
unsignedcharstat=0;
if(SETKEY==0)
{
delay(20);
stat=1;
LED2=0;
while(SETKEY==0);
}
if(RUNKEY==0)
{
delay(20);
stat=2;
while(RUNKEY==0);
}
if(STOPKEY==0)
{
delay(20);
stat=3;
LED5=LED6=LED7=LED8=1;
while(STOPKEY==0);
}
if(PARKEY==0)
{
delay(20);
stat=4;
LED5=LED6=LED7=LED8=1;
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;break;}
case2:
{LED7=0;LED6=1;break;}
case3:
{LED8=0;LED7=1;break;}
case4:
{LED5=0;LED8=1;h=1;break;}
}
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)
{
LED2=0;
if(ADDKEY==0)
{
delay(20);
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(stat==1)
{
if(SUBKEY==0)
{
delay(20);
while(SUBKEY==0)
LED4=0;
delay(500);
num=(num>0)?
num-1:
99;
LED4=1;
}
}
if(stat==2)
{
LED8=LED5=LED6=LED7=0;
if(SUBKEY==0)
{
delay(20);
spker
(1);
num=(num>0)?
num-1:
0;
}
}
disp1[3]=TAB[num/10];
disp1[2]=TAB[num%10]+0x80;
disp1[1]=TAB[num/10];
disp1[0]=TAB[num&10];
}
voidmain(void)
{
unsignedchari;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x87;
TR0=1;
LED1=0;
while
(1)
{
if(stat==0)
{
for(i=0;i<4;i++)
{
SEG=disp[3-i];
P1=i;
delay(4);
}
}
if(stat==1||stat==2)
{
for(i=0;i<4;i++)
{
SEG=disp1[3-i];
P1=i;
delay(4);
}
}
keyscan();
}
}
10