通信工程课程设计报告.docx
- 文档编号:25053827
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:30
- 大小:16.01MB
通信工程课程设计报告.docx
《通信工程课程设计报告.docx》由会员分享,可在线阅读,更多相关《通信工程课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
通信工程课程设计报告
附件1
西安邮电学院
专业课程设计报告书
系部名称
:
通信与信息工程学院
学生姓名
:
专业名称
:
通信工程专业
班级
:
时间
:
2011年10月10日至2011年10月21日
附件2西安邮电学院通信工程系专业课程设计成绩鉴定表
学生姓名
专业班级/学号
进行时间
2011年10月10日—2011年10月21日
题目
专业课程设计
具体内容
第一周
基础型实验模块(实验一—实验四)
第二周
基础型实验模块(实验五—实验六)
提高型实验模块(实验一—实验五)
成绩鉴定
接受单位评价
(20分)
学习态度(10分)
学习纪律(10分)
报告鉴定
(30分)
报告内容与教学计划内容结合程度(15分)
报告质量(主题、结构、观点、逻辑、资料)(15分)
验收鉴定
(50分)
程序的合理性(15分)
调试过程(20分)
调试结果(15分)
评阅教师姓名
职称
成绩
评语
评阅教师签字
年月日
实验一时间表调度实验
一、实验目的
时间调度表实验用来考查自己对时间表调度原理的掌握情况。
二、实验原理及设计
在程控数字交换的体系结构中,周期级程序(例如摘挂机检测程序、脉冲识别程序、位间隔识别程序)是由时间表调度实现的。
所谓时间表调度,是指每经过交换系统的最短有效时间(这通常是指各周期性程序周期的最大公约数),都会检查调度表的调度要求,如果某个程序在这时需要执行,则调度程序开始执行它。
调度表任务如下进行初始化:
时间(10ms)\任务
0:
摘挂机检测任务
1:
脉冲检测任务
2:
位间隔检测任务
0
0
1
0
1
0
1
0
2
0
1
0
3
0
1
0
4
0
1
0
5
0
1
0
6
0
1
0
7
0
1
0
8
0
1
0
9
0
1
1
10
0
1
0
11
0
1
0
12
0
1
0
13
0
1
0
14
0
1
0
15
0
1
0
16
0
1
0
17
0
1
0
18
0
1
0
19
1
1
1
这个交换系统提供了三个周期性调度程序(摘挂机检测程序、脉冲识别程序和位间隔识别程序),它们的调用周期分别为200ms、10ms和100ms,所以我们系统的最小调度时间为10ms。
如图所示,每隔10ms,我们就会检查这个表的一行,如果该行上某一列为1,我们就执列所对应的任务,如果为0,就什么都不做。
每当执行到这个表的最后一行,调度任务会返回第一行循环执行。
此实验中调度表可定义为一个20*3的二维数组。
三、实验过程
实验主要数据结构:
函数功能:
完成调度表的初始化;
函数原型:
initSchTable(intScheduleTable[SchTabLen][SchTabWdh]);
其中SchTalLen和SchTabWdh为在bconstant.h中的宏定义:
#defineSchTabLen20//代表这个调度表为20行(相邻行之间的时间间隔为10ms);
#defineSchTabWdh3 //代表三个周期性调度任务——0:
摘挂机检测任务;1:
脉冲检测任务;2:
位间隔检测任务;
4、实验结果
1.源程序:
#include"bconstant.h"
extern"C"_declspec(dllexport)voidinitSchTable(intScheduleTable[SchTabLen][SchTabWdh])
{
inti;
for(i=0;i { ScheduleTable[i][1]=1;//每10ms脉冲检测执行一次. if((i+1)%20==0)ScheduleTable[i][0]=1;//每200ms摘挂机检测执行一次 elseScheduleTable[i][0]=0; if((i+1)%10==0)ScheduleTable[i][2]=1;//每100ms位间隔检测执行一次 elseScheduleTable[i][2]=0; } return; } 2、对此程序进行编译后运行成功,然后再对其演示,拨打的号码为: 62283166,如下图所示: a.拨号图: b.拨号成功后接通如下图所示: 五.实验心得与分析 通过这次实验,时间调度表的构成和初始化过程有了较深的了解,通过实验分析手册中所提供的实验原理说明,自己也画了相应的调度表草图,因为相隔10ms即对调度表的一行进行任务是否执行检查即第一个10ms后检测调度表第0行,以此类推100ms后检测第9行,200ms后检测第19行,而且摘挂机检测程序、脉冲识别程序和位间隔识别程序的调用周期分别为200ms、10ms和100ms,依据这些我来确定20*3的二维调度表的0/1值存储,从而正确的实现调度表初始化。 实验二摘挂机检测实验 一、实验目的 摘挂机检测实验用来考查自己对摘挂机检测原理的掌握情况。 二、实验原理及设计 设用户在挂机状态时扫描输出为“0”,用户在摘机状态时扫描输出为“1”,摘挂机扫描程序的执行周期为200ms,那么摘机识别,就是在200ms的周期性扫描中找到从“0”到“1”的变化点,挂机识别就是在200ms的周期性扫描中找到从“1”到“0”的变化点,该原理的示意图如下所示: 在我们的实验中,我们把前200ms的线路状态保存以备这次可以读取,同时读出这次的线路状态,把前200ms的线路状态取反与这次的线路状态相与,如果为1,就说明检测到摘机消息了。 同理,我们把这次的线路状态取反再与前200ms的线路状态相与,如果为1就说明检测到挂机消息了,然后把摘挂机信号作为事件放入摘挂机队列中。 三、实验过程 1、实验主要数据结构: 函数功能为: 检测到摘、挂机事件,并把该事件放入到摘挂机事件队列中。 函数原型: voidscanfor200(intlinestate200[LINEMAX],intlinestate[LINEMAX],UpOnnode*head1,UpOnnode*end1);其中LINEMAX为线路总数,是定义在"bconstant.h"中的一个宏,linestate200[LINEMAX]为已保存的200ms前线路状态,linestate[LINEMAX]为当前的线路状态,head1,end1为摘挂机队列的首尾指针,该队列已经在主程序中进行了初始化。 我们所要做的就是把检测到的摘挂机事件以摘挂机队列节点的形式插入到摘挂机事件队列中。 数据结构说明: 头文件: "bconstant.h";(以下的数据结构都已在该文件中定义) LINEMAX : 最大线路数; intlinestate200[LINEMAX],linestate[LINEMAX]: 线路从0开始编号;状态: 1: 有电流,0无电流; enumUporOn{ehandup,ehandon}: 为摘挂机区别符: ehandup表示摘机,ehandon表示挂机; structUpOnnode //摘挂机队列节点结构 { UporOnphonestate; //摘挂机区别符; intlinenum; //线路号(从0开始); structUpOnnode*next; //指向下一节点的指针; }; 2、实验主体流程图: 四、实验结果 1、源程序 #include"bconstant.h" #include"malloc.h" #include"string.h" extern"C"_declspec(dllexport)voidscanfor200(intlinestate200[LINEMAX],intlinestate[LINEMAX],UpOnnode*head1,UpOnnode*end1) {UpOnnode*p; inti; for(i=0;i { if((! linestate200[i])&&linestate[i])//前200ms线路状态取反和现线路状态相与(线路号一致) { //相与结果为真则为摘机 p=(UpOnnode*)malloc(sizeof(UpOnnode));//定义节点 p->phonestate=ehandup;//摘挂机区分符为ehandup(摘机) p->linenum=i;//线路号为i p->next=NULL; end1->next=p;//将节点p入队列 end1=p; } if(linestate200[i]&&(! linestate[i]))//前200ms线路状态和现线路状态取反相与(线路号一致) { //相与结果为真则为挂机 p=(UpOnnode*)malloc(sizeof(UpOnnode)); p->phonestate=ehandon;//摘挂机区分符为ehandon(挂机) p->linenum=i;//线路号为i p->next=NULL; end1->next=p;//将节点p入队列 end1=p; } linestate200[i]=linestate[i];//将本次线路号为i的线路状态存储 } return; } //此函数不需修改 extern"C"_declspec(dllexport)voidfreenode(UpOnnode*node) { deletenode; } 2、对此程序进行编译后运行成功,然后再对其演示,拨打的号码为: 62280886,如下图所: a、拨号图: b、拨号成功后的图: 五、实验心得与分析 在这个实验中我了解到摘挂机状态的检测方法: 前200ms线路状态取反和现线路状态相与(线路号一致)结果为真则为摘机、前200ms线路状态和现线路状态取反相与(线路号一致)结果为真则为挂机,并且用程序实现,实验中通过对摘机和挂机进行检测并将其结果存入结构体变量中并放入摘挂机链表队列中。 由于函数中运用了malloc函数和NULL故添加了相应的头文件。 实验三脉冲计数实验 一、实验目的 脉冲计数实验用来考察查自己对脉冲识别原理的掌握情况。 二、实验原理及设计 拨号盘所发出的拨号脉冲有规定的参数。 我国规定的号盘脉冲的参数有: 脉冲速度: 即每秒钟送出的脉冲个数,规定的脉冲速度为每秒钟8-16个脉冲;脉冲断续比: 即脉冲宽度(断)和间隔宽度(续)之比,规定的脉冲断续比为1: 1-3: 1。 1)脉冲识别程序扫描周期的确定: 为确定脉冲识别扫描的周期,需要计算出最短的变化间隔(脉冲或间隔宽度),这样才能保证每个脉冲都能够识别而不至于丢失脉冲。 由于号盘每秒发出的最快脉冲个数为16个,脉冲周期T=1000/16=62.5ms,在这种情况下断续时间比为3: 1时续的时间最短,为1/4*T,所以最短变化周期为1/4*(1000/16)=15.625ms,脉冲识别扫描程序的周期<15.625ms。 2)拨号脉冲识别原理: 在下图中,采用了10ms的扫描周期,其中的变化识别标志了状态的变化。 对于一个脉冲来说,是前沿和后沿各识别一次,我们可以任取一个来识别脉冲,下图中采用了前沿识别。 从逻辑上讲,也就是说(这⊕前)∧前=! 这∧前相当于前面所说的挂机识别,同样(这⊕前)∧! 前=这∧! 前相当于摘机识别。 在这里采用比较麻烦的逻辑运算的原因是需要“变化识别”这个结果。 这在位间隔识别中要用到,下面是脉冲识别原理原理示意图: 在我们设计的实验中,用一个数组保留各线路10ms前的状态,用另一个数组保留各线路当前的状态,并且提供了保存“变化识别”的数组(以供后面的位间隔识别使用),另外提供给学生使用的是保存已检测的脉冲值的数组,学生编程检测到一个脉冲以后,就将该线路对应的脉冲值加一。 三、实验过程 1、实验主要数据结构: 函数功能: 识别出一个脉冲,然后把该线路对应的脉冲数加一。 函数原型: voidscanpulse(intlinestate[LINEMAX],intlinestate10[LINEMAX],intchange[LINEMAX],intfchange[LINEMAX],intpulsenum[LINEMAX])其中LINEMAX为最大线路数,linestate为当前线路状态,linestate10为10ms前的线路状态,change为状态改变,fchange为首次变化,pulsenum为脉冲计数数组。 主要的数据结构: 头文件: "bconstant.h";(以下的数据结构都已在该文件中定义) LINEMAX : 最大线路数; intlinestate[LINEMAX],linestate10[LINEMAX]: 线路从0开始编号;状态: 1: 有电流,0无电流; intchange[LINEMAX]: 线路状态变化数组,0表示无变化,1表示有变化; intfchange[LINEMAX]: 线路首次变化数组,1表示已发生首次变化,0表示没有; intpulsenum[LINEMAX]: 线路当前的脉冲值; 为方面大家操作,我们提供了两个预定义的函数: intnor_op(inta,intb);intor_op(inta,intb);分别用于异或操作和或操作。 注意事项: 把这次的线路状态值保存到10ms前的线路状态数组中,以便主程序周期调用。 2、实验主体流程图: 四、实验结果 1、源程序 #include"bconstant.h" intnor_op(inta,intb);//异或操作函数 intor_op(inta,intb);//或操作函数 extern"C"_declspec(dllexport)voidscanpulse(intlinestate[LINEMAX],intlinestate10[LINEMAX],intchange[LINEMAX],intfchange[LINEMAX],intpulsenum[LINEMAX]) { inti; for(i=0;i { change[i]=nor_op(linestate[i],linestate10[i]);//前10ms与现在的线路脉冲状态相异或值存入变化识别,为0则状态无变化,为1则线路有变化 fchange[i]=or_op(fchange[i],change[i]);//首次变化与变化识别相或值存入首次变化 if(change[i]&&! linestate10[i]) pulsenum[i]++; linestate10[i]=linestate[i]; } return; } //此函数不需要修改 intnor_op(inta,intb) { if(a==b) return0; else return1; } //此函数不需要修改 intor_op(inta,intb) { if((a==0)&&(b==0)) return0; else return1;} 2、对此程序进行编译后运行成功,然后再对其演示,拨打的号码为: 62280125,如下图所: a、拨号图: b、拨号成功后的图: 五、实验心得与分析 在这个实验中,我了解到脉冲计数拨号原理,并对脉冲检测识别有了相应的了解,即前沿和后沿标识两种方法,前沿标识即为变化识别(前10ms与现在的线路脉冲状态相异或的结果)与前次状态相与结果为真则检测出有脉冲,后沿标识即为变化识别与前次状态取反结果相与,为真则检测出有脉冲,本次实验中的函数采用后沿识别方法。 实验四位间隔识别实验 一、实验目的 位间隔识别实验用来考察自己对位间隔识别原理的掌握情况。 二、实验原理及设计 位间隔识别的目的是要识别两位号码之间的间隔,从而区分各位号码。 首先来确定一下位间隔识别的扫描周期,一方面拨号盘的位间隔≥250ms,另一方面需要确定一下最长的脉冲或者间隔为多少毫秒。 由于最慢的脉冲速度为每秒8个脉冲,这就是说脉冲周期T=1000/8=125ms,当断续比为3: 1时,脉冲(断)时间应为125ms*3/4=93.75ms,所以位间隔识别程序要能鉴别93.75ms和250ms间的间隔。 一般采用96ms扫描程序来识别,位间隔识别的原理图: 对于位间隔识别的基本原理,在这里要强调两个关键点 (1)识别在前96ms周期内没有发生过变化。 这就排除了脉冲变化的因素。 因为脉冲最长间隔如前面所计算的那样为93.75ms〈96ms; (2)识别出在此以前的最后一次变化是在96ms以前的那个周期内,这一条件可以保证在位间隔开始96ms后的第一个周期就能识别到,而且保证以后各次扫描不识别。 为此引入了¡°首次变化¡±这个变量,它标志首次遇到了¡°变化¡±。 平时它为¡°0¡±,当在一个扫描周期内遇到变化后就变为¡°1”,在这个周期的后续时间里它都保持¡°1”不变。 这个条件可由下面的逻辑关系来实现: 首次变化=首次变化¡Å变化识别。 当首次变化为¡°0¡±时,只要8ms脉冲扫描的变化识别为¡°0¡±,则首次变化永远为¡°0¡±,一旦变化识别为¡°1”,则首次变化就变为¡°1”,而且以后无论变化识别如何改变都不能改变首次变化的¡°1”值。 为确保以上¡°首次变化¡±平时为¡°0¡±,令每次96ms程序都把它清¡°0¡±,这样就写出下面的计算公式: 首次变化=(首次变化¡Å变化识别)¡Ä/96 在每次96ms程序执行期间来检查¡°首次变化¡±这个变量,若为¡°0¡±,说明在前96周期内没有发生过变化;若为¡°1”,说明已发生变化,但这时还不能确定为何种变化,既可能为脉冲变化,也可能为位间隔变化。 这就需要看下一个96ms周期,若仍有变化,则属于¡°脉冲变化¡±;若无变化,即属于¡°位间隔¡±变化(>96ms无变化)。 这时在再下一个周期内仍能识别出¡°无变化¡±,但已经识别出一次了,不能再作重复识别。 对上面的讨论加以概括,只要识别两个变量就可以了: (1)上一个96ms周期内无变化; (2)再上一个周期内有变化就可确定为¡°位间隔¡±了。 在上面的图中的¡°首次变化¡±是识别变量 (1)的,首次变化=1是说明上一周期内无变化,否则有变化。 上图中前次¡°首次变化¡±是识别后一个变量 (2)的,前次¡°首次变化¡±是读取¡°首次变化¡±的存储内容,不过96ms读一次,读的正是再上一个周期的最后结果。 前次¡°首次变化¡±=1,说明再上一个周期有过变化,否则无变化。 将¡°首次变化¡±取反后与前次¡°首次变化¡±相与,结果为¡°1”,表示有位间隔。 值得注意的是,仅上面识别出的¡°位间隔¡±还是不够的,因为它只能说明前一次变化在96ms以前,那么用户中途挂机也可以达到这个条件,因此必须区别是¡°位间隔¡±还是¡°中途挂机¡±。 区别这个很容易,只要区别一下现在用户处于挂机还是摘机状态就可以了。 前者是中途挂机,后者是位间隔。 方法可以是查一下当前的用户线状态,如果为¡°1”,说明用户已经挂机,那么识别的是¡°中途挂机¡±,否则为¡°位间隔¡±。 在我们的实验中提供了前100ms的线路状态数组和当前的线路状态数组,以及用来保存¡°变化识别¡±、¡°首次变化¡±和¡°前次首次变化¡±的数组等供学生使用,学生通过编程检测位间隔的位置,当学生检测到位间隔以后,学生把与该线路对应的脉冲值放入到一个接收号码队列中,并且放在接收号码队列中的事件需保存着与该号码对应的线路号,因为几个线路接收到的号码都是放在同一个队列中的。 (然后,一个外部程序将扫描该接收号码队列,逐一把各个接收号码事件发送给交换系统中央控制系统。 学生只要做到将号码事件按照接收号码队列节点格式放入队列即可。 ) 三、实验过程 1、实验主要数据结构: 函数功能: 识别出一位号码,将该号码放入到号码接收队列中; 函数原型为: voidscandigit(intlinestate[LINEMAX],intlinestate100[LINEMAX],intpulsenum[LINEMAX],intfchange[LINEMAX],intlfchange[LINEMAX],Digitnode*head2,Digitnode*end2)。 其中LINEMAX为线路总数,是定义在bconstant.h中的一个宏,linestate[LINEMAX]为当前的线路状态linestate100[LINEMAX]为100ms前的线路状态,pulsenum为当前已经检测到的脉冲计数值,fchange为首次变化,lfchange为前次首次变化,head2,end2为号码接收队列的首尾指针,该队列已经完成了初始化。 本次实验就是把检测到位间隔的线路的号码值插入这个队列中。 数据结构说明: 头文件: "bconstant.h";(以下的数据结构都已在该文件中定义) LINEMAX : 最大线路数; intlinestate[LINEMAX],linestate100[LINEMAX]: 线路从0开始编号;状态: 1: 有电流,0无电流; intpulsenum[LINEMAX]: 线路已检测到的脉冲值数; intfchange[LINEMAX],lfchange[LINEMAX]: 首次变化数组,前次首次变化数组,有变化为1。 structDigitnode //号码接收队列节点数据结构 { intnum; //号码值 intlinenum; //线号 structDigitnode*next;//指向下一节点的指针 } 2、实验主体流程图: 四、实验结果 1、源程序 #include"stdio.h" #include"bconstant.h" #include"malloc.h" extern"C"_declspec(dllexport)voidscandigit(intlinestate[LINEMAX],intlinestate100[LINEMAX],intpulsenum[LINEMAX],intfchange[LINEMAX],intlfchange[LINEMAX],Digit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通信工程 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)