1、01007019 张鹏 接口课程设计报告 -公司职员点到系统 计算机0205班 张鹏 012002007019一 绪论本系统利用接口电路实现公司职员点到系统的功能。一个公司有一台总控机(本系统中的上位机),上面存储有整个公司职员的信息,其中包括出勤记录。在总控机平台上可以实现对职员数据库的各种操作,比如添加,删除,修改,查询等。有若干台分机(本系统中的下位机),分散在公司各个不同的地理位置。分机与一些外部设备相连,这些外部设备可以是职员卡识别设备,也可以是职员指纹识别设备等。外部设备实现对职员标识的录入,通过分机汇总到总控机。总控机作出相应的处理后,控制分机对外设发出指示,使外设做出相应的声或
2、光反应,以通知职员点到成功或者失败。在这次课设中,以拨码开关模拟职员卡识别设备,或职员指纹识别设备。以信号灯模拟外设的声光设备。上位机存储公司职员信息,下位机从接口电路传送职员点到或离开的信号数据给上位机,上位机查询职员信息,若存在此职员,记录他的出勤情况,并通知下位机,下位机控制接口电路输出相应信号到信号灯;若不存在此职员上位机通知下位机输出相应的出错信息。 另外,上位机具有添加删除显示职员相关信息的丰富的菜单功能和各种状态显示功能。二 设计内容1 硬件连接(接口电路的设计),其中上位机所连的8255控制主机通信程序启停的为C口的pc2。见程序staff_main( )。2 程序设计之通信程
3、序波特率均设为2400b/s,以查询方式进行全双工串行通信。主要是对8251进行编程,上位机中与通信有关的函数如下void int51(); 初始化8251a;void set_bps(int); 8253-5记数初值计算与装入;int staff_main(); 主管上位机与下位机双工通信。下位机与通信有关的程序如下:void int51(); 初始化8251a;void set_bps(int); 8253-5记数初值计算与装入;主函数 主管上位机与下位机双工通信。3 程序设计之接口访问程序对8251的访问见通信程序。下面的程序主要是对两片8255芯片进行编程:上位机:sletter=in
4、portb(0x300); if(sletter&0x7f)=0) outport(ctrl55,0x0c);/* 关闭8253 */ getch(); /*当与下位机相连的8255 pc7 置为0时*/return 0; /*则退出界面程序*/ 下位机: void alarm(int p) int i=0;while(i!=10) if(i%2!=0) outportb(0x302,0xff); delay(p); else outportb(0x302,0x7f); delay(p); i+; /*根据时间值p的大小,决定信号灯闪的急缓。*/此外,在主函数中, if(inportb(0x3
5、02)&0x01)=0) sletter=inportb(0x300); /*从a口读数据*/.4 主控机删除,添加,修改,查询等职员信息管理程序:数据结构:struct pchar present_time30;struct p *next; 每名职员的出勤记录struct SSint staff_id;char staff_name30;struct p *header;staff127; 127名职员; void init_staff(); 初始化struct SS staff127 结构数组void add_staff(); 添加职员;void showpresent(int); 显示
6、职员号为i的职员的出勤记录; int is_not(int) 判断从下位机得到的职员号对应的职员是否存在;void show(); 显示所有职员信息和某一个职员的出勤记录;void delete_staff(); 删除职员;void set_staff(); 在初始时,添加若干原始的职员信息;void insert(int,int,int ); 插入从下位机得到的某职员的出勤信息;int contrl(int,int); 对void insert(int rdata,int i,int local) 进行封装;5 界面程序: int init(); 初始化屏显鼠标环境;int read();
7、读取鼠标位置;void cursor(), 绘制光标;void newxy(); 对光标实时刷新;int get_key(); 读取键盘动作;int get_item(int,int); 识别键盘动作,转化为菜单选择;void Mouse() 识别鼠标动作,转化为菜单选择和相关命令。main()函数中先初始化设备驱动,再屏显界面及菜单。围绕个菜单功能分别调用相关函数,实现了上位机的功能(见功能描述)。界面描述:左边大块区域为操作向导和结果显示区;右上角为菜单区;右下角为工作区,显示上下位机的通信状态,正在点到的职员姓名和点到时间。界面测试:在main()函数中 ,将有两行星号处按注释修改,即在
8、没有接口电路的情况下,可以实现菜单的功能。6 系统操作方法:按接口电路图连好线以后,运行上位机,下位机程序,将与上位机相连的8255的pc2置为1,下位机的8255的pA低6位为职员号位,高两位置为1拨拨码开关输入职员号,两职员号输入的间隙必须将高两位中的一位置为0,断开通信通道,以得到正确的输入。界面可以用键盘,亦可用鼠标,但暂时没实现快捷键。键盘上的方向键可控制菜单的选择,当选择第一个菜单时,则使用鼠标,同时键盘不可用;鼠标每点击一次菜单,则最好再点击一次Clean菜单,若退出鼠标操作,点击Quite菜单即可返回键盘菜单操作。在添加职员信息时,必须将职员名字写完以后,再加按Ctrl-A。三
9、 实施步骤及分工确定好设计题目后,第一步调试上位机与下位机的全双工通信。第二步实现上位机对职员信息的管理功能。第三步做好界面,将各函数嵌套到界面程序中。第四步调试整个系统。因为分工合作,所以这四步不一定按时间顺序实现。同组为周慧娇,李怡林,詹尧天,分工如下:周慧娇与李怡林共同负责双机通信,系统完工后,负责了“白箱测试”。詹尧天负责部分上位机职员信息管理函数以及下位机对外设(信号灯)的访问。我做的工作有:选题,确定接口电路,界面编写,各函数的整合,还有与他组员一起调试,DEBUG。四 程序清单:上位机程序: #include#include#include#include#include#def
10、ine TRUE 1#define FALSE 0#define KB_S_N_DOWN 80#define KB_S_N_UP 72#define KB_S_N_ENTER 28#define PopWindow 8#define WindowMinX 0#define WindowMinY 0#define WindowMaxX 639#define WindowMaxY 479#include /* kbhit(); */#include /* printf(); */#include /* delay(); */#include #include #include #include #
11、define data51 0x308 /* 8251A数据口 */#define ctrl51 0x309 /* 8251A命令/状态口 */#define ctrl55 0x303 /* 8255命令口 */#define timer2 0x306 /* 8253的2号计数器端口 */#define timctl 0x307 /* 8253命令口 */#define factor 16 /* 波特率因子16 */unsigned long int clk = 1193182;/* 8251输入时钟频率(十六进制表示) */* 定时常数数组 */char str30;struct timeb
12、 *time_b;long time_long;int ff1;int ff;int balala=0; /*ff1,ff,balala为一些控制变量*/struct pchar present_time30;struct p *next; /*职员出勤信息*/struct SSint staff_id;char staff_name30;struct p *header;staff127; /*公司职员信息*/void int51(); /* 初始化8251a */void set_bps(int bps); /* 8253-5记数初值计算与装入 */void getstr() int ii
13、; for(ii=0;ii30;ii+) if(int)(strii=getch()=1)break; /*得到以Ctrl-A结束的字符串*/ strii=0; void data_to_str(int i) str0=(i/100+0x30);str1=(i%100)/10+0x30);str2= (i%10) +0x30); str3=0;void init_staff() int i; for(i=0;i127;i+) staffi.staff_id=-1; /*职员不存在 id=-1 */ if(!staffi.header) staffi.header=(struct p *)mal
14、loc(sizeof(struct p); int is_not(int rdata) /*判断职员存在吗*/ if(staffrdata.staff_id=-1)return -1; else return 1;void add_staff() int i=0,j; str0=0; while(i127) outtextxy(100,100, the members are full!); else outtextxy(100,100,The new staffs id is ); data_to_str( i) ; outtextxy(250,100,str); outtextxy(100
15、,130,now,input the name:); getstr(); outtextxy(250,130,str); staffi.staff_id=i; /*分配一个空职员号*/ strcpy(staffi.staff_name,str); void showpresent(int i) struct p *qqq=staffi.header; int jjj=0; qqq=qqq-next; while(qqq) if(!(jjj=jjj%8) /*分屏显示*/ getch(); setfillstyle(1,BLACK); bar(1,1,475,450); setcolor(WHI
16、TE); outtextxy(30,100+jjj*20,staffi.staff_name); outtextxy(190,100+(jjj)*20,qqq-present_time); jjj+; qqq=qqq-next; void show() char ch; int ii=0; int iii=0; outtextxy(100,100,staff info : 1); outtextxy(100,130,present info : 2); ch=getch(); if(ch=1) for(;ii127;ii+) if(!(iii%8)getch();setfillstyle(1,
17、BLACK); bar(1,1,475,450); iii=0; if(staffii.staff_id=-1)continue; outtextxy(100,100+iii*20,staffii.staff_name) ; iii+; else if(ch=2) outtextxy(100,150,input the id:) ; ch=getch();getch(); showpresent(ch-0x31); void delete_staff() int k; char ch; outtextxy(50,100, please choose the id of the staff yo
18、u want to delete:); ch=getch(); k=ch-0x30; if(k127|staffk.staff_id=-1) outtextxy(50,130 ,The staff does not exist!); else staffk.staff_id=-1; /*deleted*/ /*释放header链表,暂不实现-zpdijkstra */ outtextxy(50,130 ,deleted!); void set_staff()int i;for(i=0;inext)q=q-next; q-next=(struct p *)malloc(sizeof(struct
19、 p); q=q-next; ftime(time_b); /*系统的时间函数*/ time_long=time_b-time; if(i) strcpy(q-present_time,ctime(&time_long); outtextxy(495 ,local,staffrdata-0x30.staff_name) ; outtextxy(490,local+10,q-present_time);/*显示在工作区*/ int contrl(int rdata,int local) if(is_not(rdata-0x30)=-1) outtextxy(500,150+balala*25,n
20、ot exist !); return 0; else if(is_not(rdata-0x30)=1) insert(rdata,1,local); return 1; void haha() int i,j=80; setcolor(GREEN); for(i=100;i8)&0x00ff; sendlow = i & 0x00ff; outportb(timctl,0xb6); outportb(timer2,sendlow);/* 装计数初值低字节 */ outportb(timer2,sendhigh);/* 装计数初值高字节 */union REGS regs;int mouse_
21、i=1;int init();int read();void cursor(),newxy();int get_key();int get_item(int,int);void *buf_curse;void main()int driver,mode;int row,item_num,done,k,kkk;int j,gdriver,gmode,size;void *buf;int i;gdriver=DETECT;/*registerbgidriver(EGAVGA_driver); 有时是不必要的 */initgraph(&gdriver,&gmode,);driver=DETECT;m
22、ode=0;init_staff();set_staff();MENU1:/*registerbgidriver(EGAVGA_driver); */initgraph(&driver,&mode,);init(WindowMinY,WindowMaxX,WindowMinX,458); /*init is a defined function*/size=imagesize(0,0,150,22); /*count the bytes needs for the image*/if(size!=1) /*if it isnt only one byte*/buf_curse=malloc(size); /*apply the ram space*/*get ligh bar */setfillstyle(1,3); /*1:solid_fill;13:color*/bar(0,0,150,22); /*draw a rectangle without the bound*/getimage(0,0,150,22,buf_curse); /*copy image to buf_curse*/setfillstyle(1,BLACK); /*the s
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1