微机原理与接口课程设计远程数据采集系统.docx
《微机原理与接口课程设计远程数据采集系统.docx》由会员分享,可在线阅读,更多相关《微机原理与接口课程设计远程数据采集系统.docx(18页珍藏版)》请在冰点文库上搜索。
微机原理与接口课程设计远程数据采集系统
HUNANCITYUNIVERSITY
微机原理与接口
课程设计
报告
设计题目:
远程数据采集系统
专业:
计算机科学与技术(嵌入式)
学生姓名:
班级学号:
分组成员:
指导教师:
2012年6月15日
Xxxxx班微机原理与接口课程设计
一、设计时间
2012年6月11日至2012年6月15日
二、设计地点
一实验楼321室
三、设计目的
1、掌握微机原理以及接口硬件开发平台的使用方法,利用现有的MFID实验平台和X86PC机,组成一个微机应用系统。
2、掌握基本接口电路的综合应用。
3、掌握接口电路的驱动程序设计与应用程序编制,学会调试与测试接口程序的一般方法。
4、通过数据采集系统设计与制作,深入了解与掌握利用RS-232或RS-485串行通信标准进行远距离传送的原理和方法。
四、设计小组成员
五、指导老师
六、设计课题
远程数据采集系统
要求:
甲机通过RS-232接口接受乙机一侧采集的数据(A/D转换结果),以文件方式传送。
实验资源配置:
1.PC兼容机
2.MFID多功能微机实验平台
3.MF2KI集成开发环境
4.面包板或外设功能模块板
5.安装工具
七、基本思路及关键问题的解决方法
基本思路:
1.进行数据远距离传送控制系统电路硬件设计,画出电路原理图、PCB图或元器件布线图。
2.安装元器件。
3.进行数据远距离传送控制程序设计。
4.利用计算机和微机原理与接口实验箱自行调试程序。
关键问题的解决方法:
由于三人都学得不好,因此遇到了挺多问题,比如不懂8255,8253和8251的原理是怎样的,再就是接线和程序的方面,对于我们三个也都存在困难,为了解决这些困难,我们有多查资料,问同学和老师,花费着尽量多地时间在这个课程设计上面...
八、算法及流程图(硬件框图)
发送端
接收端
采集信息流程图
发送数据流程图
发送端流程图
接收端流程图
10、课程设计心得体会
编写的程序不但要拿来使用,还要给别人查看,以便代码的维护。
所以代码编写的风格尽量规范,清晰。
变量要尽量少定义,结构夜采用简单的。
代码较为冗余,可读性较差,可以多添加一些提示语句以及注释。
在这次课程设计中懂得了一个程序地好坏关键在于算法是否优秀,一个好的优秀的算法可以使我们的程序更加完善,安全性更高以及有更高的效率。
这次设计中我发现了自己的许多不足,如。
。
。
十一、源程序及参考文献
源程序
文件发送端:
#include
#include
#include
#include
#definedata510x308//8251A数据口
#definectrl510x309//8251A命令/状态口
#definectrl550x303//8255命令口
#definedata550x300//8255A数据口
#definetimer20x306//8253的2号计数器端口
#definetimctl0x307//8253命令口
#definefactor16//波特率因子16
intchoose_channel();//选择通道函数
intcollect();//数据采集函数
voidint51();//初始化8251a
voidset_bps(intbps);//8253记数初值计算与装入
voidtransmit(intdata);//数据发送函数
unsignedlongintclk=1919828;//MFID-5型平台板上时钟为1.919828MHZ
inttable[8]={110,150,300,600,1200,2400,4800,9600};//定时常数数组
voidmain(void)
{
intch,data,status;
charn,end;
FILE*fp;
charfilename[10];
inti;
end='';
printf("Inputfilename:
");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("Openfileerror!
\n");
exit(0);
}
printf("InputA/Dnumberof\n");
ch=choose_channel();
for(i=0;i<100;i++)
{
data=collect(ch);
fputc(data,fp);
printf("%d",data);
}
fclose(fp);
printf("intputbts:
\n");
printf("\n0---110\n1---150\n2---300\n3---600\n4---1200\n5---2400\n6---4800\n7---9600\n");
n=getchar();
while(n<'0'||n>'7')
{
printf("failagaint!
\n");
n=getchar();
}
n=n-48;
set_bps(table[n]);
int51();
outportb(ctrl55,0x80);
outportb(ctrl55,0x0d);//置PC6=1,打开8253的GATE2
printf("beginconvert,endwithanykey!
\n");
if((fp=fopen(filename,"r"))==NULL)
{
printf("openfilefail!
\n");
exit(0);
}
while
(1)
{
status=inportb(ctrl51);//获取8253TXRDY状态
if(kbhit())//若无键按下,则转接收
{
outport(ctrl55,0x0c);//关闭8253
return;
}
els
{
if(((status&0x01)!
=0))//已准备好,则将键入的字符发送出去
data=fgetc(fp);
outportb(data51,data);
}
}
}
intchoose_channel()
{
intc;
do
{
c=getchar();//输入通道号
c=c-48;/*将读入的ASCII码转换成对应的数字*/
if(c<0||c>7)
printf("\nTheA/DchannelNOiswrong!
\nBesureitisbetween0and7!
\nPleaseinputtheNOagain!
:
");//有误!
else
break;//通道号正确时,跳出循环
}while
(1);
return(c);//返回正确的通道号
}
intcollect(intch)
{
intpa,pc4;
outportb(ctrl55,0x88);//初始化8255,A口输出
outportb(data55,ch);//送通道号至A口
outportb(ctrl55,0x03);//pc1置1ALE=1进行地址锁存
outportb(ctrl55,0x98);//重写8255方式字,A口输入,C口低四位输出,C口高四位输入
outportb(ctrl55,0x01);
outportb(ctrl55,0x02);//使PC0START置高发启动信号
outportb(ctrl55,0x00);//使PC0置低START下降沿开始转换
do
{
pc4=inportb(0x302)&0x10;
}while(pc4==0);//查询PC4EOC的状态,直至为高电位,即,转换完成
outportb(ctrl55,0x05);//pc2=1/OE=1允许读转换结果
pa=inportb(data55);//读转换结果
returnpa;
}
voidint51()
{
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251复位
delay(100);
outportb(ctrl51,0x4e);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令
}
voidset_bps(intbps)
{
inti,sendhigh,sendlow;
i=clk/bps;
i=i/factor;//计算计数初值
sendhigh=(i>>8)&0x00ff;
sendlow=i&0x00ff;
outportb(timctl,0xb6);//8253计数器2方式3
outportb(timer2,sendlow);//装计数初值低字节
outportb(timer2,sendhigh);//装计数初值高字节
}
文件接收端:
#include//kbhit();
#include//printf();
#include//delay();
#include
#definedata510x308//8251A数据口
#definectrl510x309//8251A命令/状态口
#definectrl550x303//8255命令口
#definetimer20x306//8253的2号计数器端口
#definetimctl0x307//8253命令口
#definefactor16//波特率因子16
//unsignedlongintclk=1193182;//8251输入时钟频率(十六进制表示)MFID-4型平台板上时钟为1.193182MHZ
unsignedlongintclk=1919828;//MFID-5型平台板上时钟为1.919828MHZ
inttc_table[8]={110,150,300,600,1200,2400,4800,9600};//定时常数数组
voidint51();//初始化8251a
voidset_bps(intbps);//8253-5记数初值计算与装入
voidmain()
{
intgetvalue=0;
inttemp=-1;
intsletter,rletter,status;
charfilename[10];
FILE*fp;
for(;;)
{
clrscr();
printf("inputfilename:
");
scanf("%s",filename);
printf("\n0---110\n1---150\n2---300\n3---600\n4---1200\n5---2400\n6---4800\n7---9600\n");
getvalue=getch();
if((getvalue<'0')||(getvalue>'7'))
{
printf("\nInputerror!
tryagainplease!
\n");//errormessage
getch();
continue;
}
else
{
break;
}
}
temp=getvalue-'0';
set_bps(tc_table[temp]);
int51();
printf("\nnowentertheserialcommunication");
printf("\nendwith'Esc'\n");
outportb(0x303,0x80);//置PC6=1,打开8253-5的GATE2
outportb(0x303,0x0d);
while
(1)
{
if((fp=fopen(filename,"w"))==NULL)
{
printf("openfilefail!
\n");
exit(0);
}
if(kbhit())
{
if((sletter=getche())==0x1b)//是ESC?
是,则退出
{
outport(ctrl55,0x0c);//关闭8253
return;
}
}
else
{
status=inportb(ctrl51);//已准备好,即有数据传送过来,则接收1个字符
if((status&0x02)!
=0)
{
rletter=inportb(data51);
fputc(rletter,fp);
printf("\n%c",rletter);
}
}
}
fclose(fp);
}
voidint51()
{
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251复位
delay(100);
outportb(ctrl51,0x4e);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令
}
voidset_bps(intbps)
{
inti,sendhigh,sendlow;
i=clk/bps;
i=i/factor;//计算计数初值
sendhigh=(i>>8)&0x00ff;
sendlow=i&0x00ff;
outportb(timctl,0xb6);
outportb(timer2,sendlow);//装计数初值低字节
outportb(timer2,sendhigh);//装计数初值高字节
}
参考文献
[1]夏士兵,钱江.构建基于COM+的分布式Web应用.微型机与应用,2001.20(6):
8-9
[2][美]RichardAnderson,ChrisBlexrud著.ASP3高级编程[M].张立民等译.北京:
机械工业出版社,2000:
408-458.
[3]刘乐善主编,《微机接口技术与应用》.华中科技大学出版社.