当前位置:文档之家› 打靶系统接口课程设计报告-刘树伟

打靶系统接口课程设计报告-刘树伟

接口课程设计报告说明书-模拟打靶系统班级:计算机0206班姓名:刘树伟学号:012002013810一.课程设计题目:模拟打靶系统二.题目要求:由一个主控机监控和若干下位机组成,主控机负责数据处理下位机负责访问接口。

既是:下位机上传打靶环数,主控机存储打靶环数并统计。

三.课程设计要求:掌握接口硬件开发平台的使用方法,利用现有的实验平台和PC机,组成一个微机模拟应用系统;掌握基本接口电路的综合应用;掌握接口电路的驱动程序和界面软件的设计与编制,学会调试与测试件的一般方法;理解微机接口技术及接口芯片的综合应用。

四.设计思想:1.功能过程描述:用八位开关模拟打靶状况和打靶环数,8255A口接收打靶信息,8251读出A口信息并上传给主控机。

下位机8251接收上行机8251传过来数据,储存并处理,打靶计数结束后返回总环数。

下位机如果继续打靶,重新计数;如果结束停止打靶,主控机等待选择打靶是否结束的信号,结束信号来了就退出打靶程序。

⒉系统接口框图:五.程序流程:一)文字描述:1.初始化各个芯片,同时进行画靶程序,下行机显示一个圆靶。

2.8位开关的最高位的变化来代表是否进行打靶,不变则没有打靶。

改变后就有打靶并将低位数据送往上行机。

环数超过10环计为0(代表脱靶)。

3.每次打靶的结果显示在靶上。

4.上行机接收到靶数后存储处理并显示在上行机屏幕上。

5.打靶十次后下行机询问打靶者是否继续。

如继续则重新进行打靶计数,若退出则发送一个255给上行机(相当于11111111B),这时,上行机显示出下行机已退出打靶,讯问是否结束,选择结束则程序退出。

二)流程图:1.下行机框图:2.主控机程序框图六.源程序:1.下行机部分:#include <conio.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#include <dos.h>#include <graphics.h>#define data51 0x308 /*8251数据口*/#define ctrl51 0x309 /*8251命令/状态口*/#define dataa55 0x300 /*8255数据A口*/#define datab55 0x301 /*8255数据B口*/#define datac55 0x302 /*8255数据C口*/#define ctrl55 0x303 /*8255命令口*/void int51();void int55();int send(int,int);void main(){ /*图形变量初始化*/int temp,temp2,total,count=0;int data,x0,y0,c=0;double ab,r,x,y;float e;int graphdriver=VGA,graphmode=VGAHI;int flag=0x00;int51();int55();/*struct fillsettingstype save;*/initgraph(&graphdriver,&graphmode," ");/*getfillsettings(&save);*/ /*得到初始化时填充模式*/ setbkcolor(EGA_BLUE);cleardevice();setcolor(12);circle(320,220,30); /*画靶*/circle(320,220,45);circle(320,220,60);circle(320,220,75);circle(320,220,90);circle(320,220,105);circle(320,220,120);circle(320,220,135);circle(320,220,150);circle(320,220,165);while(1){dotemp=inportb(datab55);while(flag==(temp&0x80)); /*当从8255b口读出的数据最高位改变时,跳出循环*/if(flag==0) { /*将标志flag改变*/flag=0x80;}else flag=0x00;data=temp&0x7f; /*将数据的最高位置0*/if(data>10) data=0;count++;c=c+19;e=c%100;e=e/100;if(data==0){;}else{r=(10-data)*15+22;x=r*e;ab=r*r-x*x;y=sqrt(ab);if(e>0.5){ /*随机决定点x0坐标的区间*/x0=320+x;}else x0=320-x;if(e>0.5){ /*随机决定点y0坐标的区间*/y0=220+y;}else y0=220-y;setcolor(15);circle(x0,y0,6);}/*转入发送程序*/total=send(data,count);if(count==10){/*getch();*/closegraph();count=0;flag=0x00;printf("\n**********************************************************");printf("\n ***************Welcome to our shooting game!********************");printf("\n**********************************************************");printf("\n*********************************************************************** **"); /*显示欢迎信息*/printf("\nyou have shot %d",total);printf("\npress anykey to restart");printf("\npress 2 to exit\n");scanf("%d",&temp2);if(temp2==2){count=send(0xff,0);break;}clrscr();/*struct fillsettingstype save;*/initgraph(&graphdriver,&graphmode," ");/*getfillsettings(&save);*/ /*得到初始化时填充模式*/setbkcolor(EGA_BLUE);cleardevice();setcolor(EGA_GREEN);circle(320,220,30);setcolor(12);circle(320,220,45);circle(320,220,60);circle(320,220,75);circle(320,220,90);circle(320,220,105);circle(320,220,120);circle(320,220,135);circle(320,220,150);circle(320,220,165);}}}int send(int data,int count){int status,rletter;dostatus=inportb(ctrl51); /*获取8251 TXRDY 状态*/while((status&0x01)==0); /*已准备好,则将数据发送出去*/outportb(data51,data);if(count==10){dostatus=inportb(ctrl51);/*已准备好,即有数据传送过来,则接收1个字符*/ while((status&0x02)==0);rletter=inportb(data51);return rletter;}else return 0;}void int51() /*8251初始化程序*/{outportb(ctrl51,0x00);delay(100);outportb(ctrl51,0x40);/*8251复位*/delay(100);outportb(ctrl51,0x4e);/*8251A方式命令*/delay(100);outportb(ctrl51,0x27);/*8251A工作命令*/}void int55(){ /*8255初始化程序*/outportb(ctrl55,0x92);}2.上行机部分:#include<stdio.h>#include<conio.h>#include<dos.h>#define data51 0x308 /*8251数据口*/#define ctrl51 0x309 /*8251命令/状态口*/#define dataa55 0x300 /*8255数据A口*/#define datab55 0x301 /*8255数据B口*/#define datac55 0x302 /*8255数据C口*/#define ctrl55 0x303 /*8255命令口*/#define COUNT 10 /*每局打靶的次数*/void int51()/*初始化函数*/{outportb(ctrl51,0x00);/*空操作*/delay(100);outportb(ctrl51,0x40);/*8251复位*/delay(100);outportb(ctrl51,0x4e);/*8251A方式命令*/delay(100);outportb(ctrl51,0x27);/*8251A工作命令*/}void main(void){int a[COUNT];int j;int b=0;int e;int i=0;int status;int temp;int51();printf(" **************************************\n\r ");printf(" * THE SHOOTING SYSTEM *\n\r ");printf(" * ver1.0 cz xn zm lsw *\n\r ");printf(" ********************************\n\r ");for(;;)/*总循环*/{if(i==COUNT){ /*如果一局打完输出此局各次的成绩和总成绩*/for(j=0;j<COUNT;j++){b+=a[j];}printf("\n***************************************");printf("\nYour total score is :%d",b);i=0;dostatus=inportb(ctrl51);/*获取8251 TXRDY 状态*/while((status&0x01)==0);/*已准备好,则将键入的字符发送出去*/outportb(0x308,b);b=0;for(j=0;j<COUNT;j++) /*将各元素的值清零*/a[j]=0;}dostatus=inportb(0x309);/*检测8251状态,若有数据传送过来,则接收1个字符*/while((status&0x02)==0);a[i++]=inportb(0x308);printf("\nThe score of your %dth %d",i,a[i-1]);if(a[i-1]==255){clrscr();printf("\nIf you want to EXIT:press Esc!\nCONTINUE:press any key!");if((e=getche())==0x1b)/*是ESC?是,则退出,并返回DOS*/break;}}}七.运行结果1.下行机显示圆靶和环数2.上行机显示统计资料八.心得体会:这次接口课程设计是四人合作而成的,我们既合起来讨论过程序如何实现的问题,也分工自己干自己的部分。

相关主题