j激光测距传感器代码
- 格式:doc
- 大小:42.00 KB
- 文档页数:7
G代码列表本机床由各种G代码及M代码来控制。
以下为G代码列表。
有关M代码信息参看第1-7页。
代码用途类别G00 快速移动运动G01 直线切割运动G02 圆弧CW 运动G03 圆弧CCW 运动G04 静止通用G09 精确停止运动G10 吸盘卸下上料装置G20,G21 选择英制/公制坐标坐标,尺寸G24 穿孔激光G25,G27(用于LC-α)重复定位通用G31 辅助气体选择通用G32 Z轴跟踪传感器ON 专项G33 取消Z轴跟踪传感器专项G40 取消激光光束路径补偿激光光束补偿G41 路径“LEFT”激光光束路径补偿激光光束补偿G42 路径“RIGHT”激光光束路径补偿激光光束补偿G50 返回零点通用G53 设置机床坐标系坐标、尺寸G61 精确停止检查模式运动G64 仿形切割模式运动G65(FO)调用副程序专项G75,G76 多个宏的再调用多用途G77(LC-θ)测量探针的坐标旋转通用G90 绝对编程坐标,尺寸G91 增量编程坐标,尺寸G92 建立坐标系坐标,尺寸G93 原点偏移值坐标,尺寸G95 利用参数调用程序专项G96 模态程序调用专项G97 取消模态程序调用专项G98 多工件设置多用途G107 管子插补(用于可选择旋转台)专项G111 正方形/长方形孔G112 圆形/长圆形孔G113 单D/双D 孔G114 多边形孔G115 弧形切槽(半径端面)孔G116 弧形切槽(平端面)孔G120(LC-θ)测量探针坐标,尺寸G121,G122 HS加工角检测专项G126 螺栓排列(BHC)模板G128 对角线(LAA)模板G129 弧(ARC)模板G130 轴回零专项G136 网格排列X(GRD-X)模板G137 网格排列Y(GRD-Y)模板G140 OVS孔检测专项G141 OVS扩展功能专项G149 取消OVS 专项G150 定制比例/旋转专项G160(LC-θ)间隔弧插补运动G161 间隔角半径插入专项G162 取消间隔角半径专项G163 3D坐标转换专项G164 取消3D坐标转换专项G165 3D转换专项G166 取消3D转换专项G173 U-轴长度补偿专项M代码列表M代码用途类别M00 程序停止通用M代码M02 程序结束通用M代码M10,M11(LC-α)工件夹紧/松开专项M20-M29(LC-α)可检测材料厚度专项M30 结束程序并返回程序开始处通用M代码M33(LC-β/LC-α)吸盘装载/工件上料上下料装置M34(LC-β)板式卸料上下料装置M55(LC-β)取消镜像上下料装置M65(LC-α)储备功能上下料装置M80,M81(LC-α)工件槽开/关通用M代码M96 调用副程序通用M代码M97 结束副程序通用M代码M99(用于FO)结束副程序通用M代码M100 激光模式ON 激光M101 激光模式OFF 激光M102 材料指定激光M103 穿孔模式,启动切割模式激光M104 取消切割模式激光M150,M151,M152(FO) 队列代码通用M代码M180(LC-α)循环工件槽通用M代码M707,M772-M774 更换吸盘上下料装置M720,M721 传感器ON/OFF 激光M722,M723,M727 跟踪传感器校准激光M758 光束ON 激光M790,M791(LC-β)吸盘安装上下料装置M792,M793(LC-β)吸盘安装销子上下料装置机床布置图LC-α与LC-β机床为混合光路系统,可使板材沿X轴方向运动,而激光切割头沿Y轴方向运动。
Arduino的光敏传感器和超声波测距传感器测试代码光敏传感器测试代码使⽤的是⼀个未知名4pin模块, 4pin依次为Vcc, Gnd, DO, AO, 板载⼀个可调电阻以及⼀个LED, 调节电阻⼤⼩, 可以控制LED亮灭和DO输出变化对光亮的灵敏度. AO是模拟输出, 将AO接⾄A5⼝.#define AD5 A5 //定义模拟⼝A5#define LED 13 //定义数字⼝13int intensity = 0;//光照度数值void setup() {pinMode(LED, OUTPUT);Serial.begin(9600);}void loop() {intensity = analogRead(AD5);Serial.print("Intensity = ");Serial.println(intensity);if (intensity > 200) {digitalWrite(LED, LOW);} else {digitalWrite(LED, HIGH);}delay(500); // 500ms}超声波测距传感器测试代码超声波测距使⽤的是4pin的HC-SR04模块, 4pin依次为Vcc, Trig, Echo, Gnd, 将Trig和Echo分别接开发板的7和6脚const int TrigPin = 7;const int EchoPin = 6;float cm;void setup() {Serial.begin(9600);pinMode(TrigPin, OUTPUT);pinMode(EchoPin, INPUT);}void loop() {digitalWrite(TrigPin, LOW); //低⾼低电平发⼀个短时间脉冲去TrigPindelayMicroseconds(2);digitalWrite(TrigPin, HIGH);delayMicroseconds(10);digitalWrite(TrigPin, LOW);cm = pulseIn(EchoPin, HIGH); //回波时间Serial.print("Echo:");Serial.print(cm);cm = (int(cm * 100.0 / 58.0)) / 100.0; //保留两位⼩数Serial.print(" Distance:");Serial.print(cm);Serial.print("cm");Serial.println();delay(1000);}。
传感器是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。
知道了什么是传感器,那么传感器的代码(代号)大家了解多少呢。
代号:依次为主称(传感器)被测量—转换原理—序号①主称——传感器代号C。
②被测量—用一个或两个汉语拼音的第一个大写字母标记。
③转换原理——用一个或两个汉语拼音的第一个大写字母标记。
④序号——用一个阿拉伯数字标记,厂家自定,用来表征产品设计特性、性能参数、产品系列等。
若产品性能参数不变,仅在局部有改动或变动时,其序号可在原序号后面顺序地加注大写字母A、B、C等,(其中I、Q不用)例:应变式位移传感器:C WY-YB-20光纤压力传感器:C Y-GQ-2常用被测量代码表:被测量被测量简称代号被测量被测量简称代号加速度加加速度亮度细胞膜电位磁加加加胞电磁透磁强AAAADBDC电流电场强度电压色度谷氨酸电强色谷氨红外呼流DLDQDYEGA冲击磁透率磁场强度磁通量胆固醇呼吸频率转速生物化学需氧量硬度线加速度心电[ 图]线速度心音角度角加速度磁通胆固呼吸生氧线加心电线速角角加肌电角速[ 气] 密[ 液] 密马赫粘CJCOCQCTDCHPHSHYIIAIDISIYJJA温度照度红外光呼吸流量() 离子活[ 浓] 度声压图像温度[ 体] 温物位位移位置血血液电解质活[ 浓]血电血容血速压[ 膀] 压[ 胃] 压[ 颅] 压[ 食] 压眼电浊紫光真空H +Na +HHDHGHL()H[N]SYTXW[T]WWWWYWZXXDXL肌电[ 图]可见光角速度角位移力露点力矩流量离子密度[ 气体] 密度[ 液体] 密度脉搏马赫数表面粗糙度脑电厚葡糖气热通视电射量蚀厚JDJGJSJWLLDLJLLLZM[Q]M[Y]MMBMHMZ血流血气血容量血流速度血型压力膀胱内压胃肠内压颅内压食道压力[ 分] 压[ 绝] 压[ 微] 压[ 差] 压[ 血] 压Cl -O 2COXQXRXSXXY[B]Y[E]Y[L]Y?敎?潒慭n[S]Y[F]Y[U]Y[W]Y[C]Y[X]Y粘度脑电[ 图]扭矩厚度pH 值葡萄糖气体热通量热流速度视网膜电[ 图]水分射线剂量烧蚀厚度射线NNDNJO(H)PTQRTRLSSDSFSLSOSX眼电[ 图]迎角应力液位浊度振动紫外光重量( 稳重)真空度噪声姿态氢离子活[ 浓] 度钠离子活[ 浓] 度氯离子活YDYJYLYWZZDZGZLZKZSZT[H]H[N]D[Na]H[N]D[CL]H[N]D[O][ 浓] 度氧分压一氧化碳分压[CO]常用转换原理代码表:转换原理转换原理简称代号转换原理转换原理简称代号电解变压器磁电催化场效应管差压磁阻电磁电导场效电化电涡多普电位浮簧光光化AJBYCDCHCUCYCZDCDD光发射感应霍耳晶体管激光晶体振子克拉克电池酶[ 式]声表面波光射晶管晶振克池面波热释微生选择GSGYHEIGJGJZKCMMB电感电化学单结电涡流超声多普勒电容电位器电阻热导浮子- 干簧(核)辐射浮子光学式光电光伏DGDHDJDODPORDWDZEDFHFSFZGGDGF免疫热电热释电热电丝(超)声波伺服涡街微生物涡轮离子选择电板谐振应变压电压阻拆射MYRDRHRSSBSFWJWSWUXJXZYBYDYZZE光化学光导光纤GHGOGQ阻抗转子ZKZZ传感器的特性:(1)传感器的动态性。
激光脉冲测距实验报告——第七组一、实验目的通过学习激光脉冲测距的工作原理;了解激光脉冲测距系统的组成;搭建室模拟激光脉冲测距系统进展正确测距,为今后的工程设计奠定理论根底和工程实践根底。
二、实验原理激光脉冲测距与雷达测距在原理上是完全一样的,如图2.1所示。
在测距点激光发射机向被测目标发射激光脉冲,光脉冲穿过大气到达目标,其中一小局部激光经目标反射后返回测距点,并被测距机上的探测系统接收。
测出从激光发射时刻到反射光被接收时刻之间的时间间隔t,根据光速,即可求出被测目标的距离R 为式中c为光速。
真空中的光速是一个准确的物理常数c0=2.99792458 * 108m/s海平面或近地面的平均大气折射率n为n =1.000275266故近地面大气中的光速c为c=2.9971×108m/s可见,激光测距机的任务就是准确地测定时间间隔t。
当不考虑大气中光速的微小变化时,测距精度ΔR主要是由测时精度Δt确定的实际脉冲激光测距机中是利用时钟晶体振荡器和脉冲计数器来测定时间间隔t的。
时钟晶体振荡器用于产生固定频率的电脉冲振荡,脉冲计数器的作用是对晶振产生的电脉冲个数进展计数。
设晶体振荡器产生的电脉冲频率为f,则脉冲间隔fT1=。
假设从激光脉冲发出时刻脉冲计数器开场计数,到反射光被接收时刻停顿计数,设这段时间脉冲计数器共计得脉冲个数为m,则可计算出被测目标的距离为相应的测距精度为可见,脉冲激光测距机的测距精度由晶振的频率决定。
常用军用激光测距仪的晶振频率有15MHz、30MHz、75MHz和150MHz等,与其相对应的测距精度分别为±l0m、±5m、±2m和±lm。
晶振的频率愈高,测距精度就愈高,但随之而来的,不仅是计数器的技术难度增加,而且要求激光脉冲的宽度愈窄,激光器的难度也增加。
对脉冲测距系统,计数器的“开门〞信号是由取出—小局部发射激光脉冲经光电探测器转换成电信号形成的,计数器的“关门〞信号则是由目标激光回波到达测距机经光电探测器转换成电信号形成的。
激光测距传感使用手册前言尊敬的客户:衷心的感谢您选择了深圳市南方测控技术有限公司的激光测距传感器!为了让您更好的使用本激光测距传感器与防止意外事故的发生,请您在使用本激光测距传感器前仔细的阅读本说明书。
本说明书的版权归属深圳市南方测控技术有限公司所有,如在不影响本激光测距传感器整体性能的前提下所作的修改或更新,恕不另行通知。
激光测距传感器系统说明术语解释➢激光测距:利用激光对目标的距离进行准确测定。
激光测距一般采用两种方式来测量距离:脉冲法和相位法。
➢脉冲激光测距:基于激光脉冲反射时差法原理,测距仪器发射出的激光经被测量目标反射后,激光束被测距仪器接收,测距仪器记录激光往返的时间。
光速和往返时间的乘积的一半,就是测距仪器和被测量物体之间的距离。
➢激光测距传感器:为工业测量之产品,采用工业标准设计、生产和检测,可在线24小时连续实施测量,有的可以多台组网测试。
➢激光安全等级:国际上对激光有统一的分类,激光器分为四类(Class1、Class2、Class3、Class4)。
Class1激光器对人是安全的,Class2激光器对人有较轻的伤害,Class3以上的激光器对人有严重伤害,使用时需特别注意,避免对人眼直射。
➢Class2激光器:指激光器的出口光功率小于1mw,一般认为对人的眼睛是安全的,正常暴露在这种激光器的光束下不会对眼睛的视网膜造成永久性的伤害。
尽管此种激光器是安全的,但也不能长时间的直视激光光束。
如偶尔照射到人眼还不至于引起伤害,但连续观察激光束时能损伤眼睛。
此是对第二级激光器的最重要控制措施。
➢系统概述LPS系列激光测距传感器是一种功能强大的测量精确、无接触式的工业用距离测量设备,它可广泛地被集成用于各种工业用途的控制和监测系统上。
使用图例如下:LPS系列激光测距传感器是一款使用方便的工业应用激光测距仪表,特别为交通、炼钢、仓储、建筑、码头等需要自动进行距离和位置控制的应用而设计研发,具有很高地实用性。
相位激光测距模块技术参数:测量范围:0.045-D(D是最大量程)目前模块有D=40,D=70,D=80,D=100等规格分辨率:0.01毫米(0.00001米)测量精度(标准差):±2.mm(10米内)大于10米计算公式±2+0.05*(D-10),D是距离距离单位:m激光类型:620-690nm激光等级:Ⅱ级,<1mW(二级安全)单次测量时间:0.25秒在距离m处光斑直径:6mm@10m,工作温度:-0~+40℃贮存温度:-20~+60℃重量:约60g尺寸(长×宽×厚):4.8cmX3.7cmX1.8cm供电电压:DC3v-3.3vIO电压:TTL电平兼容3v-5v电压在室内基本无需反光板,近距离内使用黑色目标也可测距,例如黑色皮质钱包表面,室外如果量程内返回无反射则请使用反光板配合.**在恶劣环境下如:阳光过于强烈,环境温度波动太大,反射面效果比较弱,系统电压多高或者过低,测量距离会比较近,结果可能会出现较大误差,此种情况建议配合使用目标反射板****模块使用禁止超出标注的电气范围,使用不符合规定的供电电压可能会损坏模块,5vIO直接相连请设置为若驱动,如果为AVR或者STC单片机,请串联1K欧姆限流电阻**通信接口:模块采用TTL串口进行数据交换,通信速率高达115k(波特率115200)只打开激光,但不测量,可用于瞄准目标(激光打开后自动超时关闭)指令表:指令一览表指令内容应答备注启动单次测量$00022123&确认确认后跟测量数据开灯$0003260130&确认+命令重复开启连续测量$00022426&确认停止连续测量$0003260029&确认+命令重复指令确认$00023335&这是从机的确认指令最后7位是0001643没信号距离太远或激光头发射或接收头被遮挡最后7位是0001542距离太近终止连续测量$00022123&确认+命令重复可以使用单次测量指令在连续测量过成功,终止测量关闭激光$00022123&确认模块不设置休眠模式,如需关闭激光可以使用单次测量指令指令使用建议:1.激光开启,一般用于打开激光后帮助瞄准目标2.单次测量,进行一次测量,建议测距前瞄准目标3.连续测量,用于扫过一个平面或者立体面,如墙角,模块每次返回的数据均包含本次测量距离,最大值,最小值等,并在每个值前面有3位字符用来标记本条数据是否有效4.停止测量,模块未设置低功耗模式,激光打开后不自动关闭,如需要关闭激光,可以发送一次单次测距指令收发数据示例:开启激光:直接开启激光但不测距一般用于人工瞄准如将模块安装到某些设备上进行特定范围内的测距,则本指令可以省略主机发$0003260130&,模块回复确认+指令重复(中间没有+号)$00023335&$0003260130&确认指令重复单次测量模式:单次测量模式需要保证激光照射点在目标表面,如果测距之前不确定激光是否能指向目标表面请执行”开激光”指令主机发$00022123&模块回复$00023335&+测量数据,测量数据解析示例用户在读取单次测量模式的数据时,可以以$判断作为数据头,&作为数据尾(数据10字节应答+18字节测量数据)蓝色共10位(第0-9位):从机在单次测量模式下的应答绿色共7位(第20-27)第:表示距离,7位中的前两位表示整数部分,后5位表示小数部分其余字段保留以备扩展$00023335&$0006210000008916&00.08916米单次测距模式的调试截图-------------------------------------------------------------------------------------------1,模式1的错误码错误码错误原因错误响应时间$00023335&$0006210000001542&距离太近从指令发出到返回错误码大约5秒$00023335&$0006210000001643&未收到回波从指令发出到返回错误码大约5秒$00023335&$0006210000001744&反射过强从指令发出到返回错误码大约5秒$00023335&$0006210000001845&环境光过强从指令发出到返回错误码大约5秒连续测量模式连续测量模式下主机发送一个连续测距指令模块可以执行101(501次连续测量),模块每次返回的数据均包含本次测量距离,最大值,最小值等,并在每个值前面有3位字符用来标记本条数据是否有效,如果测距中出现错误(遮挡到激光发射口,透镜,或者距离太近)会输出错误码,并将测量计数置为9999,并终止本次连续测距,模块在连续测距模式下,每5次测量会关闭激光并重新打开一次,此模式一般用于慢速扫过一个平面或者立体面,如墙角,从而得到最大值和最小值,也可用于实时测距,一次触发百次测量减轻cpu负担,并提高测量速度连续测量模式的数据解析测量数据长度为38字节蓝色(第1-6位)共6位:保留以备未来扩展红色(第7-10位)共4位:测量次数计数,最后一次测量或者出错终止测量时,测量次数计数器等于9999,则本条数据可以忽略,或重发批量测距数据,以用于不间断连续测距黑色(第11-13位)共3位:本次测量测距是否有效,后面意义相同粉红(第14-18位)共5位:本次测量距离浅蓝(第22-26位)共5位:最大值绿色(第30-37)共7位第:表示距离,7位中的前两位表示整数部分,后5位表示小数部分主机发$00022426&模块先给一个10字节应答$00023335&然后返回测距数据,实际模块返回的数据如下图,注意第一次回传测量数据会在前面带一个响应,直接丢弃即可,参考截图中的第一行数据解析示例:$001624000100004855000048550000485550&第1次04.855米最大04.855米最小04.855米(第一次测量三个值一致) $001624001000000136000048550000013627&第10次00.136米最大04.855米最小04.855米$001624049800004830000048310000012121&第498次04.830米最大04.831米最小00.121米$001624999900004830000048310000012117&最后一次,本次数据可舍弃错误的代码示例$001624000100118297001182970011829711&第1次测量数据无效,错误代码18值模式2的错误码模式2连续测量中模块连续返回N次数据,用户可以用$作为数据头,&作为数据尾错误码原因错误响应时间说明$001624999900000015000 000000000000053&距离太从指令发出到返回错误码大约5秒如果连续测量中出现错误,测量会被停止,测量次数计数器(数据的第7到第10位)会自动设置为9999,启动新的一次测量会冲1开始计$001624999900000016000 000000000000054&未收到回波从指令发出到返回错误码大约5秒其余的情况测量数据小于00.045米都是测量错误,附录:外观尺寸和接口:端口电压功能备注VCC3-3.3V模块供电大于3.3v会烧坏GND模块电源地TXD3v-5v模块数据发送引脚可以直接5v单片机相连,推挽输出类型的io要加限流电阻,入不确定请用3.3v单片机相连RXD3v-5v模块接收数据引脚可以直接5v单片机相连,推挽输出类型的io要加限流电阻,入不确定请用3.3v单片机相连Fpc0.5mm8p翻盖式注意事项:用户禁止自行打开本模块或者焊接本模块上的任何器件,禁止将模块直视太阳将模块接触液体用酒精或者有机溶剂擦拭镜头用收或其他物体直接擦拭镜头采用额定电压以外的供电电压。
某型手持激光测距机几种错误代码故障检排发表时间:2016-08-16T16:14:10.920Z 来源:《低碳地产》2015年第16期作者:孙永清[导读] 某型手持激光测距机在出现故障时,机内显示器会显示几种错误代码。
现将这几种错误代码进行分析,供有关维修人员借鉴。
孙永清中国人民解放军南京3304工厂维修中心江苏南京 210000 某型手持激光测距机在出现故障时,机内显示器会显示几种错误代码。
现将这几种错误代码进行分析,供有关维修人员借鉴。
故障现象一:在对目标进行激光测距的过程中,机内显示器中显示系统错误代码“FF 2”。
故障原因分析:错误代码“FF 2”表示手持激光测距机无高压产生。
该故障可能产生的原因有以下几点:⑴操作手在测距过程中触发按钮开关按下的持续时间<1秒;⑵高速电压比较器的D1(LM119H)故障;⑶开关管V20、V21(3DK2B)故障;⑷高频小功率晶体管V19(3CG966)故障。
故障排除:a)首先检查测距过程中触发按钮开关按下的持续时间,一般要求≥1s,如果时间≤1s,就重新操作一次;b)按下充电按钮,D1的4脚接地,用示波器检测到D1的1脚输出应为高电平,若不为高电平则更换D1;c)若D1的1脚输出为高电平,这时V21(3DK2B)应导通,若不导通则更换V21(3DK2B);d)若V21导通,则V19(3CG966)应导通,若不导通则更换V19。
故障现象二:在对目标进行激光测距的过程中,机内显示器中显示系统错误代码“FF 3或FF 4”。
故障原因分析:错误代码“FF 3”表示测距机+9V产生异常;错误代码“FF 4”表示测距机-9V产生异常。
该故障可能产生的原因有以下几点:⑴变压器T2故障;⑵三极管V24、V25、(3DK14E)的故障;⑶稳压模块N5(CW79L09)有故障;⑷稳压模块N6(CW78L06)的故障。
故障排除:a)用示波器探头检测变压器T2-12和T2-10的两个检测点,应有输出周期为125us、±15V的两组周期信号,若检测不到这两组信号,则更换T2;b)用示波器应能检测到经整流管V30~V33(IN4148)和V26~V29(IN4148)后的直流脉冲信号,若没有该信号则更换整流管V30~V33或V26~V29中损坏的器件;c)用万用表检测N6(CW78L09)的输出端是否有+9V,若没有则更换N6;d)用万用表检测N5(CW79L09)的输出端是否有-9V,若没有则更换N5。
/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以内部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//****************************************************************************** *****///具有模式选择.#include<reg52.h>#define UC unsigned char#define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit GX = P3^1;//K7 //P3^3口(K2)为修改键,sbit SX = P3^6;//K6 //P3^2(K3)为测量键.sbit BX = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进行模式切换(K1、K4键)void xiaxian(); //修改函数,用来修改下限void shangxian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI max[3]={3,0,0}; //MIN,MAX 用来存储最大和最小值void MINxianshi(UI); //最小范围和最大范围的显示void MAXxianshi(UI);UC code CharacterCode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管数字字符(P2口)/********************************主函数*********************************************/void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MINxianshi(40); //1.50169000sMAXxianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MAX, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0x00; //防止最后显示的那个数码管一直亮MAX = max[0]*100 + max[1]*10 + max[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进行测量{while(1) /*先进行模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //结束测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0x00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MAX){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示结束}}/****************************************************************************** *****/void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0x00;//定时器的初值,定时器的定时为65536us,TL0 = 0x00;}/****************************************************************************** *****/void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){xiaxian();while(QD==0);shangxian();}/****************************************************************************** ****/void MINxianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0x00;delay(55500);}void MAXxianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]];delay(500);}P2 =~ 0x00;delay(55500);}/****************************************************************************** *****/void delay(UI T) //延时程序{while(T--);}/****************************************************************************** *****/void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;PX1 = 0;PT0 = 1;PX0 = 0;IT1 = 1; //外部中断0为跳变沿触发EX1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发EX0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0x01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0x00;//定时器的初值,定时器的定时为50us.TL0 = 0x00;/*1号定时器不用,所以没有TH1,TL1*/}/****************************************************************************** *****/void xiaxian() //修改下限{while(1){if(BX==0)//百位{P2=~0x00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(SX==0)//十位{P2=~0x00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(GX==0)//个位{P2=~0x00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0xff;break;}}}void shangxian() //修改上限{while(1){if(BX==0)//百位{P2=~0x00;max[0]++;if(max[0]==10)max[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(100);if(SX==0)//十位{P2=~0x00;max[1]++;if(max[1]==10)max[1]=0;delay(60000);标准文档实用文案}a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]]; delay(100);if(GX==0)//个位{P2=~0x00;max[2]++;if(max[2]==10)max[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]]; delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0xff;while(QD == 0);break;}}}/****************************************************************************** ******/。
J了芦中华人民共和国国家计量技术规范JJF1051—2009计量器具命名与分类编码De s i gn a t io n a n d C la ss if ica ti on C o d efor Measuring Instrument2009—08一侣发布2010—02—18实施国家质量监督检验检疫总局发布计量器具F l里看旨步七』,~一“7一一’一一~一{:0 命名与分类编码;JJF 1051--2009 3i代替JJF 1051--1996 5D e si g n a t i o n a n d Cl as sif ic at io n5k,、。
—,.d2Co d e f or Measuring Instrument本规范经国家质量监督检验检疫总局于2009年8月18El批准,并自2010年2月18日起施行。
归口单位:全国法制计量管理计量技术委员会主要起草单位:上海市计量测试技术研究院参加起草单位:国家质量监督检验检疫总局计量司本规范由全国法制计量管理计量技术委员会负责解释本规范主要起草人:郑春蓉(上海市计量测试技术研究院)江鲲(上海市计量测试技术研究院)蒋和平(上海市计量测试技术研究院)参加起草人:马爱文(国家质量监督检验检疫总局)朱美娜(国家质量监督检验检疫总局)JJF 1051_2009目录1范围·1 2命名原则 · l 3命名范例-1 4分类及排序原则 -2 5编码原则-36分类及编码范例·37税则号·5 附录A 计量器具名称及分类代码 (1 ;^8计量器具名称及分类代码 ·5 6JJF1051--2009计量器具命名与分类编码为进一步完善我国对计量器具的法制管理,规范计量器具命名,便于计量器具信息化管理,特制定本计量技术规范(以下简称规范)。
1范围本规范适用于列入《中华人民共和国依法管理的计量器具目录(型式批准部分)》(以下简称型式批准目录)、《中华人民共和国强制检定的工作计量器具目录》(以下简称强制检定目录)等依法管理的计量器具的命名与分类编码,其他计量器具可参照执行。
测距码名词解释
测距码(英文:Range Code)是一种用于测量距离的编码系统。
它通常由一系列的数字或字符组成,用来表示从测距仪或传感器测得的距离值。
测距码可以应用于各种测距技术和设备,包括激光测距仪、超声波测距传感器、雷达测距系统等。
它通过将测得的距离值转化为特定的编码形式,方便了距离的传输和处理。
测距码的具体形式和编码规则可以根据具体的测距设备和应用而有所不同。
例如,在激光测距仪中,测距码可能是以十进制或二进制形式表示的数字值,表示从激光器发射到目标物体反射回来的时间差或光程距离。
在雷达测距系统中,测距码可能是以脉冲或连续波形式的信号,用来表示目标物体与雷达之间的距离。
测距码在测量、导航、遥感等领域广泛应用。
它提供了一种简便、准确的方法来获取目标物体与测距设备之间的距离信息,为各种应用场景中的定位、导航和控制等任务提供支持。
【关键字】精品激光传感器说明书篇一:激光测距仪使用说明激光测距仪使用说明一、使用前的准备(一)电池的装入/更换打开仪器尾部的固定挡板。
向前推卡钮,向下将底座取下。
按住红色的卡钮推开电池盒盖。
安装或更换电池。
关闭电池盒盖,安装底座和卡扣。
当电池的电压过低时,显示屏上将持续闪烁显示电池的标志{B,21}。
此时应及时更换电池。
1、按照极性正确装入电池。
2、使用碱性电池(建议不要使用充电电池)。
3、当长时间不使用仪器时,请取出电池,以避免电池的腐蚀。
更换电池后,设置和储存的值都保持不变。
(二)多功能底底座固定挡板可以在下面的测量情况下使用:1、从边缘测量,将固定挡板拉出,直到听到卡入的声音。
2、从角落测量,将固定挡板拉出,直到听到卡入的声音,轻轻将固定挡板向右推,此时固定挡板完全展开。
仪器自带的传感器将辨认出固定挡板的位置,并将自动设置测量其准点。
(三)内置的望远镜瞄准器在仪器的右部有一个内置的望远镜瞄准器。
此望远镜瞄准器为远距离测量起到辅助的作用。
通过瞄准器上的十字丝可以精确地观察到测量目标。
在30米以上的测量距离,激光点会显示在十字线的正中。
而在30米以下的测量距离,激光点不在十字线中间。
(四)气泡一体化的水泡使仪器更容易调平。
(五)键盘1、开/测量键2、第二级菜单功能3、加+键4、计时(延迟测量)键5、等于[=]键6、面积/体积键7、储存键8、测量基准边键9、清除/关键10、菜单键11、照明键12、间接测量(勾股定律)键13、减-键14、BLUETOOTH(六)显示屏1、关于错误测量的信息2、激光启动3、周长4、最大跟踪测量值5、最小跟踪测量值6、测量基准边7、调出储存值8、储存常数9、主显示10、单位,包括乘方立方(2/3)11、顶的面积12、墙面积13、3个额外显示(如:测量中间值)14、BLUETOOTH蓝牙开/关15、第二级菜单功能开16、硬件故障17、间接测量-利用勾股定律18、间接测量-利用勾股定律-部分高度19、面积/体积20、带常数的测量21、电池充电量显示二、菜单功能(一)设置在菜单中可以改变设置,并将其长久保存,并在关机和更换电池后不改变。
传感器和行迹的编程代码传感器和行迹编程代码是现今科技领域中非常重要的概念,它们的运用已经深深渗透到了我们的生活中。
本文将从传感器和行迹的基本原理、编程代码实现以及实际应用方面进行详细讲解,旨在帮助读者全面了解和掌握这两个关键技术。
首先,我们来了解一下传感器。
传感器是一种能够感知环境中某种物理量或者化学变化的装置,可以将被感知的信息转化为电信号或其他形式的信号输出。
常见的传感器有温度传感器、光线传感器、声音传感器等等。
传感器可以通过Arduino等单片机或者电子开发板进行编程控制。
下面是一个使用光线传感器的示例代码:```include <Wire.h>include <BH1750.h> // 光线传感器库BH1750 lightMeter; // 创建光线传感器实例void setup() {Serial.begin(9600);lightMeter.begin(); // 初始化光线传感器}void loop() {uint16_t lux = lightMeter.readLightLevel(); // 读取光线强度Serial.println(lux); // 输出光线强度delay(1000);}```以上代码中,首先我们引入了Wire和BH1750这两个库,Wire库用于I2C通信,BH1750库则是用来操作光线传感器的。
在setup函数中,我们通过Serial.begin来初始化串口通信,并调用lightMeter.begin()来初始化光线传感器。
在循环的loop函数中,我们使用lightMeter.readLightLevel函数来读取光线强度,并通过Serial.println输出到串口上,最后通过delay函数设置每秒钟输出一次。
接下来我们来了解一下行迹编程代码。
行迹编程代码指的是通过编程控制行迹小车等设备的运动轨迹。
行迹小车通常配备了红外传感器,用来探测前方的障碍物,并根据传感器的反馈来进行相应的动作。
#include <REG52.h>#include <INTRINS.h>unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40}; unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,25,28,31,34,38,41,44,48,50,53,56,59,63,66,69,72,75,78,81,84,88,91,94,97};unsigned char displaycount;unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};unsigned char timecount;unsigned char readdata[8];sbit DQ=P3^7;bit sflag;bit resetpulse(void){unsigned char i;DQ=0;for(i=255;i>0;i--);DQ=1;for(i=60;i>0;i--);return(DQ);for(i=200;i>0;i--);}void writecommandtods18b20(unsigned char command) {unsigned char i;unsigned char j;for(i=0;i<8;i++){if((command & 0x01)==0){DQ=0;for(j=35;j>0;j--);DQ=1;}else{DQ=0;for(j=2;j>0;j--);DQ=1;for(j=33;j>0;j--);}command=_cror_(command,1);}}unsigned char readdatafromds18b20(void) {unsigned char i;unsigned char j;unsigned char temp;temp=0;for(i=0;i<8;i++){temp=_cror_(temp,1);DQ=0;_nop_();_nop_();DQ=1;for(j=10;j>0;j--);if(DQ==1){temp=temp | 0x80;}else{temp=temp | 0x00;}for(j=200;j>0;j--);}return(temp);}void main(void){TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;ET0=1;EA=1;while(resetpulse());writecommandtods18b20(0xcc); writecommandtods18b20(0x44);TR0=1;while(1){;}}void t0(void) interrupt 1 using 0{unsigned char x;unsigned int result;TH0=(65536-4000)/256;TL0=(65536-4000)%256;if(displaycount==2){P0=displaycode[displaybuf[displaycount]] | 0x80;}else{P0=displaycode[displaybuf[displaycount]];}P2=displaybit[displaycount];displaycount++;if(displaycount==8){displaycount=0;}timecount++;if(timecount==150){timecount=0;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0xbe);readdata[0]=readdatafromds18b20();readdata[1]=readdatafromds18b20();for(x=0;x<8;x++){displaybuf[x]=16;}sflag=0;if((readdata[1] & 0xf8)!=0x00){sflag=1;readdata[1]=~readdata[1];readdata[0]=~readdata[0];result=readdata[0]+1;readdata[0]=result;if(result>255){readdata[1]++;}}readdata[1]=readdata[1]<<4; readdata[1]=readdata[1] & 0x70; x=readdata[0];x=x>>4;x=x & 0x0f;readdata[1]=readdata[1] | x;x=2;result=readdata[1];while(result/10){displaybuf[x]=result%10;result=result/10;x++;}displaybuf[x]=result;if(sflag==1){displaybuf[x+1]=17;}x=readdata[0] & 0x0f;x=x<<1;displaybuf[0]=(dotcode[x])%10;displaybuf[1]=(dotcode[x])/10;while(resetpulse());writecommandtods18b20(0xcc);writecommandtods18b20(0x44);}}。
#pragma once#include"afxcmn.h"#include"TabSheet.h"#include"Control.h"#include"Setting.h"#include"Save.h"class CLidarLKLDlg : public CDialog{public:CLidarLKLDlg(CWnd* pParent = NULL);enum { IDD = IDD_LIDARLKL_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);protected:HICON m_hIcon;virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:CTabSheet m_tabctrl;CControl m_control;CSetting m_setting;CSave m_save;};// LidarLKLDlg.cpp :#include"stdafx.h"#include"LidarLKL.h"#include"LidarLKLDlg.h"#ifdef_DEBUG#define new DEBUG_NEW#endifclass CAboutDlg : public CDialog{public:CAboutDlg();enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CLidarLKLDlg::CLidarLKLDlg(CWnd* pParent/*=NULL*/): CDialog(CLidarLKLDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CLidarLKLDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_Control(pDX, IDC_TAB1, m_tabctrl);}BEGIN_MESSAGE_MAP(CLidarLKLDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CLidarLKLDlg::OnInitDialog(){CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);m_tabctrl.AddPage(_T("控制界面"),&m_control,IDD_DIALOG1);m_tabctrl.AddPage(_T("测量设置"),&m_setting,IDD_DIALOG2);m_tabctrl.AddPage(_T("实时数据"),&m_save,IDD_DIALOG3);m_tabctrl.Show();return TRUE;}void CLidarLKLDlg::OnSysCommand(UINT nID, LPARAM lParam) {if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}void CLidarLKLDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this);SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}HCURSOR CLidarLKLDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CLidarLKLDlg::OnBUTCDaoShu(){UpdateData(TRUE);if (OpenFileNum <= 0){MessageBox("请再试一次","Error");return;}DaoShuSetting Dlg;if(Dlg.DoModal() == IDOK){;}else{return ;}UpdateData(FALSE);Butonflg = 0 ;; int nnr,nnl;int i,j,k;nnr= (Daoshunp-1)/2 ;nnl= (Daoshunp-1)/2 ;double m_Pointtempy =0.0;switch(DaoshuCalculat){case 0 :{Smooth(Daoshunp,nnr ,nnr,1 ,3 );for (k = 0; k < OpenFileNum; k++){for (i = nnr+1; i < CurInfo[k].m_PointNum - nnl-2; i++){m_Pointtempy =0.0;for (j = 0;j < Daoshunp; j++)m_Pointtempy += aaa[j]*CurInfo[k].m_Pointfloaty[i- nnr + j];CurInfo[k].m_DFdY[i] = m_Pointtempy;}}m_SpecturmLine.Clear();for ( i = 0; i < OpenFileNum; i++){for ( j = nnr + 3; j < CurInfo[i].m_PointNum - nnl-2; j++){m_SpecturmLine.AddValue(CurInfo[i].m_Pointfloatx[j],CurInfo[i].m_DFdY[j], i);}}nStyleflag = InitialAxis(1);m_SpecturmLine.UpdateCurve(XTotalMin, YTotalMax + 0.005, XTotalMax - XTotalMin, YTotalMax + 0.005 - (YTotalMin - 0.005));break;}case 1 :{Smooth(Daoshunp,nnr ,nnr,2 ,3 );for (k = 0; k < OpenFileNum; k++){for (i = nnr+1; i < CurInfo[k].m_PointNum-nnl-2;i++){m_Pointtempy =0.0;for (j = 0;j < Daoshunp; j++)m_Pointtempy += aaa[j]*CurInfo[k].m_Pointfloaty[i-nnr+j]*2;CurInfo[k].m_DSdY[i] = m_Pointtempy;}}m_SpecturmLine.Clear();for (i = 0; i < OpenFileNum; i++){for (j = nnr + 3; j < CurInfo[i].m_PointNum - nnl-2; j++){m_SpecturmLine.AddValue(CurInfo[i].m_Pointfloatx[j],CurInfo[i].m_DSdY[j], i);}}nStyleflag = InitialAxis(1);m_SpecturmLine.UpdateCurve(XTotalMin, YTotalMax + 0.005, XTotalMax - XTotalMin, YTotalMax + 0.005 - (YTotalMin - 0.005));break;}default:{m_SpecturmLine.Clear();for (int k = 0; k <= OpenFileNum; k++){for (int j = 1; j < CurInfo[k].m_PointNum; j++){m_SpecturmLine.AddValue(CurInfo[k].m_Pointfloatx[j],CurInfo[k].m_Pointfloaty[j], k);}}InitialAxis(5);m_SpecturmLine.UpdateCurve(XTotalMin, YTotalMax + 0.005, XTotalMax - XTotalMin, YTotalMax + 0.005 - (YTotalMin - 0.005));break;}}}void CLidarLKLDlg::OnButHelp(){// TODO: Add your control notification handler code herevoid CLidarLKLDlg::OnButDiffCalculation(){UpdateData(TRUE);if (OpenFileNum <= 0){MessageBox("请重新输入","Error");return;}if (bFileStyleFloder== TRUE){OPENFILENAME ofn;TCHAR szFile[MAX_PATH];ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = NULL;ofn.lpstrFile = szFile;ofn.lpstrFile[0] = _T('\0');ofn.nMaxFile = sizeof(szFile);ofn.lpstrFilter = _T("TXT files (*.txt)\0*.txt\0All files (*.*)\0*.*\0\0 ");ofn.nFilterIndex = 1;ofn.lpstrFileTitle = NULL;ofn.lpstrTitle =_T( "打开TXT文件");ofn.nMaxFileTitle = 0;ofn.lpstrInitialDir = _T("Record\\");ofn.hwndOwner = GetSafeHwnd();ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;if(GetOpenFileName(&ofn)){m_SpecturmLine.Clear();CStdioFile File;File.Open(szFile,CFile::modeRead);CString FileData;CurInfo[diffopenfilenum+10].FileNameShow = (strrchr(szFile, '\\') + 1);char TempStr1[10];char TempStr2[10];memset(TempStr1,'\0',10);memset(TempStr2,'\0',10);CString str_y;int i=0;while(File.ReadString(FileData)){sscanf(FileData,"%s %s",TempStr1,TempStr2);CurInfo[diffopenfilenum+10].m_Pointfloatx[i] = atof(TempStr1);str_y.Format("%d%s",0,TempStr2);CurInfo[diffopenfilenum+10].m_Pointfloaty[i] = atof(str_y);CurInfo[diffopenfilenum+10].m_diffTemY[i] = CurInfo[diffopenfilenum+10].m_Pointfloaty[i] - CurInfo[NowSelectCur].m_Pointfloaty[i];i++;}CurInfo[diffopenfilenum+10].m_PointNum = i;for (int k = 0; k <= diffopenfilenum; k++){for (int j = 1; j < CurInfo[k+10].m_PointNum; j++){m_SpecturmLine.AddValue(CurInfo[k+10].m_Pointfloatx[j], CurInfo[k+10].m_diffTemY[j] , k + 10);}}m_wndCombox2.InitBSColorCB(1);m_wndCombox2.SetCurSel(0);nStyleflag = InitialAxis(2);diffopenfilenum++;if (diffopenfilenum == 10){diffopenfilenum = 0;m_SpecturmLine.Clear();}}m_SpecturmLine.UpdateCurve(XTotalMin, YTotalMax + 0.005, XTotalMax - XTotalMin, YTotalMax + 0.005 - (YTotalMin - 0.005));}else{OPENFILENAME ofn;TCHAR szFile[MAX_PATH];bFileStyleFloder = FALSE;ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = NULL;ofn.lpstrFile = szFile;ofn.lpstrFile[0] = _T('\0');ofn.nMaxFile = sizeof(szFile);ofn.lpstrFilter = _T("SPC files (*.spc)\0*.spc\0All files (*.*)\0*.*\0\0 ");ofn.nFilterIndex = 1;ofn.lpstrFileTitle = NULL;ofn.lpstrTitle =_T( "打开SPC文件");ofn.nMaxFileTitle = 0;ofn.lpstrInitialDir = _T("Record\\");ofn.hwndOwner = GetSafeHwnd();ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;if(GetOpenFileName(&ofn)){m_SpecturmLine.Clear();CSpcFile SpcFile;CFile File;File.Open(szFile, CFile::modeRead, NULL);SpcFile.Read(&File);CurInfo[diffopenfilenum+10].m_PointNum = SpcFile.spchdr.fnpts;CurInfo[diffopenfilenum+10].FileNameShow = (strrchr(szFile, '\\')+1);for (int q = 0; q < CurInfo[diffopenfilenum+10].m_PointNum; q++){CurInfo[diffopenfilenum+10].m_Pointfloatx[q] = SpcFile.xData[q];CurInfo[diffopenfilenum+10].m_diffTemY[q] =SpcFile.yData[q] - CurInfo[NowSelectCur].m_Pointfloaty[q];}for (int k = 0; k <= diffopenfilenum; k++){for (int j = 0; j < CurInfo[k+10].m_PointNum; j++){m_SpecturmLine.AddValue(CurInfo[k+10].m_Pointfloatx[j], CurInfo[k+10].m_diffTemY[j], k+10);}}nStyleflag = InitialAxis(2);diffopenfilenum++; if (diffopenfilenum == 10){diffopenfilenum = 0;m_SpecturmLine.Clear();}}m_SpecturmLine.UpdateCurve(XTotalMin, YTotalMax + 0.005, XTotalMax - XTotalMin, YTotalMax + 0.005 - (YTotalMin - 0.005));}UpdateData(FALSE);}// TabSheet.h#pragma once// CTabSheet#define MAX_PAGES 10class CTabSheet : public CTabCtrl{DECLARE_DYNAMIC(CTabSheet)public:CTabSheet();virtual ~CTabSheet();protected:DECLARE_MESSAGE_MAP()public:afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);BOOL AddPage(CString szTitle, CDialog * pDialog, UINT ID);void Show(UINT nIdx = 0);void SetRect(UINT nIdx);public:UINT m_nNumOfPages;CDialog *m_pPages[MAX_PAGES];UINT m_IDD[MAX_PAGES];CString m_Title[MAX_PAGES];UINT m_nCurrentPage;};// TabSheet.cpp#include"stdafx.h"#include"TabSheet.h"// CTabSheetIMPLEMENT_DYNAMIC(CTabSheet, CTabCtrl)CTabSheet::CTabSheet(){m_nNumOfPages = 0;m_nCurrentPage = 0;}CTabSheet::~CTabSheet(){}BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl)ON_NOTIFY_REFLECT(TCN_SELCHANGE, &CTabSheet::OnTcnSelchange) END_MESSAGE_MAP()// CTabSheet message handlersBOOL CTabSheet::AddPage(CString szTitle, CDialog * pDialog, UINT ID){if (MAX_PAGES == m_nNumOfPages){return FALSE;}m_nNumOfPages++;m_pPages[m_nNumOfPages-1] = pDialog;m_IDD[m_nNumOfPages-1] = ID;m_Title[m_nNumOfPages-1] = szTitle;return TRUE;}void CTabSheet::Show(UINT nIdx){ASSERT(nIdx < m_nNumOfPages);UINT idx = 0;for (idx = 0; idx < m_nNumOfPages; idx++){m_pPages[idx]->Create(m_IDD[idx], this);InsertItem(idx, m_Title[idx]);}SetRect(nIdx);SetCurFocus(nIdx);}void CTabSheet::SetRect(UINT nIdx){CRect tabRect, itemRect;int nX = 0, nY = 0, nXc = 0, nYc = 0;UINT nCount = 0;GetClientRect(&tabRect);GetItemRect(0, &itemRect);nX = itemRect.left;nY = itemRect.bottom + 1;nXc = tabRect.right - itemRect.left - 2;nYc = tabRect.bottom - nY - 2;for (nCount = 0; nCount < m_nNumOfPages; nCount++){if ( nCount == nIdx ) {m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc,SWP_SHOWWINDOW);}else{m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc,SWP_HIDEWINDOW);}}}void CTabSheet::OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult){if (m_nCurrentPage != GetCurFocus()){m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE);m_nCurrentPage = GetCurFocus();m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW);}*pResult = 0;}// CSerialPort.h#ifndef __SERIALPORT_H__#define __SERIALPORT_H__#define WM_COMM_BREAK_DETECTED WM_USER+1#define WM_COMM_CTS_DETECTED WM_USER+2#define WM_COMM_DSR_DETECTED WM_USER+3#define WM_COMM_ERR_DETECTED WM_USER+4#define WM_COMM_RING_DETECTED WM_USER+5#define WM_COMM_RLSD_DETECTED WM_USER+6 // The RLSD(receive-line-signal-detect) signal changed state.#define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.#define WM_COMM_RXFLAG_DETECTED WM_USER+8 // The event character was received and placed in the input buffer.#define WM_COMM_TXEMPTY_DETECTED WM_USER+9 // The last character in the output buffer was sent.class CSerialPort{public:// contruction and destructionCSerialPort();virtual~CSerialPort();// port initialisationBOOL InitPort(CWnd* pPortOwner, UINT portnr, UINT baud, char parity, UINT databits, UINT stopsbits, DWORD dwCommEvents, UINT nBufferSize);// start/stop comm watchingBOOL StartMonitoring();BOOL RestartMonitoring();BOOL StopMonitoring();DWORD GetWriteBufferSize();DWORD GetCommEvents();DCB GetDCB();void WriteToPort(char* string);protected:// protected memberfunctionsvoid ProcessErrorMessage(char* ErrorText);static UINT CommThread(LPVOID pParam);static void ReceiveChar(CSerialPort* port, COMSTAT comstat);static void WriteChar(CSerialPort* port);// threadCWinThread* m_Thread;// synchronisation objectsCRITICAL_SECTION m_csCommunicationSync;BOOL m_bThreadAlive;HANDLE m_hShutdownEvent;HANDLE m_hComm;HANDLE m_hWriteEvent;HANDLE m_hEventArray[3];OVERLAPPED m_ov;COMMTIMEOUTS m_CommTimeouts;DCB m_dcb;CWnd* m_pOwner;UINT m_nPortNr;char* m_szWriteBuffer;DWORD m_dwCommEvents;DWORD m_nWriteBufferSize;};#endif __SERIALPORT_H__// CSerialPort.cpp#include"stdafx.h"#include"SerialPort.h"#include<assert.h>CSerialPort::CSerialPort(){m_hComm = NULL;m_ov.Offset = 0;m_ov.OffsetHigh = 0;m_ov.hEvent = NULL;m_hWriteEvent = NULL;m_hShutdownEvent = NULL;m_szWriteBuffer = NULL;m_bThreadAlive = FALSE;}CSerialPort::~CSerialPort(){do{SetEvent(m_hShutdownEvent);} while (m_bThreadAlive);TRACE("Thread ended\n");delete [] m_szWriteBuffer;}// Initialize the port. This can be port 1 to 4.BOOL CSerialPort::InitPort(CWnd* pPortOwner,UINT portnr,UINT baud,char parity,UINT databits,UINT stopbits,DWORD dwCommEvents,UINT writebuffersize){assert(portnr > 0 && portnr < 5);assert(pPortOwner != NULL);if (m_bThreadAlive){do{SetEvent(m_hShutdownEvent);} while (m_bThreadAlive);TRACE("Thread ended\n");}if (m_ov.hEvent != NULL)ResetEvent(m_ov.hEvent);m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (m_hWriteEvent != NULL)ResetEvent(m_hWriteEvent);m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (m_hShutdownEvent != NULL)ResetEvent(m_hShutdownEvent);m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);m_hEventArray[0] = m_hShutdownEvent;m_hEventArray[1] = m_ov.hEvent;m_hEventArray[2] = m_hWriteEvent;InitializeCriticalSection(&m_csCommunicationSync);m_pOwner = pPortOwner;if (m_szWriteBuffer != NULL)delete [] m_szWriteBuffer;m_szWriteBuffer = new char[writebuffersize];m_nPortNr = portnr;m_nWriteBufferSize = writebuffersize;m_dwCommEvents = dwCommEvents;BOOL bResult = FALSE;char *szPort = new char[50];char *szBaud = new char[50];EnterCriticalSection(&m_csCommunicationSync);if (m_hComm != NULL){CloseHandle(m_hComm);m_hComm = NULL;}sprintf(szPort, "COM%d", portnr);sprintf(szBaud, "baud=%d parity=%c data=%d stop=%d", baud, parity, databits, stopbits);m_hComm = CreateFile(szPort, // communication port string (COMX)GENERIC_READ | GENERIC_WRITE, // read/write types0, // comm devices must be opened with exclusive accessNULL, // no security attributesOPEN_EXISTING, // comm devices must use OPEN_EXISTINGFILE_FLAG_OVERLAPPED, // Async I/O0); // template must be 0 for comm devicesif (m_hComm == INVALID_HANDLE_VALUE){delete [] szPort;delete [] szBaud;return FALSE;}m_CommTimeouts.ReadIntervalTimeout = 1000;m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;m_CommTimeouts.ReadTotalTimeoutConstant = 1000;m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;m_CommTimeouts.WriteTotalTimeoutConstant = 1000;if (SetCommTimeouts(m_hComm, &m_CommTimeouts)){if (SetCommMask(m_hComm, dwCommEvents)){if (GetCommState(m_hComm, &m_dcb)){m_dcb.fRtsControl = RTS_CONTROL_ENABLE;if (BuildCommDCB(szBaud, &m_dcb)){if (SetCommState(m_hComm, &m_dcb));elseProcessErrorMessage("SetCommState()");}elseProcessErrorMessage("BuildCommDCB()");}elseProcessErrorMessage("GetCommState()");}elseProcessErrorMessage("SetCommMask()");}elseProcessErrorMessage("SetCommTimeouts()");delete [] szPort;delete [] szBaud;PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);LeaveCriticalSection(&m_csCommunicationSync);TRACE("Initialisation for communicationport %d completed.\nUse Startmonitor to communicate.\n", portnr);return TRUE;}UINT CSerialPort::CommThread(LPVOID pParam){CSerialPort *port = (CSerialPort*)pParam;port->m_bThreadAlive = TRUE;DWORD BytesTransfered = 0;DWORD Event = 0;DWORD CommEvent = 0;DWORD dwError = 0;COMSTAT comstat;BOOL bResult = TRUE;if (port->m_hComm)PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);for (;;){// Make a call to WaitCommEvent(). This call will return immediatly// because our port was created as an async port (FILE_FLAG_OVERLAPPED// and an m_OverlappedStructerlapped structure specified). This call will cause the// m_OverlappedStructerlapped element m_OverlappedStruct.hEvent, which is part of the m_hEventArray to// be placed in a non-signeled state if there are no bytes available to be read,// or to a signeled state if there are bytes available. If this event handle// is set to the non-signeled state, it will be set to signeled when a// character arrives at the port.// we do this for each port!bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov);if (!bResult){switch (dwError = GetLastError()){case ERROR_IO_PENDING:{break;}case 87:{break;}default:{port->ProcessErrorMessage("WaitCommEvent()");break;}}}else{bResult = ClearCommError(port->m_hComm, &dwError, &comstat);if (comstat.cbInQue == 0)continue;}// Main wait function. This function will normally block the thread// until one of nine events occur that require action.Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);switch (Event){case 0:{port->m_bThreadAlive = FALSE;AfxEndThread(100);break;}case 1:{GetCommMask(port->m_hComm, &CommEvent);if (CommEvent & EV_CTS)::SendMessage(port->m_pOwner->m_hWnd,WM_COMM_CTS_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);if (CommEvent & EV_RXFLAG)::SendMessage(port->m_pOwner->m_hWnd,WM_COMM_RXFLAG_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);if (CommEvent & EV_BREAK)::SendMessage(port->m_pOwner->m_hWnd,WM_COMM_BREAK_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);if (CommEvent & EV_ERR)::SendMessage(port->m_pOwner->m_hWnd,WM_COMM_ERR_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);if (CommEvent & EV_RING)::SendMessage(port->m_pOwner->m_hWnd,WM_COMM_RING_DETECTED, (WPARAM) 0, (LPARAM) port->m_nPortNr);if (CommEvent & EV_RXCHAR)ReceiveChar(port, comstat);break;}case 2:{// Write character event from portWriteChar(port);break;}} // end switch} // close forever loopreturn 0;}BOOL CSerialPort::StartMonitoring(){if (!(m_Thread = AfxBeginThread(CommThread, this)))return FALSE;TRACE("Thread started\n");return TRUE;}BOOL CSerialPort::RestartMonitoring(){TRACE("Thread resumed\n");m_Thread->ResumeThread();return TRUE;}BOOL CSerialPort::StopMonitoring(){TRACE("Thread suspended\n");m_Thread->SuspendThread();return TRUE;}void CSerialPort::ProcessErrorMessage(char* ErrorText){char *Temp = new char[200];LPVOID lpMsgBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language(LPTSTR) &lpMsgBuf,0,NULL);sprintf(Temp, "WARNING: %s Failed with the following error: \n%s\nPort: %d\n", (char*)ErrorText, lpMsgBuf, m_nPortNr);MessageBox(NULL, Temp, "Application Error", MB_ICONSTOP);LocalFree(lpMsgBuf);delete[] Temp;}// Write a character.void CSerialPort::WriteChar(CSerialPort* port){BOOL bWrite = TRUE;BOOL bResult = TRUE;DWORD BytesSent = 0;ResetEvent(port->m_hWriteEvent);EnterCriticalSection(&port->m_csCommunicationSync);if (bWrite){port->m_ov.Offset = 0;port->m_ov.OffsetHigh = 0;PurgeComm(port->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR |PURGE_RXABORT | PURGE_TXABORT);bResult = WriteFile(port->m_hComm, // Handle to COMM Portport->m_szWriteBuffer, // Pointer to message buffer in calling finctionstrlen((char*)port->m_szWriteBuffer), // Length of message to send&BytesSent, // Where to store the number of bytes sent&port->m_ov); // Overlapped structure if (!bResult){DWORD dwError = GetLastError();switch (dwError){case ERROR_IO_PENDING:{BytesSent = 0;bWrite = FALSE;break;}default:{port->ProcessErrorMessage("WriteFile()");}}}else{LeaveCriticalSection(&port->m_csCommunicationSync);}} // end if(bWrite)if (!bWrite){bWrite = TRUE;bResult = GetOverlappedResult(port->m_hComm, // Handle to COMM port&port->m_ov, // Overlapped structure&BytesSent, // Stores number of bytes sentTRUE); // Wait flagLeaveCriticalSection(&port->m_csCommunicationSync);if (!bResult){port->ProcessErrorMessage("GetOverlappedResults() in WriteFile()");}} // end if (!bWrite)if (BytesSent != strlen((char*)port->m_szWriteBuffer)){TRACE("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length: %d\n", BytesSent, strlen((char*)port->m_szWriteBuffer));}}void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat){BOOL bRead = TRUE;BOOL bResult = TRUE;DWORD dwError = 0;DWORD BytesRead = 0;unsigned char RXBuff;for (;;){EnterCriticalSection(&port->m_csCommunicationSync);// ClearCommError() will update the COMSTAT structure and// clear any other errors.bResult = ClearCommError(port->m_hComm, &dwError, &comstat);LeaveCriticalSection(&port->m_csCommunicationSync);// start forever loop. I use this type of loop because I// do not know at runtime how many loops this will have to// run. My solution is to start a forever loop and to// break out of it when I have processed all of the// data available. Be careful with this approach and// be sure your loop will exit.// My reasons for this are not as clear in this sample// as it is in my production code, but I have found this// solutiion to be the most efficient way to do this.if (comstat.cbInQue == 0){break;}EnterCriticalSection(&port->m_csCommunicationSync);if (bRead){bResult = ReadFile(port->m_hComm, // Handle to COMM port&RXBuff, // RX Buffer Pointer1, // Read one byte&BytesRead, // Stores number of bytes read&port->m_ov); // pointer to the m_ov structure if (!bResult){switch (dwError = GetLastError()){case ERROR_IO_PENDING:{bRead = FALSE;break;}default:{port->ProcessErrorMessage("ReadFile()");break;}}}else{bRead = TRUE;}} // close if (bRead)if (!bRead){bRead = TRUE;bResult = GetOverlappedResult(port->m_hComm, // Handle to COMM port&port->m_ov, // Overlapped structure&BytesRead, // Stores number of bytes readTRUE); // Wait flagif (!bResult){port->ProcessErrorMessage("GetOverlappedResults() in ReadFile()");}} // close if (!bRead)LeaveCriticalSection(&port->m_csCommunicationSync);::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);} // end forever loop}void CSerialPort::WriteToPort(char* string){assert(m_hComm != 0);memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));strcpy(m_szWriteBuffer, string);SetEvent(m_hWriteEvent);}DCB CSerialPort::GetDCB(){return m_dcb;}DWORD CSerialPort::GetCommEvents(){return m_dwCommEvents;}DWORD CSerialPort::GetWriteBufferSize(){return m_nWriteBufferSize;}#pragma once// CControl.hclass CControl : public CDialog{DECLARE_DYNAMIC(CControl)public:CControl(CWnd* pParent = NULL);virtual ~CControl();enum { IDD = IDD_DIALOG1 };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV DECLARE_MESSAGE_MAP()};// Control.cpp#include"stdafx.h"#include"LidarLKL.h"#include"Control.h"IMPLEMENT_DYNAMIC(CControl, CDialog)CControl::CControl(CWnd* pParent/*=NULL*/): CDialog(CControl::IDD, pParent){}CControl::~CControl(){}void CControl::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CControl, CDialog)END_MESSAGE_MAP()void CControl::OnButRm(){// TODO: Add your control notification handler code hereCFileCalculate Dlg;if(Dlg.DoModal() == IDOK){;}else{return ;}}void CControl::OnBnExcel(){// TODO: Add your control notification handler code hereUsers users;users.ExportListToExcel(&m_LIST_Param,"数据处理报表");}void CControl::Ondeltediff(){diffFlag = TRUE;diffopenfilenum--;if (diffopenfilenum <= -1){MessageBox("错误!并未调入文件!");diffopenfilenum = 0;}else{if (NowSelectCur == diffopenfilenum) {for (int i=0;i<CurInfo[NowSelectCur].m_PointNum;i++)CurInfo[NowSelectCur+10].m_diffTemY[i] = 0;m_SpecturmLine.CurSelectClear(NowSelectCur+10);}else {m_SpecturmLine.Clear();for (int k = 0; k < NowSelectCur; k++){for (int m = 1; m < CurInfo[k+10].m_PointNum; m++){m_SpecturmLine.AddValue(CurInfo[k+10].m_Pointfloatx[m], CurInfo[k+10].m_diffTemY[m], k+10);}}for (int j = NowSelectCur; j < diffopenfilenum; j++){CurInfo[j+10].FileNameShow = CurInfo[j + 1+10].FileNameShow;for (int i = 1; i < CurInfo[j + 1+10].m_PointNum; i++){CurInfo[j+10].m_Pointfloatx[i] = CurInfo[j + 1+10].m_Pointfloatx[i];。
#include <REG52.h>
#include <INTRINS.h>
unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00,0x40}; unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,
25,28,31,34,38,41,44,48,
50,53,56,59,63,66,69,72,
75,78,81,84,88,91,94,97};
unsigned char displaycount;
unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};
unsigned char timecount;
unsigned char readdata[8];
sbit DQ=P3^7;
bit sflag;
bit resetpulse(void)
{
unsigned char i;
DQ=0;
for(i=255;i>0;i--);
DQ=1;
for(i=60;i>0;i--);
return(DQ);
for(i=200;i>0;i--);
}
void writecommandtods18b20(unsigned char command) {
unsigned char i;
unsigned char j;
for(i=0;i<8;i++)
{
if((command & 0x01)==0)
{
DQ=0;
for(j=35;j>0;j--);
DQ=1;
}
else
{
DQ=0;
for(j=2;j>0;j--);
DQ=1;
for(j=33;j>0;j--);
}
command=_cror_(command,1);
}
}
unsigned char readdatafromds18b20(void) {
unsigned char i;
unsigned char j;
unsigned char temp;
temp=0;
for(i=0;i<8;i++)
{
temp=_cror_(temp,1);
DQ=0;
_nop_();
_nop_();
DQ=1;
for(j=10;j>0;j--);
if(DQ==1)
{
temp=temp | 0x80;
}
else
{
temp=temp | 0x00;
}
for(j=200;j>0;j--);
}
return(temp);
}
void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
ET0=1;
EA=1;
while(resetpulse());
writecommandtods18b20(0xcc); writecommandtods18b20(0x44);
TR0=1;
while(1)
{
;
}
}
void t0(void) interrupt 1 using 0
{
unsigned char x;
unsigned int result;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
if(displaycount==2)
{
P0=displaycode[displaybuf[displaycount]] | 0x80;
}
else
{
P0=displaycode[displaybuf[displaycount]];
}
P2=displaybit[displaycount];
displaycount++;
if(displaycount==8)
{
displaycount=0;
}
timecount++;
if(timecount==150)
{
timecount=0;
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0xbe);
readdata[0]=readdatafromds18b20();
readdata[1]=readdatafromds18b20();
for(x=0;x<8;x++)
{
displaybuf[x]=16;
}
sflag=0;
if((readdata[1] & 0xf8)!=0x00)
{
sflag=1;
readdata[1]=~readdata[1];
readdata[0]=~readdata[0];
result=readdata[0]+1;
readdata[0]=result;
if(result>255)
{
readdata[1]++;
}
}
readdata[1]=readdata[1]<<4; readdata[1]=readdata[1] & 0x70; x=readdata[0];
x=x>>4;
x=x & 0x0f;
readdata[1]=readdata[1] | x;
x=2;
result=readdata[1];
while(result/10)
{
displaybuf[x]=result%10;
result=result/10;
x++;
}
displaybuf[x]=result;
if(sflag==1)
{
displaybuf[x+1]=17;
}
x=readdata[0] & 0x0f;
x=x<<1;
displaybuf[0]=(dotcode[x])%10;
displaybuf[1]=(dotcode[x])/10;
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0x44);
}
}。