交互式程序设计复习.docx
《交互式程序设计复习.docx》由会员分享,可在线阅读,更多相关《交互式程序设计复习.docx(12页珍藏版)》请在冰豆网上搜索。
交互式程序设计复习
交互式程序设计复习
1、JC的组成,JC编译方式的特点。
JC由两部分组成:
编译环境(包含交互式命令行编辑和调试功能)、能力风暴操作系统。
JC编译方式的特点:
不直接编译生成针对特定处理器的机器代码,而是先编译生成基于堆栈虚拟机的伪代码,然后由能力风暴操作系统解释执行。
2、任何时候只要复位情况的出现,全局变量将会初始化。
复位情况包括:
代码下载;主程序main()运行;系统硬件复位。
3、格式化字符汇总%d:
输出类型:
int描述:
十进制整数%x:
输出类型:
int描述:
十六进制整数%b:
输出类型:
int描述:
低位字节为二进制数%c:
输出类型:
int描述:
低位字节为ASCII字符%f:
输出类型:
float描述:
浮点数%s:
输出类型:
char[]描述:
字符数组4、LCD使用注意事项a)LCD液晶屏幕上的最右下字符位置被作为系统的状态指示。
当能力风暴操作系统运行正常时,该处的太极字符持续闪烁。
若停止闪烁,则说明能力风暴操作系统运行出错。
这时需更新操作系统。
b)若显示字符超出31个,则被截断,超出部分不显示。
c)显示字符长度大于16时,长出部分折到下一行显示。
d)目前不支持长整数(32位)输出。
e)如果显示格式化字符与显示类型不匹配,会有意外错误。
5、JC的库函数。
Voidmotor(intindex,intvel):
vel功率是从100到100.电机编号index:
左1右2,扩3.Voiddrive(inttrans_vel,introt_vel)trans_vel是平移速度(100~-100)rot_vel是旋转速度Voidstop()停止运动Voidbeep()产生一段0.3秒1000HZ的音频信号Voidwait(floatsec)让前一状态保持一段时间Intdigitalport(intchannnel)读数字口上传感器的值。
channel的范围是0~7.返回值0或1Intphoto(intindex)光敏传感器。
左1右2.返回值0~255,光线越暗数值越大。
Intmicrophone()声音传感器的值,返回值0~255.,声音越响数值越大。
Intir_detector()红外测障,0无1左2右4前Intbumper()碰撞传感器,0无1左2右4前8后Introtation(intindex)光电编码器,1左2右6、多个进程如果进行通讯怎么办?
多进程之间的通讯及同步问题。
遵循的原则?
进程间的通讯:
通过全局变量进行。
多进程之间的通讯及同步问题。
遵循的原则:
1)一种设备只在一个进程中访问;2)同时只能有一个进程写一个全局变量,但可以有多个进程同时读。
7、使用JC会遇到的错误类型。
使用JC会遇到两种类型的错误:
编译错误和运行错误。
编译错误包括:
语法错误和数据类型不匹配。
运行错误发生时,将在液晶屏幕上显示错误号。
错误代码列表(P29)8、如果程序不能正常下载,下可能有以下6个方面的原因:
1)能力风暴的主开关未打开。
2)电池电压不足。
3)机器人型号设置不正确。
4)该串口硬件有问题。
5)能力风暴操作系统被破坏。
6)串口线头过松,接触不好9、几种常用的操作。
如何更新操作系统如何为机器人配置型号如何给机器人充电如何下载自检程序如何下载当前程序如何正确使用复位/ASOS按钮如何让机器人走的直线更好10、构成机器人的三大要素是什么?
请从这三大要素着手分析说明机器人的工作原理。
构成机器人的三大要素是:
传感器、微控制器和执行器。
机器人的工作原理:
机器人通过传感器采集外界环境信息,然后将采集的信息经过转换元件转换成电信号,再经过A/D转换成数字量,传递给机器人的大脑微控制器,微控制器根据装载的JC程序进行思考,发出相应的命令给执行器执行。
11、机器人的身体结构:
主板:
由很多电子元器件组成,跟人的大脑一样,主要完成接收信息、处理信息、和发出指令等。
控制按键:
机器人的运行控制部件。
包括开关按钮、电源指示灯、充电指示灯、充电口、下载口、复位/ASOS按钮、运行键、通信指示灯。
传感器部分:
包括五种基本的传感器(P10)。
执行部分:
扬声器、LCD、主动轮及其驱动机构、从动轮。
12、微控制器68HC11,端口AE的功能。
在机器人中的使用情况。
PORTA:
数字口。
PA2输入捕捉通道。
PA3-PA6输出比较通道。
PA7通用的I/O口。
能力风暴机器人中:
光电编码器利用PA0、PA1口捕捉计码盘信号;电机驱动采用PA5、PA6发出PWM信号;喇叭由PA3控制。
PORTB:
端口功能受68HC11E的工作模式的影响,单独工作模式下,提供普通的8条输出信号通道,扩展工作模式下,提供8位地址通道。
能力风暴机器人中:
PORTB与PORTC提供16条地址线,PORTB做为地址的高8位。
PORTC:
单独工作模式下,提供普通的8条输入/输出信号通道,扩展工作模式下,提供8位地址/数据复合通道。
能力风暴机器人中:
PORTB与PORTC提供16条地址线,8条数据线(PORTC做为地址的低8位,地址/数据时分多用)PORTD:
PD0-PD1作为串行通信口(SCI),PD2-PD5串行外设接口(SPI);能力风暴机器人中:
用PD0,PD1与PC机进行通信;PD0(RXD)接收数据;PD1(TXD)发送数据。
红外传感器:
利用PD2,PD3设置发光二极管的状态;直流电机:
利用PD4,PD5给驱动电机芯片提供输入脉冲。
PORTE:
模拟口。
能力风暴机器人中:
光敏传感器利用PE0,PE1口采集光敏电阻上的电压值;麦克风利用PE2口采集电压值;碰撞传感器利用PE3口采集电压值;红外传感器利用PE4口采集红外探测器的当前值。
13、机器人的驱动方式?
机器人的调速系统采用了哪些装置,它是如何进行调速的?
机器人的驱动方式采用差动驱动方式,将两个独立的运动合成为一个运动。
当我们把两个电机的运动合成为一个运动时,这就成了差动运动。
调速系统采用的装置为:
直流电机和齿轮减速器。
机器人上通过主板发PWM脉宽调制信号,使电机上得到不同宽度的脉冲方波信号,从而调节输入到电机的平均电压。
而直流电机上的电压大小影响他的转速和转矩,直流电机的转速又经过减速器将转动传递给主动轮。
当转矩一定时,加载在直流电机上的平均电压值越大,转速越高;相反,转速越低。
这样,通过改变电机电压的方式就可以实现调速。
14、什么是传感器?
它的作用和组成。
传感器就是自动测量系统中一个把待测量变换成某种电信号的装置。
传感器是能感觉规定的被测量,并按一定的规律性,转换成可用输出信号的器件或装置。
通常由敏感元件和转换元件组成。
15、能力风暴五种基本传感器,三种基本执行器,所对应的库函数有哪些,如何应用。
基本的结构和执行的过程。
、能力风暴五种基本传感器,三种基本执行器,所对应的库函数有哪些,如何应用。
基本的结构和执行的过程。
:
五种基本的传感器及其对应库函数及应用方法:
(1)碰撞传感器:
intbumper()碰撞传感器检测
(2)红外传感器:
intir_detector()红外传感器检测(3)光敏传感器:
intphoto()光敏传感器检测(4)麦克风:
intmicrophone()声音传感器检测(5)光电编码器:
intencoder(int)读取光电编码器器当前状态;Introtation(intindex)光电编码器脉冲累计读数三种基本的执行器及其对应库函数的使用方法:
(1)扬声器:
voidbeep(),使用它可产生一段0.3秒500赫兹的音频信号,发生结束后返回。
(2)LCD:
(3)直流电机:
voidstop()关闭左右两个电机,停止运动;voidmotor(intm,intspeed)以功率级别speed启动电机m;}16、简述基于视频技术的野外探险机器人的硬件组成,以及机器人与电脑之间的控制信号、视频信号的无线通讯实现过程。
的硬件组成,以及机器人与电脑之间的控制信号、视频信号的无线通讯实现过程。
基于视频技术的野外探险机器人的硬件组成:
机器人、AS无线摄像机、视频捕捉卡、微功率无线通讯模块、电脑。
视频信号的无线通讯的实现:
在机器人上安装有AS无线摄像机和微功率无线通讯模块,在上位机安装视频捕捉卡,视频信号通过机器人上安装的无线摄像头采集视频信息,通过连接在电脑上的AS无线摄像机的接收模块接收到视频信息,然后输出到接收模块所连接的视频采集卡的视频输入端,从而完成机器人与电脑的视频信号的传输。
控制信号的无线通讯的实现:
在机器人和上位机上都安装有微功率无线通讯模块,机器人与电脑之间,通过微功率无线通讯模块的接收和发送信号,完成控制信号的传输。
编写程序:
intX=50;int*Xptr;Xptr=X;printf(*Xptr=%d\n,*Xptr);__50_X=100;printf(%d\n,*Xptr);__100__*Xptr=200;printf(X=%d\n,X);__200__P13P14检测光线亮度和累计左右碰撞次数的程序。
把几个机器人放在一起,编写程序并下载运行,试一试机器人你叫我应的场面是不是很有趣。
一部分机器人先发音,一部分机器人先侦听。
发音的机器人发音完毕后转入侦听,听到声音的机器人回应(发音)。
把几个机器人放在一起,编写程序并下载运行,试一试机器人你叫我应的场面是不是很有趣。
一部分机器人先发音,一部分机器人先侦听。
发音的机器人发音完毕后转入侦听,听到声音的机器人回应(发音)。
/*初始化b=1时,设置该机器人先侦听;初始化b=-1时,设置该机器人先发出声音。
*/voidmain(){intb=1;intmic;while
(1){mic=microphone();printf(mic=%d\n,mic);wait(0.5);if(b==1mic140){b=b*(-1);beep();wait(2.0);}if(b==-1){beep();wait(1.0);b=b*(-1);}}}请用光敏传感器让机器人追光。
机器人放在离光源有一段距离的地方,但光敏传感器能探测到光源的位置,此时,让机器人向光源靠近,足够接近光源时停下来。
请用光敏传感器让机器人追光。
机器人放在离光源有一段距离的地方,但光敏传感器能探测到光源的位置,此时,让机器人向光源靠近,足够接近光源时停下来。
Voidmain(){intright,left,diff,even;while
(1){right=photo
(2));left=photo
(1);diff=right-left;even=(right+left)/2;if(even100)stop();elseif(diff20)drive(60,10);elseif(diff-20)drive(60,-10);elsedrive(60,0)wait(0.1);}}驶请让机器人以最大速度行驶5秒,然后用液晶显示屏显示机器人左轮旋转的圈数(机器人的主动轮每旋转一圈,产生秒,然后用液晶显示屏显示机器人左轮旋转的圈数(机器人的主动轮每旋转一圈,产生33个脉冲)。
voidmain(){rotation
(1);drive(100,0);wait(5.0);printf(left=%f\n,(float)rotation
(1)/33.0);stop();}请用麦克风检测声音,让机器人第一次听到声音时,全速前进;第二次听到声音时,停下来;如此循环。
(有效声音标志请用麦克风检测声音,让机器人第一次听到声音时,全速前进;第二次听到声音时,停下来;如此循环。
(有效声音标志microphone()返回值大于180)Voidmain(){intI=0;intmic;while
(1){mic=microphone();if(mic180)I+=1;if(I==1)drive(100,0);else{stop();I=0;}}}红外避障库函数:
/*红外测障,返回值:
无0,左左1,右右2,前前4。
左发射PD2,右发射PD3,接收PE4*/intir_detector(){intval1,val2,val3,result;val1=read(0x100A)0b10000;/*检测接收到的背景红外信号*/bit_set(0x1008,0b0100);/*打开左红外发射传感器,PD2口*/msleep(2L);/*等待2毫秒*/val3=read(0x100A)0b10000;/*检测接收到的红外信号*/bit_clear(0x1008,0b0100);/*关闭左红外发射传感器*/bit_set(0x1008,0b1000);/*打开右红外发射传感器,PD3口*/msleep(2L);/*等待2毫秒*/val2=read(0x100A)0b10000;/*检测接收到的红外信号*/bit_clear(0x1008,0b1100);/*关闭所有红外发射传感器*/result=((val1~val2)3)|((val1~val3)4);msleep(2L);/*等待2毫秒*/if(result==3)result=4;returnresult;}请用能力风暴机器人做一个简易电子琴,碰撞碰撞环,发出8个不同方位的声音,并且在液晶显示器上,分别将个不同方位的声音,并且在液晶显示器上,分别将8个不同方位的碰撞信息显示出来。
voidmain(){intbump;while
(1){bump=bumper();if(bump==0b0011){printf(font\n);tone(262.0,0.5);}elseif(bump==0b0001){printf(rightandfont\n);tone(294.0,0.5);}elseif(bump==0b0101){printf(right\n);tone(330.0,0.5);}elseif(bump==0b0100){printf(rightandback\n);tone(350.0,0.5);}elseif(bump==0b1100){printf(back\n);tone(393.0,0.5);}elseif(bump==0b1000){printf(leftandback\n);tone(441.0,0.5);}elseif(bump==0b1010){printf(left\n);tone(495.0,0.5);}elseif(bump==0b0010){printf(leftandfont\n);tone(247.0,0.5);}wait(0.5);}}}读取系统时间,此时的系统时间单位是秒,然后通过程序处理后,变为分:
秒:
毫秒分:
秒:
毫秒的显示方式,也就是将系统读出的时间变为具体的分、秒、毫秒值来显示。
voidmain()/*主函数,作为程序入口*/{floatfsec;/*定义浮点数型变量*/intsec,msec,min;/*定义整型变量*/while(bumper()==0)/*当没有碰撞时*/{fsec=seconds();/*读取时间值,单位为秒*/sec=(int)fsec;/*得到所有时间的整数秒值*/msec=(int)((fsec-(float)sec)*100.0);/*得到毫秒的整数值*/min=sec/60;/*得到分的值*/sec=sec-min*60;/*得到秒的值*/if(min10)printf(0%d,min);/*如果分小于10,前面加0显示*/elseprintf(%d,min);/*否则,直接显示分*/if(sec10)printf(:
0%d,sec);/*如果秒小于10,前面加0显示*/elseprintf(:
%d,sec);/*否则,直接显示秒*/if(msec10)printf(:
0%d\n,msec);/*如果毫秒小于10,前面加0显示*/elseprintf(:
%d\n,msec);/*否则,直接显示毫秒*/wait(0.1);/*等待0.1秒*/}}机器人直走校准程序及调试方法。
intdrive_bias=0;voiddriveb(inttrans,introt){introt_bias=(drive_bias*trans)/100;motor(0,trans-(rot+rot_bias));motor(1,trans+(rot+rot_bias));}声与光在不同明暗环境中发不同的声音/*依据光敏传感器检测值的差值计算发声的频率*/floatfreq(intleft,intright){intdelta;floatfrq=100.0;delta=left-right;frq=2500.0*(1.0+((float)delta)/((float)max(left,right)));returnfrq;}/*依据左右光敏检测值的和通过算式计算出发声的间隔时间*/floatperiod(intleft,intright){return(0.0008*(float)(512-(left+right)));}voiddark(){intleft=0;intright=0;while
(1){left=photo
(1);right=photo
(2);tone(freq(left,right),0.1);/*用算出的频率发声*/wait(period(left,right));/*用算出的间隔作为发声的间隔*/}}飞蛾扑火程序:
voidmain(){intr,l;/*定义变量r左光敏l右光敏*/inta1,a2,a3;/*定义标志位a1找光源方向a2靠近光源a3围绕光源转*/intd1,d2;/*定义参数d1靠近光源左右方向参数d2旋转参数*/a1=1;a2=0;a3=0;/*标志位设初值,a1设1则先执行找光源方向*/while
(1){while(a1)/*执行a1找光源*/{r=photo
(2);l=photo
(1);printf(a1:
r=%d,l=%d\n,r,l);if(r240||l240)/*发现光源方向的条件*/{a1=0;a2=1;}/*转到a2执行,靠近光源*/drive(0,20);/*原地转,寻找光源方向*/wait(0.1);}while(a2)/*执行靠近光源*/{r=photo
(2);l=photo
(1);d1=(l-r)*2;/*设置d1参数*/printf(a2:
r=%d,l=%d,d=%d\n,r,l,d1);if(r150||l150)/*到达光源附近的条件*/{a2=0;a3=1;}/*转到a3执行,围绕光源转圈*/elseif(r240l240)/*远离光源的条件*/{a1=1;a2=0;}/*转到a1执行,寻找光源方向*/drive(80,d1);/*靠近光源移动*/wait(0.1);}while(a3)/*执行围绕光源转圈*/{r=photo
(2);d2=(r-150)*2;/*设置d2参数*/printf(a3:
r=%d,d=%d\n,r,d2);drive(80,d2);/*围绕光源转动,先调整轨道,停留在r=150的圆圈轨道上运动*/wait(0.01);}}}跟人走voidmain(){intir=0;/*红外检测变量*/intbmp=0;/*碰撞检测变量*/intold_bmp=0;/*前一次的碰撞检测结果*/intfol_trans_def=80;/*预设的前进速度*/intfol_rot_def=40;/*预设的转弯速度*/printf(Follow\n);/*显示在LCD屏幕上*/while
(1){ir=ir_detector();/*取红外系统检测结果*/bmp=bumper()0b0011;/*检测前左、前右方向上的碰撞*/if(old_bmp(!
bmp))/*连续两次碰撞*/wait(0.5);elseif(bmp)/*如果前方有碰撞*/stop();/*停止运动*/elseif(ir==0)/*前方没有物体*/stop();/*停止运动*/elseif(ir==4)/*前方有物体*/drive(fol_trans_def,0);/*往前追*/elseif(ir==1)/*物体在左侧*/drive(fol_trans_def,(-fol_rot_def));/*转向左*/elseif(ir==2)/*物体在右侧*/drive(fol_trans_def,fol_rot_def);/*转向右*/wait(0.1);/*让运动持续一会*/old_bmp=