接口实验董黎波.docx
- 文档编号:27348811
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:20
- 大小:126.23KB
接口实验董黎波.docx
《接口实验董黎波.docx》由会员分享,可在线阅读,更多相关《接口实验董黎波.docx(20页珍藏版)》请在冰豆网上搜索。
接口实验董黎波
接口实验
计算机0211姓名:
董黎波学号:
012002014306
一课程设计的目的和要求
1掌握接口硬件开发平台的使用方法,利用现有的试验平台和PC机,组成一个微机模拟应用系统;
2掌握基本接口电路的综合应用
3掌握接口电路的驱动程序和界面软件的设计也编制,学会调试也测试接口软禁大一般方法
4微机接口技术及接口芯片的综合应用
二实验题目
ATM自动存取款
系统(较实时系统)服务器(主机)与客户机之间通信能进行连接,包括识别帐号,ATM机号,密码提示输入操作;连接后能进行存取操作,报错功能附加操作音乐
三总体方案设计
实验中ATM有c/s模式,信息存放在服务器中,而客户端提供服务接口。
两者串行通信。
两者均要有友好界面。
服务器
服务机,要实现数据的输入,查询,修改。
客户机
客户机,提供界面,出现操作提示。
在客户机上出现音乐,服务机上出错有警铃,彩灯提示
:
客户机
CPU
8251
GND
TXC
RXC
8251
GND
TXC
RXC
服务器
CPU
8253
音乐发
生器
平台
8255
输入
8255
声光报警器(开关彩灯,喇叭)
平台
波特率
发生器
四模块具体分析
此次实验中的数据存放使用了结构数组,用户的数据事先放入服务器中这也就有个弊端。
用户只能是已注册用户,不能再开帐号了。
服务器跟客户机的串行通信,这本身不难,可两者的互锁比较难实现。
1)开机A响音乐。
提示从A(8255)输入帐号,B等待数据,接收进行验证,出错,返回初始界面。
正确继续。
2)帐号存在,A中提示输入密码,B接收数据,如果错误B中响警铃,亮灯,按任意键停止并返回初始界面。
正确继续操作。
3)进行定义的操作
4)用户操作结束,信息提示按键决定是否关机,否,返回初始界面,开始另一用户服务。
音乐使用的是两只老虎。
注:
A为客户端,B为服务器
各主要流程图
1.
发送程序流程图
2.
接受程序流程图
3.音乐发生器流程图见实验指导书
4.声光报警流程图见实验指导书
五运行结果
六.原代码
A:
客户端
#include
#include
#include
#include
#defineMAXSIZE10
#defineLENGTH10
#definedata510x308//8251A数据口
#definectrl510x309//8251A命令/状态口
#definectrl550x303//8255命令口
#definetimer20x306//8253的2号计数器端口
#definetimctl0x307//8253命令口
#ifdef__cplusplus
#define__CPPARGS...
#else
#define__CPPARGS
#endif
structcon{
intno;
intpsw;
charname[LENGTH];
intmoney;
}con[]={{100,100,"john",100},
{100,100,"jack",100},
{100,100,"jack",100},};
voidInit8251(){
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251复位
delay(100);
outportb(ctrl51,0x4e);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令
}
voidTrans(inttran){
intstate;
do
state=inportb(0x309);
while(!
(state=state&0x01));
outportb(0x308,tran);/*发送字符*/
//printf("Transend!
\n");
}
intRecei(){
intr,state;
do
state=inportb(0x309);
while(!
(state=state&0x02));/*未检错*/
r=inportb(0x308);/*接收字符*/
returnr;
}
intjudge(intx){
inti;
for(i=0;i<3;++i)
if(x==con[i].no)returni;
elseprintf("nosuchconsumer!
");
return0;}
voidoper(inty)
{printf("whatdoyouwanttodo?
%d",&y);
}
shortintnFreq[]={
//声明歌曲“两个老虎”的音乐频率
262,294,330,262,
262,294,330,262,
330,349,392,
330,349,392,
392,440,392,349,330,262,
392,440,392,349,330,262,
294,196,262,
294,196,262,
0
};
shortintnTimeDelay[]={
//声明歌曲“两个老虎”的音乐延时
8,8,8,8,
8,8,8,8,
8,8,16,
8,8,16,
4,4,4,4,8,8,
4,4,4,4,8,8,
8,8,16,
8,8,16
};
constunsignedlongCLK=1193180;//声明时钟频率
constunsignedcharINTR=0X1C;//声明中断号
shortint*pFreq;//声明音频指针
shortint*pTimeDelay;//声明延时指针
voidinterrupt(*oldhandler)(__CPPARGS);
voidinterrupthandler(__CPPARGS)
{
(*pTimeDelay)--;//延时点数减一
oldhandler();//调用原例程
}
intPlaying(void)
{
oldhandler=getvect(INTR);//保存原中断向量
setvect(INTR,handler);//装载新中断向量
outportb(0x303,0x90);//初始化8255
outportb(0x303,0x0c);//置pc6=0禁止8253通道2的gate引脚
outportb(0x303,0x00);//置pc0=0禁止7408
outportb(0x307,0xb6);//初始化8253
pFreq=nFreq;//取歌曲的第一个音频
pTimeDelay=nTimeDelay;//取歌曲的第一个时延
while(*pFreq&&!
kbhit())
{outportb(0x306,(unsignedchar)(CLK/*pFreq%256));
//先送低字节
outportb(0x306,(unsignedchar)(CLK/*pFreq/256));
//再送高字节
//以上置8253通道2的计数初值
outportb(0x303,0x01);
outportb(0x303,0x0d);//开扬声器
while(*pTimeDelay){};//等待延时到
outportb(0x303,0x0c);
outportb(0x303,0x00);//关闭扬声器
pFreq++;//获取下一个音频
pTimeDelay++;//获取下一个延时
}//歌曲结束或按了任意键
outportb(0x303,0x0c);
outportb(0x303,0x00);//再次关闭扬声器
setvect(INTR,oldhandler);//恢复原中断向量
return0;
}
intmain(void){
textmode(C80);
textbackground(BLACK);
clrscr();
window(80,20,70,25);
textattr(LIGHTBLUE+(CYAN<<6)+BLINK);//界面
textcolor(RED);
window(80,15,70,20);
textbackground(GREEN);
clrscr();
gotoxy(35,3);cprintf("ATMSystem\n");
cprintf("\n");
gotoxy(-1,5);
intm,n;
for(m=0;m<=35;m++)
cprintf("");
for(n=0;n<=39;n++)
cprintf("**");
Playing();
Init8251();
inty=1;
while(y==1){
charc;
b:
printf("\nenterthenumber");
outportb(0x303,0x90);
intnum=inportb(0x300);
Trans(num);
y=0;
while(y!
=1)
{y=Recei();if(y==2)gotob;}//numberiswrong!
printf("\nenterthepassword!
");
intrpsw=inportb(0x300);
Trans(rpsw);
y=0;
while(y!
=1){y=Recei();if(y==2){Trans
(2);return0;}else{Trans
(1);gotob;}}//newconsumer!
}
}
B:
服务器
#include
#include
#include
#include
#defineMAXSIZE10
#defineLENGTH10
#definedata510x308//8251A数据口
#definectrl510x309//8251A命令/状态口
#definectrl550x303//8255命令口
#definetimer20x306//8253的2号计数器端口
#definetimctl0x307//8253命令口
#definectrl530x307
structcon{
intno;
intpsw;
charname[LENGTH];
intmoney;
}con[]={{001,001,"jack",100},
{002,002,"box",100},
{003,003,"tom",100},};
intbaojing_flag=0;
//声光报警
//A口输出,驱动8个LED指示灯,c口的高4位输出(PC6),作位控,推动喇叭发声
voidbaojing(void)
{intxu[8]={0x81,0x42,0x24,0x18,0x81,0x42,0x24,0x18};//LED发光顺序
unsignedlonginti=0,j=0;
printf("ifyouwanttoquit,pleasehitAnyKey!
\n");
outportb(0x303,0x83);//初始化
outportb(0x300,0x00);//LED全灭
outportb(0x303,0x0c);//关闭SPK
do{
outportb(0x300,xu[i]);//按顺序送发光信号
i++;
if(i==8)i=0;
for(j=0;j<=100;j++)
{outportb(0x303,0x0d);//令PC6=1,发高频音
delay
(1);
outportb(0x303,0x0c);//令PC6=0,关闭SPK
delay
(1);}
outportb(0x300,0x00);//LED全灭
for(j=0;j<=10;j++)
{outportb(0x303,0x0d);
delay(30);//令PC6=1,发低频音
outportb(0x303,0x0c);//令PC6=0,消音
delay(30);}
}while(!
kbhit());
outportb(0x300,0x00);//LED全灭
outportb(0x303,0x0c);//关闭SPK
}voidInit8251(){
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251复位
delay(100);
outportb(ctrl51,0x4e);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令}
voidpswchange(intx)
{inty;
printf("pleaseinputyournewpassword:
\n");
scanf("%d",&y);
con[x].psw=y;}
voidgetmoney(intx)
{inty;
printf("howmuchdoyouwanttoget?
\n");
scanf("%d",&y);
con[x].money=con[x].money-y;}
voiddisplay(intx)
{printf("\nyourno.is%d",con[x].no);
printf("\nyourpasswordis%d",con[x].psw);
printf("\nyourmoneyis%d",con[x].money);
}
voidTrans(inttran){
//printf("Starttotrans!
\n");
intstate;
do
state=inportb(0x309);
while(!
(state=state&0x01));
outportb(0x308,tran);/*发送字符*/
//printf("Transend!
\n");}
intRecei(){
//printf("Starttoreceive!
\n");
intr,state;
do
state=inportb(0x309);
while(!
(state=state&0x02));/*未检错*/
r=inportb(0x308);/*接收字符*/
//printf("Receive%d!
\n",r);
returnr;
}
intjudge(intx){
inti;
for(i=0;i<3;++i)
if(x==con[i].no){printf("consumeris%d!
welcome",x);returni;}
printf("nosuchconsumer!
");
return0;}
intoper(inty)
{intc,d;
printf("whatdoyouwanttodo?
");
printf("\n1.changepassword");
printf("\n2.getthemoney");
printf("\n3.displayyourinformation");
printf("\n4.exit");
scanf("%d",&c);
do{
if(0 switch(c){case1: pswchange(y);break; case2: getmoney(y);break; case3: display(y);break; case4: return0;} } elseprintf("choosewrong! tryagain! \n"); printf("\n"); fflush(NULL); charf=getchar(); c=f-'0';} while (1);} intmain(void){ textmode(C80); textbackground(BLUE); clrscr(); textattr(RED+(BLUE<<8)+BLINK); window(30,3,60,3); textcolor(RED); textattr(GREEN+(BLUE<<4)+BLINK);//界面 cprintf("ATMSystem"); window(1,5,80,6); textbackground(RED); clrscr(); Init8251(); a: intrflag=Recei(); inty=judge(rflag); printf("\nenter'y'tosurethecode! "); while(getchar()! ='y');Trans (1); intrrpsw=Recei(); if(con[y].psw==rrpsw)oper(y); else{printf("errothepassword! \nbeginagain! "); baojing(); Trans (1);gotoa;}//baojing printf("welcome! \nclosethemachinepress2! "); fflush(NULL); chard=getchar(); inte=d-'0'; Trans(e); e=Recei(); if(e==2)return0; elsegotoa; } 七.分工及实验体会 1.我主要负责发送端的程序的设计和调试,由于在开始实现前没有整体策划,致使各模块杂合在一起,使程序的条理不是很清晰,这一点在今后的学习实践中还有待改进. 2.由于不够专业,对ATM机只有肤浅的了解和银行的工作流程不是很清楚,以至于有很多的方面,功能在实行和设计时又欠完善,总的来说是需求分析了解不够,着方面要加强. 3.总体来说很成功,对计算机接口知识的应用有了更深的了解,基本功能也得到了实现,对一些具体环节如取款机取消帐号,界面的人性化没能考虑到,但很有收获,很有意义..
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 接口 实验 董黎波