测速显示C程序
直流电机测速系统课程设计
西安邮电学院单片机课程设计报告书题目:电机测速系统院系名称:自动化学院学生姓名:专业名称:自动化班级:自动XXXX班时间:20XX年X月X日至 X月XX日电机测速系统一、设计目的随着科技的飞速发展,计算机应用技术日益渗透到社会生产生活的各个领域,而单片机的应用则起到了举足轻重的作用。
在工程实践中,经常会遇到各种需要测量转速的场合,例如在发动机、电动机、机床主轴等旋转设备的试验运转和控制中,常需要分时或连续测量、显示其转速及瞬时速度。
为了能精确地测量转速,还要保证测量的实时性,要求能测得瞬时转速。
因此设计一种较为理想的电机测速控制系统是非常有价值的。
二、设计要求1.用按键控制电机起停;2.电机有两种速度,通过按键来改变速度;3.通过数码管显示每分钟或每秒的转速。
四、设计方案及分析(包含设计电路图)1. STC89C52单片机介绍STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programmable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器,俗称单片机。
该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
(1)单片机最小系统单片机最小系统电路如图所示,由主控器STC89C52、时钟电路和复位电路三部分组成。
单片机STC89C52作为核心控制器控制着整个系统的工作,而时钟电路负责产生单片机工作所必需的时钟信号,复位电路使得单片机能够正常、有序、稳定地工作。
图单片机最小系统(2)晶振电路(3)复位电路复位是单片机的初始化操作。
其主要功能是把PC 初始化为0000H ,使单片机从0000H 单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。
2. ST151光电转速传感器是根据光敏二极管工作原理制造的一种感应接收光强度变化的电子器件,当它发出的光被目标反射或阻断时,则接收器感应出相应的电信号。
霍尔传感器测速原理图和程序
LM393管脚图实现功能:此版配套测试程序使用芯片:AT89S52晶振:波特率:9600编译环境:Keil作者:zhangxinchunleo网站:淘宝店:汇诚科技声明此程序仅用于学习与参考,引用请注明版权和作者信息//说明:1、当测量浓度大于设定浓度时,单片机IO口输出低电平/include<> //库文件define uchar unsigned char//宏定义无符号字符型define uint unsigned int //宏定义无符号整型/I/O定义/sbit LED=P1^0; //定义单片机P1口的第1位即为指示端sbit DOUT=P2^0; //定义单片机P2口的第1位即为传感器的输入端/延时函数/void delay//延时程序{uchar m,n,s;form=20;m>0;m--forn=20;n>0;n--fors=248;s>0;s--;}/主函数/void main{while1 //无限循环{LED=1; //熄灭口灯ifDOUT==0//当浓度高于设定值时,执行条件函数{delay;//延时抗干扰ifDOUT==0//确定浓度高于设定值时,执行条件函数{LED=0; //点亮口灯}}}}/汇诚科技实现功能:0~9999计数器使用芯片:AT89S52晶振:波特率:9600编译环境:Keil作者:zhangxinchunleo网站:淘宝店:汇诚科技声明此程序仅用于学习与参考,引用请注明版权和作者信息/include <>define uchar unsigned chardefine uint unsigned intuchar duan10={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码//uchar wei4={0XEf,0XDf,0XBf,0X7f}; //位的控制端开发板uchar wei4={0X80,0X40,0X20,0X10}; //位的控制端仿真uint z,x,c,v, date; //定义数据类型uint dispcount=0;/延时函数/void delayuchar t{uchar i,j;fori=0;i<t;i++{forj=13;j>0;j--;{ ;}}}/数码管动态扫描/void xianshi{/数据转换/z=date/1000; //求千位x=date%1000/100; //求百位c=date%100/10; //求十位v=date%10; //求个位P2=wei0;P0=duanz;delay50;P2=wei1;P0=duanx;delay50;P2=wei2;P0=duanc;delay50;P2=wei3;P0=duanv;delay50;}/中断函数/void ExtInt0 interrupt 0 //中断服务程序{dispcount++; //每按一次中断按键,计数加一if dispcount==9999 //计数范围0-9999 {dispcount=0;}}/主函数/void main{TCON=0x01; //中断设置IE=0x81;while1{date=dispcount;xianshi;}}。
无刷直流电机调速--C语言源程序
无刷直流电机调速--C语言源程序附录1. C语言源程序:#include"stdio.h"#include"myapp.h"#include"ICETEK-VC5502-EDU.h"#include"scancode.h"#include"lcd.h"#define CTRSTATUS (*(unsigned int * )0x608000) //port8000 #define CTRLED (*(unsigned int * )0x608004) //port8004#define MCTRKEY (*(unsigned int * )0x608005) //port8005 #define CTRCLKEY (*(unsigned int * )0x608006) //port8006 #define CTRMOTORBSPEED (*(unsigned int * )0x608003)void InitMcBSP();void INTR_init( void );void InitForMotorB( void );void showparameters();void LCDPutString(unsigned int * pData,int x,int y,unsigned int nCharNumber,unsigned color);void PIDControl(int rk,int yk);void PrintParameters();//定时器分频参数#define T100 99 // 100个时钟周期中断一次#define T2Hz 20000 // 20000个时钟周期读取速度一次//工作变量usigned int uWork,uN,nCount,nCount1,nCount2,nCount3,nCount4;int nSSS,nJSSpeed,pwm1;int md,wc;unsigned int nScreenBuffer[30*128];float a=0.6f,b=0.2f,c=0.1f,duk;int ek,ek1,ek2,tz;int nInput;unsigned int *www=(unsigned int *)0x608003;Int m_nSpeed,m_bPCSet;// 主函数main(){unsigned char ccc;int speed[100],sp,lj;float ljh;int i,w1,w2,w3;unsigned int uWork1;unsigned int bWork1,*pWork;int breakflage;// 初始化工作变量for ( sp=0;sp<100;sp++ )speed[sp]=0;for ( sp=0;sp<1024;sp++ ) nScreenBuffer[sp]=0;sp=nSSS=nCount=nCount1=nCount2=nCount3=nCount4= nJSSpeed=0;nInput=tz=wc =0;ek=ek1=ek2=0;uN=40;md=70;pwm1=60;m_nSpeed=70;m_bPCSet=0;inputspeed=0;uWork1=0;breakflage=0;initemif();CLK_init();*(int*)0x400001=1;CREG=1; //使能外部总线接口InitCTR();CTRGR=0x80;CTRGR=0;CTRGR=0x80;LCDTurnoff();// 设置显示参数和内容LCDSetDelay(1); //设置延时等待参数LCDSetScreenBuffer(nScreenBuffer); // 显示缓冲区for (bWork=0,pWork=nScreenBuffer;bWork<30*128;bWork++,pWork++) (*pWork=0)LCDTurnOn();//打开显示LCDCLS();//清除显示内存LCDPutCString(str1,0,127,8,0);LCDPutCString(str2,0,111,2,1);LCDPutCString(str3,68,111,2,1);LCDPutCString(str4,68,79,2,1);LCDPutCString(str5,68,95,2,1);LCDPutCString(str6,0,95,2,1);LCDPutCString(str7,0,79,3,1);ShowParamctors();//参数显示InitMcBSP();INTR-init();InitForMotorB();While(!breakflage){if(nCount==0) //读取键盘标志{uWork=MCTRKEY;CTRCLKEY=0;Switch(uWork1){Casc 128;if(inputspecd!=0){Md=inputspecd;Inputspecd=0;LCDPutCString(numbers+104,104,79,1,1); LCDPutCString(numbers+104,112,79,1,1); LCDPutCString(numbers+104,120,79,1,1); LCDRefreshScreen();}break;case 64;breakflage=1;case 1;inputspeed=inputspeed+1break;case 2;inputspeed=inputspeed-1;break;case 4;inputspeed=inputspeed+10;break;case 8;inputspeed=inputspeed-10;break;}if(inputspeed>90){inputspeed=90;}if(inputspeed<0){inputspeed=0;}w1=inputspeed%1000/100;w2=inputspeed%100/10;w3=in putspeed%10; LCDPutString(numbers+w1*8,104,79,1,1);LCDPutString(numbers+w2*8,112,79,1,1);LCDPutString(numbers+w3*8,120,79,1,1);LCDRefreshScreen();}if(m-bPCSet){m-bPCSst=0;if (m-nSpeed>=0&&m-nSpeed<256){md=m-nSpeed;LCDPutCString(numbers+104,104,79,1,1); LCDPutCString(numbers+104,112,79,1,1);LCDPutCString(numbers+104,120,79,1,1); LCDRefreshScreen();printparameters();}}if(nJSSpeed==0) //读取速度标志{LED=1;nJSSpeed=0;ccc=CTRMOTORBSPEED; //读取端口速度计数ccc=ccc&0xff;nSSS=ccc;if(nSSS>=0 && nSSS<400) //合法性检测{speed(sp)=Nssssp++;sp%=33;}if(sp==0) //读取实际速度{lj=0;ljh=0;for(i=0;i<33;i++){if(speed(i)>=0&&speed(i)<400){ljh+=speed(i);lj++;}}nCount3++;nCount3%=3;if(nCount3==2){PIDControl(md,wc); //调用PID算法控制程序uN=100-pwml; //利用占空比调整控制Showparameters(); //显示各参数到LCD }CloseCTR();exit(0);}//PID算法控制子程序void PIDControl(int rk,int yk){ek=rk-yk;duk=a*ek+b*ek1+c*ek2; //计算控制输出ek2=ek1; ek1=ek;tz=(int)duk;pwm1+=tz; //计算当前占空比if(pwml<0) pwml=0;else if(pwml>99) pwml=99;}void interrupt Timer(){uWork=PCR1; //pwml输出if(nCont1>u N){uWork=4; //根据占空比设置FSR状态}else{uWork&=0x0fffb;}PCR1=uWork;//设置中断控制寄存器void INTR-init(void){asm(“BSET INTM”);IVPD=0x01;IVPH=0x01;IERO=0x10;DBIERO=0x10;IFRO=0xffff;asm(“BCLR INTM”);}void InitForMotorB(void)ioport unsigned int *GPTCTL1-0;ioport unsigned int *GPTPRD1-0;ioport unsigned int *GPTGCTL1-0;*GPTCTL1-0=0;*GPTPRD1-0=0x1d8;*GPTGCTL1-0=0x3;}//显示参数到LCDvoid ShowParameters(){int w1,w2,w3;w1=md%1000/100;w2=md%100/10,w3=md%10; LCDPutString(numbers+w1*8,36,111,1,1); LCDPutString(numbers+w2*8,44,111,1,1); LCDPutString(numbers+w3*8,52,111,1,1);if (ek>=0){LCDPutString(numbers+88,36,95,1,1);w3=((int)ek)%100;}else{LCDPutString(numbers+96,36,95,1,1);w3=((int)(-ek))%100;}for (j=0;j<16;j++,k<<=1){if (color==2) mcolor=2;elsemcolor=(pData(1*8+i)&k)(1):(0);if(color==0) mcolor=1-mcolor;}LCDPutPixel(x+1*8+I,y-j,mcolor);}int wwss;void PrintParameters(){wwcc=wc-md;printf(“测速(%3d) 设置(%3d) 误差(%+4d) PID调整量(%+3d) 占空比(%3d%%)\n”,wc,md,wwcc,tz,pwm1);}。
测速软件原理
测速软件原理
测速软件是用来估计网络连接速度和性能的工具。
它通过发送数据包到目标服务器,并测量数据包往返的时间来计算网络延迟。
此外,它还会测量下载和上传速度,以及计算带宽以评估网络连接的质量。
测速软件的原理主要包括以下几个方面:
1. 数据包传输:测速软件会发送一系列的数据包到目标服务器。
这些数据包通常是很小的,例如只有几十个字节。
通过发送这些数据包并测量它们的往返时间(RTT),测速软件可以估计网络的延迟。
2. 多个连接测试:有些测速软件会采用多个并行连接的方式进行测试。
它们同时发送多个数据包到目标服务器,从而提供更准确的延迟和带宽测量结果。
3. 下载和上传速度测量:测速软件通过向目标服务器下载和上传文件来测量实际的下载和上传速度。
它会记录下载和上传所花费的时间,并根据文件大小计算出速度。
4. 带宽计算:通过测量下载和上传速度以及其他网络参数,测速软件可以计算出网络连接的带宽。
带宽是指单位时间内传输的数据量,通常以每秒传输的比特数(bps)表示。
5. 测速服务器:有些测速软件使用专门的测速服务器来执行测试。
这些服务器通常被放置在网络的不同位置,以便用户可以
选择最接近自己地理位置的服务器进行测试。
通过使用测速服务器,测速软件可以提供更准确的测速结果。
总的来说,测速软件通过发送数据包、测量往返时间、下载和上传文件等操作,来评估网络连接的速度和性能。
它可以帮助用户了解自己的网络质量,并提供优化网络连接的建议。
C语言期末考试题库
本题要求编写程序,计算2个正整数的和、差、积、商并输出。
题目保证输入和输出全部在整型范围内。
输入格式:输入在一行中给出2个正整数A和B。
输出格式:在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。
输入样例:3 2输出样例:3 + 2 = 53 - 2 = 13 * 2 = 63 / 2 = 12.程序每次读入一个正3位数,然后输出按位逆序的数字。
注意:当输入的数字含有结尾的0时,输出不应带有前导的0。
比如输入700,输出应该是7。
输入格式:每个测试是一个3位的正整数。
输出格式:输出按位逆序的数。
输入样例:123输出样例:3213.模拟交通警察的雷达测速仪。
输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。
输入格式:输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。
输出格式:在一行中输出测速仪显示结果,格式为:“Speed: V - S”,其中V是车速,S或者是Speeding、或者是OK。
输入样例1:40输出样例1:Speed: 40 - OK输入样例2:75输出样例2:Speed: 75 - Speeding中国有句俗语叫“三天打鱼两天晒网”。
假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?输入格式:输入在一行中给出1个不超过1000的正整数N。
输出格式:在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
输入样例1:103输出样例1:Fishing in day 103输入样例2:34输出样例2:Drying in day 345.三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。
要求找出这个不一样的球。
输入格式:输入在一行中给出3个正整数,顺序对应球A、B、C的重量。
输出格式:在一行中输出唯一的那个不一样的球。
590C 中文说明书
一、概述590系列中所有的控制算法都由高速单片微处理器(单片机)完成,控制软件的结构及微处理器的工作速度可保证所有控制回路的调节作用在主电路六个可控硅桥的转换时间之内完成,以保证电流环的的采样时间小于3.3ms(50Hz电源)或2.67ms(60HZ电源),速度环算法运算也可在此时间内完成,以获得优越的动态性能。
对可逆装置,转矩(电流)反向时的无环流时间非常短(且可由软件设定,出厂时设定为1ms),使电流环对冲击负载具有优越的性能和响应。
全数字直流调速装置具有一套扩展的可控硅触发控制电路,可获得210°的移相控制范围,可同时适用于功率相同的电机电枢电压单向及双向可逆控制。
机内提供的一套自整定(self-tune)算法,可自动计算出控制装置和电机组合一体后,电流环的P、I常数及电流断续点,这一功能只需在操作键上作一个简单的操作就可获得,使系统获得最佳的动能特性,大大缩短了调试时间。
电流环还具备自适应功能、即使在负载变化较大时。
系统也能获得平稳的速度响应。
速度环的PI参数调节范围很大,且具有积分分离功能。
主要性能指标如下:速度范围: 100:1 测速器反馈稳定状态精确度 :● 带数字设定值的0.01%编码器反馈(串行连接或者P3) ● 0.1%模拟转速反馈 ● 2 %电压反馈 ● 使用QUADRALOC Mk II 5720数字控制器的绝对精确度(0.0%误差)注意事项:长期模拟精确度取决于测速器温度的稳定性。
保护功能590系列具有多达十余种的保护措施,它们是:●内部器件、网络●高能MOV'S●过流(瞬时及反时限)●失磁●速度反馈丢失●电机超温●可控硅模块超温(强迫风冷单元)●可控硅触发失败●零速检测联锁●静态逻辑●堵转保护可组态的端子分配及常用功能模块除了速度/电流给定及反馈端, 590系列其余所有的模拟及数字输入输出端都可以重新分配定义,连接到控制软件模块图所需的节点上,这使得590系列具有多变的应用性能。
霍尔测速及C例程
霍尔测速电路及C例程测速是工农业生产中经常遇到的问题,学会使用单片机技术设计测速仪表具有很重要的意义。
要测速,首先要解决是采样的问题。
在使用模拟技术制作测速表时,常用测速发电机的方法,即将测速发电机的转轴与待测轴相连,测速发电机的电压高低反映了转速的高低。
使用单片机进行测速,可以使用简单的脉冲计数法。
只要转轴每旋转一周,产生一个或固定的多个脉冲,并将脉冲送入单片机中进行计数,即可获得转速的信息。
下面以常见的玩具电机作为测速对象,用CS3020设计信号获取电路,通过电压比较器实现计数脉冲的输出,既可在单片机实验箱进行转速测量,也可直接将输出接到频率计或脉冲计数器,得到单位时间内的脉冲数,进行换算即可得电机转速。
这样可少用硬件,不需编程,但仅是对霍尔传感器测速应用的验证。
1 脉冲信号的获得霍尔传感器是对磁敏感的传感元件,常用于开关信号采集的有CS3020、CS3040等,这种传感器是一个3端器件,外形与三极管相似,只要接上电源、地,即可工作,输出通常是集电极开路(OC)门输出,工作电压范围宽,使用非常方便。
如图1所示是CS3020的外形图,将有字面对准自己,三根引脚从左向右分别是Vcc,地,输出。
图1 CS3020外形图使用霍尔传感器获得脉冲信号,其机械结构也可以做得较为简单,只要在转轴的圆周上粘上一粒磁钢,让霍尔开关靠近磁钢,就有信号输出,转轴旋转时,就会不断地产生脉冲信号输出。
如果在圆周上粘上多粒磁钢,可以实现旋转一周,获得多个脉冲输出。
在粘磁钢时要注意,霍尔传感器对磁场方向敏感,粘之前可以先手动接近一下传感器,如果没有信号输出,可以换一个方向再试。
这种传感器不怕灰尘、油污,在工业现场应用广泛。
2 硬件电路设计测速的方法决定了测速信号的硬件连接,测速实际上就是测频,因此,频率测量的一些原则同样适用于测速。
通常可以用计数法、测脉宽法和等精度法来进行测试。
所谓计数法,就是给定一个闸门时间,在闸门时间内计数输入的脉冲个数;测脉宽法是利用待测信号的脉宽来控制计数门,对一个高精度的高频计数信号进行计数。
宽带测速方法
宽带测速操作手册说明:本手册分别介绍了基于普通HTTP下载、FTP下载以及iperf测速工具的宽带测速操作方法。
我们建议1M-10M带宽的测速可采用以上三种方法中的任何一种,10M以上的带宽,特别是100M以上的我们建议只使用iperf测速工具进行测试。
另外,如果出现HTTP下载和FTP下载测速都不正常的情况下,请使用iperf 测速工具进行测速。
目录一、1M-10M带宽测速操作手册 (1)1.HTTP下载测速 (1)2.FTP下载测速 (2)3.iperf工具测速 (3)二、10M以上带宽测速操作手册(仅使用Iperf工具) (5)附录A-Iperf测速工具常用参数介绍 (6)附录B-用户自己采用FTP,HTTP,BT下载测速不准的原因 (6)一、1M-10M带宽测速操作手册对于1M-10M带宽,我们可采用HTTP,FTP,iperf测速工具进行测速,下面我们就不同的方法逐一介绍测速操作流程。
1.HTTP下载测速用Web浏览器登陆数据源下载页面:http://61.175.162.22/download,点击数据源开始下载。
注意:如果发现所测速度达不到给定的速率,可以尝试同时进行多个HTTP下载,寻求最大的带宽利用率,计算每个下载速率的总和就是测得实际带宽速率。
如果按上述尝试之后,测得速率还不正常,建议采用iperf工具测速。
2.FTP下载测速用Web浏览器登陆数据源下载页面:http://61.175.162.22/software,点击FlashFXP.rar开始下载改FTP下载工具,并解压缩安装。
步骤一:然后点击快速连接选项或按F8,如下图所示:步骤二:按下图格式填好服务器地址(61.175.162.22),用户名(test),密码(testtest),其他默认,选择连接就可以了;步骤三:选择数据源,右键点击选择传输选项,如下图:步骤四:在界面的左下角会显示当前的实际下载速率。
注意:如果发现所测速度达不到给定的速率,可以尝试多开几个FlashFXP窗口同时进行多个下载,以寻求最大的带宽利用率,测得最大的带宽下载速率。
电机控制(C程序)
#include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit CLK=P1^0;sbit DIN=P1^1;sbit LOAD=P1^2;sbit p0_0=P0^0;uchar bit100; //数码管显示数值单元uchar bit10;uchar bit1;uchar cout; //1S定时控制参数uchar cnt1,cnt2; //延时参数单元uchar rvalue; //电机转速单元uchar value; //电机最高允许转速uchar dig1;uchar dig2;uchar dig3;void dplay(void);void start(void);void delay(uchar z){uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void sendword(uchar addr,uchar num);void n_nop_(){uchar x,y;for(x=5;x>0;x--)for(y=110;y>0;y--);}void sendcode(uchar code0);//定时器0中断服务程序,用于电机测速void time0_int(void)interrupt 1{uchar temp;ET0=0; //关闭T0中断TR0=0;cout=cout-1; //1S定时控制参数if(cout<=0) //1S定时到?{cout=0x14;rvalue=TL1;TH1=0x00; //重新设置电机测数参数 TL1=0x00;TH0=0x3c;TL0=0xbb;bit1=rvalue%0x0a; //转速数值换算 temp=rvalue/0x0a;bit10=temp%0x0a;bit100=temp/0x0a;TR1=1; //打开T0定时T1计数ET0=1;}else{TH0=0x3c; //1S定时未到,T0重装50MS定时参数TL0=0xbb;TR1=1;ET0=1;}return;}//主程序开始,主要内容为初始化设置void main(void){SP=0x70;cout=0x14;cnt1=0x00;cnt2=0x00;value=0xc8; //转速设定值为100TH1=0x00;TL1=0x00;TH0=0x3c; //50MS定时参数设定TL0=0xbb;TMOD=0x51;start(); // MAX7219初始化dig1=0x01;dig2=0x02;dig3=0x03;dplay();EA=1; // 中断设置ET0=1;ET1=1;TR0=1; //启动T0,T1计数TR1=1;while(1){if(rvalue<value) //转速低于200{p0_0=1;cnt1++; //驱动信号高电平维持时间增大,使转速增大delay(cnt1);cnt2=0xff-cnt1; //低电平维持时间减少p0_0=0;delay(cnt2);return;}else if(rvalue>value) // 转速高于200{p0_0=1;cnt1--;delay(cnt1); //驱动信号高电平维持时间减少,使转速减小 cnt2=0xff-cnt1; //低电平维持时间增加p0_0=0;delay(cnt2);return;}else // 转速等于200{p0_0=1;delay(cnt1); //驱动信号特性维持不变 p0_0=0;delay(cnt2);return;}}}//转速显示程序void dplay(void){sendword(dig3,bit100); // 发送数码管百位显示到7219sendword(dig2,bit10); // 发送数码管十位显示到7219sendword(dig1,bit1); // 发送数码管个位显示到7219}//数码管驱动MAX7219初始化程序void start(void){sendword(0x0b,0x02); //设置扫描界限sendword(0x09,0x0f); //译码模式设置sendword(0x0a,0x0a); //设置亮度sendword(0x0c,0x01); //设置为正常工作模式}void sendword(uchar addr,uchar num){LOAD=0; //7219准备接受16位数据n_nop_();sendcode(addr); //7219接收8位寄存器地址n_nop_();sendcode(num); //7219接收8位寄存器数据n_nop_();LOAD=1; //7219锁存进位相应寄存器}//发送一个字节数据到MAX7219void sendcode(uchar code0){uchar i,temp;n_nop_();for(i=0;i<8;i++){temp=code0&0x80;code0=code0<<1;if(code0) //发送1{DIN=1;CLK=0;CLK=1;}else // 发送0{DIN=0;CLK=0;CLK=1;}}}。
光电测速(基于计数)系统+完成的C程序和电路图
光电计数器设计班级学号姓名指导老师2011-07-01光电计数器实验报告摘要光电计数器有直观和计数精确的优点,目前已在各种行业中普遍使用。
光电计数器有多种计数触发方式,它是由实际使用条件和环境决定的。
有采用机械方式的接触式触发的,有采用电子传感器的非接触式触发的,光电式传感器是其中之一,它是一种非接触式电子传感器。
这种计数器在工厂的生产流水线上作产品统计,有着其他计数器不可取代的优点。
本文针对光电计数器的设计要求,在实现了基本要求的基础上改加了测物体转速的功能。
内容简介光电计数器是通过光电耦合器OPTOISO1发光二极管一端在加电压的条件下发出红外光,红外光照射光电耦合器的光敏三极管一端是光敏三级管导通,从而使光敏三级管集电极一端产生低电平。
当有物体遮住红外光时,光敏三极管截止从而产生高低电平的跳变。
并通过74LS14反相器整形送入单片机进行处理。
本设计计数器可将机械或人工计数方式变为电子计数形式,并且采用8*8戴南镇显示屏来计数显示。
一、方案设计和论证采用单片机控制模块提供电源。
改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
1.2、技术传感器部分根据老师要求我们一律采用光电耦合器进行计数1.3、显示部分根据实验要求我们一律采用8*8点阵进行计数显示。
系统硬件图2.1 复位电路为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。
一般微机电路正常工作需要供电电源为5V±5%,即4.75~5.25V。
由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。
电路图如下:上电自动复位是通过外部复位电路的电容充电来实现的。
只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
2.2 时钟电路时钟电路可以简单定义如下: 1.就是产生象时钟一样准确的振荡电路。
怎么把网络测速取消
怎么把网络测速取消
在日常使用互联网的过程中,经常会使用到网络测速工具来检测网络速度,以
便了解网络连接的质量。
然而,有时候我们可能不需要频繁地进行网络测速,或者是不想被测速工具干扰,那么如何取消网络测速呢?本文将介绍如何取消网络测速的几种方法。
方法一:关闭测速工具
最简单的方法就是关闭正在运行的测速工具。
在电脑或手机上,通常测速工具
会以应用程序的形式存在,通过关闭该应用程序即可停止测速任务。
方法二:禁用测速功能
有些测速工具会在后台自动运行并进行网络测速,此时可以通过禁用该功能来
取消测速。
具体方法可参考测速工具的设置页面,寻找相关的选项并关闭网络测速功能。
方法三:卸载测速工具
如果以上方法无法取消网络测速或者你不再需要该测速工具,可以考虑直接卸
载它。
在电脑上,可以通过控制面板或应用商店来卸载程序;在手机上,则可通过应用管理来卸载应用程序。
方法四:更改测速设置
有些测速工具提供了更详细的设置选项,可能包括定时测速、后台测速等功能。
通过修改这些设置,可以取消或调整测速任务的频率,满足个人需求。
方法五:阻止测速工具访问网络
一种较为极端的方法是通过防火墙或路由器设置,禁止测速工具访问网络。
这
样一来,测速工具将无法进行测速操作,从而达到取消测速的目的。
总的来说,取消网络测速的方法取决于使用的测速工具和个人需求。
选择合适
的方法可以有效地取消网络测速,避免不必要的干扰。
希望以上方法能对你有所帮助。
以上是关于如何取消网络测速的一些方法,希望能对您有所帮助。
南京宝威仪器仪表 LS1206B 型便携式流速测算仪 说明书
LS1206BLS1206B型便携式流速测算仪使用说明书南京宝威仪器仪表有限公司3.4关机操作:每次使用完仪器,只要拨下插头,仪器即可自动关机,并保存关机前所选定流速仪型号和参数,在下一次使用时,只需插上插头,接好流速仪,按一次换屏键即可进行测流工作。
四.计算机联机运行(定货无要求时无此功能)首先用专用通讯电缆连接测算仪与计算机的通讯口,打开计算机进入WINDOWS平台中-程序-附件-通讯-超级终端,设置波特率为2400,通讯位为8位,停止位1位,奇偶校验为无,流控制为软件方式,选择正确的通讯口,接通测算仪的信号电源线,启动测流。
待每次测流历时结束后,测算仪自动送出一组数据到计算机屏幕显示。
K=7800 C=0.050 T=0106.5 N=0015 V=0.160K=7800 C=0.050 T=0108.4 N=0016 V=0.165五.仪器的维护:测算仪的维护,短期不用时,必须拨掉插头(断开电源)保存。
长期不用时,三个月须充电一次。
每次使用后,用清水冲洗流速仪、测杆,并用毛巾擦干,存放。
流速仪的保养、拆洗见流速仪说明书。
六.仪器的全套设备:LS-A速测算仪一个16测杆(4-400) 一付LS1206B仪旋桨一架信号联线一付*通讯电缆(选配)一付*尾翼(选配)一只*托架(选配)充电器一只附件:LS1206B型便携式流速测算仪使用说明书一本特别提醒:仪器首次次充电应大于3小时. 测试时间请设置20秒以上每次请将电池电用完后再充.(本机有过放过充保护)LS1206B型便携式流速测算仪LS1206B型便携式流速流量仪(简称便携式流速仪)是专门为水文站、厂矿、环保监测站、农田排灌、水文地质调查等部门在野外进行明渠流速流量测量而研制的。
便携式流速仪主要由LS1206B型旋桨式流速传感器(或其它型号的旋杯旋桨流速仪)、LS1206B型流速测算仪、0.4m×4Ф16测杆组成。
全套仪器置于高级铝合金密码箱内。
(完整word版)红外测速代码
(完整word版)红外测速代码红外测速代码附录2 源程序#include〈reg52.h〉#include<stdio.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P2^6;//定义1602使能端sbit lcdrs=P2^4;sbit lcdrw=P2^5;sbit a=P1^0;//对射传感器的信号输出端sbit add=P3^4;//按键加一变量sbit jian=P3^5;//按键减一变量sbit bj=P2^3;//蜂鸣器端口char zhuan[16];//设置临时数组uint num2;//每秒的转速uint number=7;//设定转速的初值,在其基础上按键加一或按键减一uint num=0;//转数变量void Init_Timer0(void);void delay(uint z)//延迟函数{uint x,y;for(x=z;x〉0;x-—)for(y=110;y>0;y-—);}void write_com(uchar com)//1602写命令{lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date)//1602写数据{lcdrs=1;lcden=1;P0=date;delay(5);lcden=0;}void LCD_Write_String(uchar x,uchar y,uchar *s) //向1602写字符串{(完整word版)红外测速代码 if (y == 0){write_com(0x80 + x); //表示第一行}else{write_com(0xC0 + x); //表示第二行}while (*s){write_date( *s);s++;}}void LCD_Write_Char(uchar x,uchar y,uchar Data) //向1602写字符{if (y == 0){write_com(0x80 + x);}else{write_com(0xC0 + x);}write_date( Data);}void init() //初始化{bj=0;//蜂鸣器初始化write_com(0x01);//1602初始化lcdrw=0;lcden=0;write_com(0x38);write_com(0x0e);write_com(0x06);LCD_Write_Char(13,0,’n’);LCD_Write_Char(14,0,'/');LCD_Write_Char(15,0,'s');LCD_Write_Char(13,1,'n’);LCD_Write_Char(14,1,'/’);LCD_Write_Char(15,1,'s');}void main(){init();while(1){if(a==1)//对射传感器检测障碍物{num++;//计转数while(a);}sprintf(zhuan,”zhuansu%2d”,num);LCD_Write_String(0,0,zhuan);Init_Timer0();//定时1ssprintf(zhuan,”zhuansu %2d”,num2);//输出一秒的转速LCD_Write_String(0,0,zhuan);if(num2>=number)//转速超过设定值报警bj=1;if(num2〈number)//转速不超过设定值报警bj=0;if(!add){ //按下相应的按键,1602LCD液晶显示屏显示相应的码值delay(5);if(!add){number=number+1;sprintf(zhuan,”yushe %7d”,number);//打印温度值LCD_Write_String(0,1,zhuan);//显示第二行while(!add);}}if(!jian){ //按下相应的按键,1602LCD液晶显示屏显示相应的码值delay(5);if(!jian){number—-;sprintf(zhuan,"yushe %7d",number);//打印温度值LCD_Write_String(0,1,zhuan);//显示第二行while(!jian);}}}}void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用”|”符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*—---—--—-—----------—-----——--—-—--——--—-———--—-定时器中断子程序-—-—----————---—-------———-—----—---—----—-—————*/ void Timer0_isr(void) interrupt 1{static unsigned int num1;TH0=(65536—2000)/256; //重新赋值 2msTL0=(65536—2000)%256;num1++;if(num1==500) //计时1s{num1=0;num2=num;num=0; //读标志位置1}}。
基于51单片机的光电编码器测速
摘要光电编码器是高精度位置控制系统常用的一种位移检测传感器。
在位置控制系统中,由于电机既可能正转,也可能反转,所以要对与其相连的编码器输出的脉冲进行计数,要求相应的计数器既能实现加计数,又能实现减计数,即进行可逆计数。
其计数的方法有多种,包括纯粹的软件计数和硬件计数。
文中分别对这两种常用的计数方法进行了分析,对其优缺点进行了对比,最后提出了一种新的计数方法,利用80C51单片机内部的计数器实现对光电编码器输出脉冲的加减可逆计数,既节省了硬件资源,又能得到较高的计数频率。
本设计就是由单片机STC89C52RC芯片,光电编码器和1602液晶为核心,辅以必要的电路,构成了一个基于51单片机的光电编码器测速器。
该系统有两个控制按键,分别用于控制每秒的转速和每分钟的转速,并将速度用1602液晶显示出来。
该测速器测速精准,具有实时检测的功能,操作简单。
关键词:光电编码器,51单片机,C语言,1602液晶目录一、设计任务与要求 (3)1.1 设计任务 (3)1.2 设计要求 (3)二、方案总体设计 (4)2.1 方案一 (4)2.2 方案二 (4)2.3 系统采用方案 (4)三、硬件设计 (6)3.1 单片机最小系统 (6)3.2 液晶显示模块 (6)3.3 系统电源 (7)3.4光电编码器电路 (7)3.5 整体电路 (8)四、软件设计 (9)4.1 keil软件介绍 (9)4.2 系统程序流程 (9)五、仿真与实现 (11)5.1 proteus软件介绍 (11)5.2 仿真过程 (11)5.3 实物制作与调试 (12)5.4 使用说明 (13)六、总结 (14)6.1 设计总结 (14)6.2 经验总结 (14)七、参考文献 (15)一、设计任务与要求1.1 设计任务1).对更多小器件的了解2).巩固51单片机和C语言的知识,熟悉单片机和C语言的实际操作运用3).掌握仿真软件的运用和原理图的绘制4).加深焊接的技巧,提高焊接的能力5).熟悉调试方法和技巧,提高解决实际问题的能力6).熟悉设计报告的编写过程1.2 设计要求1).两个按键控制显示每分钟和每秒钟的功能2).74LS74辅助光电编码器测转向3).光电编码器输出脉冲计数4).1602液晶显示转速二、方案总体设计设计一个基于51单片机的光电编码器测测速。
帧间差分法 车辆测速 代码
帧间差分法车辆测速代码摘要:一、帧间差分法的简介二、车辆测速的方法及原理三、利用帧间差分法进行车辆测速的代码实现正文:帧间差分法是一种常用的运动目标检测与跟踪技术,通过比较连续两帧或多帧图像之间的差异,检测出运动目标并计算其运动速度。
近年来,帧间差分法已被广泛应用于智能交通、视频监控等领域,特别是在车辆测速方面取得了显著的成果。
车辆测速的方法及原理:车辆测速的基本原理是通过检测车辆在连续帧之间的运动变化,计算其速度。
一般采用的方法有:基于背景减除的测速方法、基于光流法的测速方法和基于帧间差分法的测速方法等。
其中,帧间差分法具有计算简单、实时性好、抗干扰能力强等优点,成为车辆测速领域的研究热点。
利用帧间差分法进行车辆测速的代码实现:为了实现利用帧间差分法进行车辆测速的代码,我们首先需要对视频进行预处理,包括降噪、滤波等操作,提高图像质量。
接着,采用帧间差分法计算车辆的运动变化,并提取出运动车辆的轨迹。
最后,根据轨迹信息计算车辆的速度。
以下是一个简单的Python 代码示例,用于实现帧间差分法进行车辆测速:```pythonimport cv2import numpy as npdef frame_difference(frame1, frame2):diff = cv2.absdiff(frame1, frame2)return diffdef preprocess_image(image):# 降噪、滤波等图像预处理操作return imagedef detect_moving_vehicles(video):# 读取视频cap = cv2.VideoCapture(video)# 循环遍历视频帧while cap.isOpened():ret, frame = cap.read()if not ret:break# 对每一帧进行预处理preprocessed_frame = preprocess_image(frame)# 计算帧间差分diff = frame_difference(preprocessed_frame, frame)# 检测运动车辆vehicles = cv2.inRange(diff, np.array([100, 100, 100]), np.array([255, 255, 255]))# 显示结果cv2.imshow("Vehicles", vehicles)# 按“q”键退出if cv2.waitKey(1) & 0xFF == ord("q"):break# 释放资源cap.release()cv2.destroyAllWindows()if __name__ == "__main__":video = "path/to/your/video.mp4" # 修改为你的视频文件路径detect_moving_vehicles(video)```需要注意的是,此代码仅为示例,实际应用时还需根据具体需求进行优化和调整。
抓拍机基线接口及C程序
文档修订记录*变化状态:A——增加,M——修改,D——删除以下接口的使用可参见海康威视《客户端SDK使用手册》1. IO触发配置#define MAX_INTERVAL_NUM 4 //最大时间间隔个数#define NET_DVR_GET_IOINCFG 1070 //获取抓拍机IO输入参数#define NET_DVR_SET_IOINCFG 1071 //设置抓拍机IO输入参数使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置,通道号为对应IO输入口号IO触发方式配置typedef struct tagNET_DVR_IO_INCFG{DWORD dwSize;BYTE byIoInStatus;//输入的IO口状态,0-下降沿,1-上升沿,2-上升沿和下降沿,3-高电平,4-低电平BYTE byRes[3];//保留字节}NET_DVR_IO_INCFG, *LPNET_DVR_IO_INCFG;单IO触发抓拍功能配置#define NET_DVR_GET_SNAPCFG 1082//获取单IO触发抓拍功能配置#define NET_DVR_SET_SNAPCFG 1083//设置单IO触发抓拍功能配置使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置,通道号对应为单IO触发抓拍功能组号typedef struct tagNET_DVR_SNAPCFG{DWORD dwSize;BYTE byRelatedDriveWay;//触发IO关联的车道号,取值范围[0,9]BYTE bySnapTimes; //线圈抓拍次数,0-不抓拍,非0-连拍次数,目前最大5次WORD wSnapWaitTime; //抓拍等待时间,单位ms,取值范围[0,60000]WORD wIntervalTime[MAX_INTERVAL_NUM];//连拍间隔时间,ms,取值范围[0,60000]BYTE byRes2[24];//保留字节}NET_DVR_SNAPCFG, *LPNET_DVR_SNAPCFG;2. 闪光灯配置#define NET_DVR_GET_IOOUTCFG 1072 //获取抓拍机IO输出参数#define NET_DVR_SET_IOOUTCFG 1073 //设置抓拍机IO输出参数使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置,通道号为对应IO输出口号闪光灯配置typedef struct tagNET_DVR_IO_OUTCFG{DWORD dwSize;BYTE byDefaultStatus;//IO默认状态:0-低电平,1-高电平BYTE byIoOutStatus;//IO起效时状态:0-低电平,1-高电平,2-脉冲WORD wAheadTime;//输出IO 提前时间,[0,300],单位usDWORD dwTimePluse;//脉冲间隔时间,单位usDWORD dwTimeDelay;//IO有效持续时间,单位usBYTE byFreqMulti; //倍频,数值范围[1,15]BYTE byDutyRate; //占空比,[0,40%]BYTE byRes[2];}NET_DVR_IO_OUTCFG, *LPNET_DVR_IO_OUTCFG;闪光灯配置功能,按每个IO独立配置#define NET_DVR_GET_FLASHCFG 1074 //获取IO闪光灯输出参数#define NET_DVR_SET_FLASHCFG 1075 //设置IO闪光灯输出参数使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置,通道号为对应IO输出口号typedef struct tagNET_DVR_FLASH_OUTCFG{DWORD dwSize;BYTE byMode;//闪光灯闪烁模式,0-不闪,1-闪,2-关联闪,3-轮闪BYTE byRelatedIoIn;//闪光灯关联的输入IO号(关联闪时此参数有效,暂时保留)BYTE byRecognizedLane; /*关联的IO号,按位表示,bit0表示IO1是否关联,0-不关联,1-关联*/BYTE byDetectBrightness;/*自动检测亮度使能闪光灯0-不检测;1-检测*/BYTE byBrightnessThreld;/*使能闪光灯亮度阈值,范围[0-100],高于阈值闪*/ BYTE byStartHour; //开始时间-小时,取值范围0-23BYTE byStartMinute; //开始时间-分,取值范围0-59BYTE byEndHour; //结束时间-小时,取值范围0-23BYTE byEndMinute; //结束时间-分,取值范围0-59BYTE byFlashLightEnable; //设置闪光灯时间使能:0-关;1-开BYTE byRes[2];}NET_DVR_FLASH_OUTCFG, *LPNET_DVR_FLASH_OUTCFG;3. 红绿灯功能#define MAX_INTERVAL_NUM 4 //最大时间间隔个数#define NET_DVR_GET_LIGHTSNAPCFG 1076 //获取抓拍机红绿灯参数#define NET_DVR_SET_LIGHTSNAPCFG 1077 //设置抓拍机红绿灯参数使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置,通道号为对应红绿灯组号typedef struct tagNET_DVR_LIGHTSNAPCFG{DWORD dwSize;BYTE byLightIoIn;//红绿灯的IO号,从1开始BYTE byTrigIoIn;//触发的IO号,从1开始BYTE byRelatedDriveWay;//触发IO关联的车道号,取值范围[0,9]BYTE byTrafficLight; //0-高电平红灯,低电平绿灯;1-高电平绿灯,低电平红灯BYTE bySnapTimes1; //红灯抓拍次数1,0-不抓拍,非0-连拍次数,最大5次BYTE bySnapTimes2; //绿灯抓拍次数2,0-不抓拍,非0-连拍次数,最大5次BYTE byRes1[2];WORD wIntervalTime1[MAX_INTERVAL_NUM];//红灯连拍间隔时间,ms,取值范围[67,60000]WORD wIntervalTime2[MAX_INTERVAL_NUM];//绿灯连拍间隔时间,ms,取值范围[67,60000]BYTE byRecord;//闯红灯周期录像标志,0-不录像,1-录像BYTE bySessionTimeout;//闯红灯周期录像超时时间(秒),取值范围[0,100] BYTE byPreRecordTime;//闯红灯录像片段预录时间(秒),取值范围[0,100]BYTE byVideoDelay;//闯红灯录像片段延时时间(秒),取值范围[0,100]BYTE byRes2[32];//保留字节}NET_DVR_LIGHTSNAPCFG, *LPNET_DVR_LIGHTSNAPCFG;4. 测速功能(2个IO输入一组)使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置,对应组号#define MAX_INTERVAL_NUM 4 //最大时间间隔个数#define NET_DVR_GET_MEASURESPEEDCFG 1078 //获取抓拍机测速参数#define NET_DVR_SET_MEASURESPEEDCFG 1079 //设置抓拍机测速参数使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置,通道号为对应测速组号typedef struct tagNET_DVR_MEASURESPEEDCFG{DWORD dwSize;BYTE byTrigIo1; //测速第1线圈,从1开始BYTE byTrigIo2; //测速第2线圈,从1开始BYTE byRelatedDriveWay;//触发IO关联的车道号,取值范围[0,9]BYTE byTestSpeedTimeOut;//测速模式超时时间,单位s,取值范围[0,255] DWORD dwDistance;//线圈距离,cm,取值范围[0,20000]BYTE byCapSpeed;//测速模式起拍速度,单位km/h,取值范围[0,255]BYTE bySpeedLimit;//限速值,单位km/h,取值范围[0,255]BYTE bySnapTimes1; //线圈1抓拍次数,0-不抓拍,非0-连拍次数,最大5次BYTE bySnapTimes2; //线圈2抓拍次数,0-不抓拍,非0-连拍次数,最大5次WORD wIntervalTime1[MAX_INTERVAL_NUM];//线圈1连拍间隔时间,ms,取值范围[67,20000]WORD wIntervalTime2[MAX_INTERVAL_NUM];//线圈2连拍间隔时间,ms,取值范围[67,20000]BYTE byRes[32];//保留字节}NET_DVR_MEASURESPEEDCFG, *LPNET_DVR_MEASURESPEEDCFG;5. 视频参数配置#define NET_DVR_GET_CCDPARAMCFG 1067 //IPC获取CCD参数配置#define NET_DVR_SET_CCDPARAMCFG 1068 //IPC设置CCD参数配置使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置,不需要通道号视频参数配置typedef struct tagNET_DVR_VIDEOEFFECT{BYTE byBrightnessLevel; /*0-100*/BYTE byContrastLevel; /*0-100*/BYTE bySharpnessLevel; /*0-100*/BYTE bySaturationLevel; /*0-100*/BYTE byHueLevel; /*0-100,(保留)*/BYTE byRes[3];}NET_DVR_VIDEOEFFECT, *LPNET_DVR_VIDEOEFFECT;增益配置typedef struct tagNET_DVR_GAIN{BYTE byGainLevel; /*增益:0-100*/BYTE byGainUserSet; /*用户自定义增益;0-100,对于抓拍机,是CCD模式下的抓拍增益*/BYTE byRes[2];DWORD dwMaxGainValue;/*最大增益值,单位dB*/}NET_DVR_GAIN, *LPNET_DVR_GAIN;白平衡配置typedef struct tagNET_DVR_WHITEBALANCE{BYTE byWhiteBalanceMode; /*0手动白平衡; 1自动白平衡1(范围小); 2 自动白平衡2(范围宽,2200K-15000K);3自动控制3*/BYTE byWhiteBalanceModeRGain; /*手动白平衡时有效,手动白平衡 R增益*/BYTE byWhiteBalanceModeBGain; /*手动白平衡时有效,手动白平衡 B增益*/BYTE byRes[5];}NET_DVR_WHITEBALANCE, *LPNET_DVR_WHITEBALANCE;曝光控制typedef struct tagNET_DVR_EXPOSURE{BYTE byExposureMode; /*0 手动曝光 1自动曝光*/BYTE byRes[3];DWORD dwVideoExposureSet; /*自定义视频曝光时间*/DWORD dwExposureUserSet; /* 自定义曝光时间,在抓拍机上应用时,CCD模式时是抓拍快门速度*/DWORD dwRes;} NET_DVR_EXPOSURE, *LPNET_DVR_EXPOSURE;宽动态配置typedef struct tagNET_DVR_WDR{BYTE byWDREnabled; /*宽动态:0 dsibale 1 enable 2 auto*/BYTE byWDRLevel1; /*0-F*/BYTE byWDRLevel2; /*0-F*/BYTE byWDRContrastLevel; /*0-100*/BYTE byRes[16];} NET_DVR_WDR, *LPNET_DVR_WDR;日夜转换功能配置typedef struct tagNET_DVR_DAYNIGHT{BYTE byDayNightFilterType; /*日夜切换:0 day,1 night,2 auto */BYTE bySwitchScheduleEnabled; /*0 dsibale 1 enable,(保留)*///模式1(保留)BYTE byBeginTime; /*0-100*/BYTE byEndTime; /*0-100*///模式2BYTE byDayToNightFilterLevel; //0-7BYTE byNightToDayFilterLevel; //0-7BYTE byDayNightFilterTime;//(60秒)BYTE byRes[5];} NET_DVR_DAYNIGHT, *LPNET_DVR_DAYNIGHT;Gamma校正typedef struct tagNET_DVR_GAMMACORRECT{BYTE byGammaCorrectionEnabled; /*0 dsibale 1 enable*/BYTE byGammaCorrectionLevel; /*0-100*/BYTE byRes[6];} NET_DVR_GAMMACORRECT, *LPNET_DVR_GAMMACORRECT;背光补偿配置typedef struct tagNET_DVR_BACKLIGHT{BYTE byBacklightMode; /*背光补偿:0 OFF 1 UP、2 DOWN、3 LEFT、4 RIGHT、5 MIDDLE、6 USERSET*/BYTE byBacklightLevel; /*0x0-0xF*/BYTE byRes1[2];DWORD dwPositionX1; //(X坐标1)DWORD dwPositionY1; //(Y坐标1)DWORD dwPositionX2; //(X坐标2)DWORD dwPositionY2; //(Y坐标2)BYTE byRes2[4];} NET_DVR_BACKLIGHT, *LPNET_DVR_BACKLIGHT;数字降噪功能typedef struct tag NET_DVR_NOISEREMOVE{BYTE byDigitalNoiseRemoveEnable; /*0-不启用,1-普通模式数字降噪,2-专家模式数字降噪*/BYTE byDigitalNoiseRemoveLevel; /*普通模式数字降噪级别:0x0-0xF*/BYTE bySpectralLevel; /*专家模式下空域强度:0-100*/BYTE byTemporalLevel; /*专家模式下时域强度:0-100*/BYTE byRes[4];} NET_DVR_NOISEREMOVE, *LPNET_DVR_NOISEREMOVE;//CMOS模式下前端镜头配置typedef struct tagNET_DVR_CMOSMODCFG{BYTE byCaptureMod; //抓拍模式:0-抓拍模式1;1-抓拍模式2BYTE byBrightnessGate;//亮度阈值BYTE byCaptureGain1; //抓拍增益1,0-100BYTE byCaptureGain2; //抓拍增益2,0-100DWORD dw C aptureShutterSpeed1;//抓拍快门速度1DWORD dw C aptureShutterSpeed2;//抓拍快门速度2BYTE byRes[4];}NET_DVR_CMOSMODECFG, *LPNET_DVR_CMOSMODECFG;//2009-9-23 IPC CCD参数配置typedef struct tagNET_DVR_CAMERAPARAMCFG{DWORD dwSize;NET_DVR_VIDEOEFFECT struVideoEffect;/*亮度、对比度、饱和度、锐度、色调*/ NET_DVR_GAIN struGain;/*自动增益*/NET_DVR_WHITEBALANCE struWhiteBalance;/*白平衡*/NET_DVR_EXPOSURE struExposure; /*曝光控制*/NET_DVR_GAMMACORRECT struGammaCorrect;/*Gamma校正*/NET_DVR_WDR struWdr;/*宽动态*/NET_DVR_DAYNIGHT struDayNight;/*日夜转换*/NET_DVR_BACKLIGHT struBackLight;/*背光补偿*/NET_DVR_NOISEREMOVE struNoiseRemove;/*数字降噪*/BYTE byPowerLineFrequencyMode; /*0-50HZ; 1-60HZ*/BYTE byIrisMode; /*0 自动光圈 1手动光圈*/BYTE byMirror ; /* 镜像:0 off,1- leftright,2- updown,3-center */BYTE byDigitalZoom; /*数字缩放:0 dsibale 1 enable*/BYTE byDeadPixelDetect; /*坏点检测,0 dsibale 1 enable*/BYTE byBlackPwl;/*黑电平补偿 , 0-255*/BYTE byEptzGate;// EPTZ开关变量: 0不启用电子云台1启用电子云台BYTE byLocalOutputGate; //本地输出开关变量//0-本地输出关闭1-本地BNC输出打开2-HDMI输出关闭//20-HDMI_720P50输出开//21-HDMI_720P60输出开//22-HDMI_1080I60输出开//23-HDMI_1080I50输出开//24-HDMI_1080P24输出开//25-HDMI_1080P25输出开//26-HDMI_1080P30输出开//27-HDMI_1080P50输出开//28-HDMI_1080P60输出开BYTE byCoderOutputMode;//编码器fpga输出模式0直通3像素搬家BYTE byRes1[4];BYTE byDynamicContrastEN; //动态对比度增强0-不增强,1-增强BYTE byDynamicContrast; //动态对比度0-100BYTE byJPEGQuality; //JPEG图像质量0-100NET_DVR_CMOSMODECFG struCmosModeCfg;//CMOS模式下前端参数配置,镜头模式从能力集获取BYTE byRes2[4];}NET_DVR_CAMERAPARAMCFG, *LPNET_DVR_CAMERAPARAMCFG;6. 报警上传结构使用NET_DVR_SetDVRMessageCallBack_V30接口设置回调后,用NET_DVR_SetupAlarmChan_V30接口对设备进行布防,报警信息通过回调函数获取#define MAX_LICENSE_LEN 16 //车牌号最大长度//车牌颜色typedef enum _VCA_PLATE_COLOR_{VCA_BLUE_PLATE = 0, //蓝色车牌VCA_YELLOW_PLATE, //黄色车牌VCA_WHITE_PLATE, //白色车牌VCA_BLACK_PLATE //黑色车牌}VCA_PLATE_COLOR;//车牌类型typedef enum _VCA_PLATE_TYPE_{VCA_STANDARD92_PLATE = 0, //标准民用车与军车VCA_STANDARD02_PLATE, //02式民用车牌VCA_WJPOLICE_PLATE, //武警车VCA_JINGCHE_PLATE, //警车STANDARD92_BACK_PLATE, //民用车双行尾牌VCA_SHIGUAN_PLATE, //使馆车牌VCA_NONGYONG_PLATE, //农用车VCA_MOTO_PLATE //摩托车}VCA_PLATE_TYPE;/*归一化,数值为当前画面的百分比大小*1000, 精度为小数点后三位*/typedef struct tagNET_DVR_VCA_RECT_{float fX; /* 边界框左上角点的X轴坐标,取值范围[0.001,1] */float fY; /* 边界框左上角点的Y轴坐标,取值范围[0.001,1] */float fWidth; /* 边界框的宽度,取值范围[0.001,1] */float fHeight; /* 边界框的高度,取值范围[0.001,1] */}NET_VCA_RECT, *LPNET_DVR_VCA_RECT;//车牌识别结果子结构typedef struct tagNET_DVR_PLATE_INFO_{BYTE byPlateType; //车牌类型BYTE byColor; //车牌颜色BYTE byBright; //车牌亮度BYTE byLicenseLen; //车牌字符个数BYTE byEntireBelieve; //整个车牌的置信度,0-100BYTE byRes[35]; //保留NET_VCA_RECT struPlateRect; //车牌位置char sLicense[MAX_LICENSE_LEN]; //车牌号码BYTE byBelieve[MAX_LICENSE_LEN]; //各个识别字符的置信度,如检测到车牌"浙A12345", 置信度为,20,30,40,50,60,70,则表示"浙"字正确的可能性只有%,"A"字的正确的可能性是%}NET_DVR_PLATE_INFO, *LPNET_DVR_PLATE_INFO;//车辆信息typedef struct tagNET_DVR_VEHICLE_INFO_{DWORD dwIndex; //车辆序号BYTE byVehicleType; //车辆类型,0 表示其它车型,1 表示小型车,2 表示大型车BYTE byColorDepth; //车身颜色深浅,0-深色,1-浅色BYTE byColor; //车身颜色,0-其他色,1-白色,2-银色,3-灰色,4-黑色,5-红色,6-深蓝,7-蓝色,8-黄色,9-绿色,10-棕色,11-粉色;12-紫色;BYTE byRes1; //保留WORD wSpeed; //车辆速度,单位km/hWORD wLength; //车身长度BYTE byIllegalType; //0-正常;1-低速2-超速3-逆行;4-闯红灯BYTE byRes[35]; //保留}NET_DVR_VEHICLE_INFO, *LPNET_DVR_VEHICLE_INFO;//车牌检测结果typedef struct tagNET_DVR_PLATE_RESULT_{DWORD dwSize; //结构长度BYTE byResultType; //0-通过视频识别,1-通过图像进行识别BYTE byChanIndex; //通道号BYTE byRes1[2]; //保留DWORD dwRelativeTime; //相对时间点(保留)BYTE byAbsTime[32]; //绝对时间点,yyyymmddhhmmssxxx,e.g.20090810235959999(毫秒)DWORD dwPicLen; //图片长度DWORD dwPicPlateLen; //车牌小图片长度DWORD dwVideoLen; //录像内容长度BYTE byTrafficLight; //0-非红绿灯抓拍,1-绿灯时抓拍;2-红灯时抓拍BYTE byPicNum; //连拍的图片序号BYTE byDriveChan; //触发车道号BYTE byRes2[33]; //保留NET_DVR_PLATE_INFO struPlateInfo; //车牌信息结构NET_DVR_VEHICLE_INFO struVehicleInfo; //车辆信息BYTE *pBuffer1; // 用于保存获取到的图像或者视频,如果不想获得图片或视频信息,传NULLBYTE *pBuffer2; // 当识别结果为图像识别结果时,指向车牌图片的指针}NET_DVR_PLATE_RESULT, *LPNET_DVR_PLATE_RESULT;//后面紧跟图片数据和录像数据,只传一种,图片数据为场景图片+车牌小图片视频长度为0xffffffff时,表示视频内容异常,此时只上传报警信息,后面无视频内容,指向视频内容的指针为NULL//车牌报警NET_DVR_PLATE_RESULT#define COMM_UPLOAD_ PLATE_RESULT 0x2800 //上传车牌信息7. 手动触发抓拍//抓拍触发请求结构(保留)typedef struct tagNET_DVR_MANUALSNAP{BYTE byRes[24]; //保留}NET_DVR_MANUALSNAP, *LPNET_DVR_MANUALSNAP;BOOL NET_DVR_ManualSnap(LONG lUserID, LPNET_DVR_MANUALSNAP lpInter, LPNET_DVR_PLATE_RESULT lpOuter);功能:设置手动触发抓拍参数说明:输入:lUserID: NET_DVR_Login()的返回值lpInter: NET_DVR_MANUALSNAP结构指针输出:lpOuter:指向NET_DVR_PLATE_RESULT结构的指针返回值:TRUE表示成功,FALSE表示失败8. 图像叠加信息配置#define NET_DVR_GET_IMAGEOVERLAYCFG 1080//获取抓拍机图像叠加信息参数#define NET_DVR_SET_IMAGEOVERLAYCFG 1081//设置抓拍机图像叠加信息参数使用函数NET_DVR_GetDVRConfig()和NET_DVR_SetDVRConfig()配置typedef struct tagNET_DVR_IMAGEOVERLAYCFG{DWORD dwSize;BYTE byOverlayInfo;//叠加使能开关,0-不叠加,1-叠加BYTE byOverlayMonitorInfo;//是否叠加监测点信息,0-不叠加,1-叠加BYTE byOverlayTime;//是否叠加时间,0-不叠加,1-叠加BYTE byOverlaySpeed;//是否叠加速度,0-不叠加,1-叠加BYTE byOverlaySpeeding;//是否叠加超速比例,0-不叠加,1-叠加BYTE byOverlayLimitFlag;//是否叠加限速标志,0-不叠加,1-叠加BYTE byOverlayPlate;//是否叠加车牌,0-不叠加,1-叠加BYTE byOverlayColor;//是否叠加车身颜色,0-不叠加,1-叠加BYTE byOverlayLength;//是否叠加车长,0-不叠加,1-叠加BYTE byOverlayType;//是否叠加车型,0-不叠加,1-叠加BYTE byOverlayColorDepth;//是否叠加车身颜色深浅,保留BYTE byOverlayDriveChan;//是否叠加车道,0-不叠加,1-叠加BYTE byOverlayMilliSec; //叠加毫秒信息0-不叠加,1-叠加BYTE byOverlayIllegalInfo; //叠加违章信息0-不叠加,1-叠加BYTE byOverlayRedOnTime; //叠加红灯已亮时间0-不叠加,1-叠加BYTE byRes1[5]; //保留BYTE byMonitorInfo1[32]; //监测点信息1BYTE byMonitorInfo2[44]; //检测点信息2BYTE byRes2[52]; //保留}NET_DVR_IMAGEOVERLAYCFG, *LPNET_DVR_IMAGEOVERLAYCFG;9. 能力集接口typedef struct tagNET_DVR_SNAP_ABILITY{DWORD dwSize;BYTE byIoInNum;//IO输入口数BYTE byIoOutNum;//IO输出口数BYTE bySingleSnapNum;//单IO触发组数BYTE byLightModeArrayNum;//红绿灯模式组数BYTE byMeasureModeArrayNum;//测速模式组数BYTE byPlateEnable; //车牌识别能力,0-没有,1-有BYTE byLensMode;//前端镜头模式,0-CCD,1-CMOSBYTE byRes[29];} NET_DVR_SNAP_ABILITY, *L PNET_DVR_SNAP_ABILITY;#define SNAPCAMERA_ABILITY 0x300 //抓拍机能力集BOOL NET_DVR_GetDeviceAbility(LONG lUserID, DWORD dwAbilityType, char* szInBuf, DWORD dwInLength, char* szOutBuf, DWORD dwOutLength);函数描述: 获取设备能力描述信息输入参数:lUserID: NET_DVR_Login()的返回值dwAbilityType: 能力类型,具体见宏定义,不同的类型对应的输入和输出缓冲区的内容不一样pInBuf: 输入缓冲区指针(按照设备规定的能力参数的描述方式组合,可以是XML文本字符串指针或结构体指针形式)dwInLength: 输入缓冲区的长度dwOutLength: 用于接收数据的输出缓冲区的长度输出参数:pOutBuf:输出缓冲区指针返回值:TRUE表示成功,FALSE表示失败10. 虚拟线圈配置#define MAX_VL_NUM 5 //最大虚拟线圈个数#define NET_DVR_GET_VTPPARAM 1084 //获取虚拟线圈参数#define NET_DVR_SET_VTPPARAM 1085 //设置虚拟线圈参数typedef struct tagNET_DVR_TRIGCOORDINATE{WORD wTopLeftX; /*线圈左上角横坐标(2个字节),默认为160*/ WORD wTopLeftY; /*线圈左上角纵坐标(2个字节),默认为210*/WORD wWdith; /*线圈宽度(2个字节),默认为1000*/WORD wHeight; /*线圈高度(2个字节),默认为45*/} NET_DVR_TRIGCOORDINATE, *LPNET_DVR_TRIGCOORDINATE;typedef enum _PROVINCE_CITY_IDX_{ANHUI_PROVINCE = 0, //安徽AOMEN_PROVINCE = 1, //澳门BEIJING_PROVINCE = 2, //北京CHONGQING_PROVINCE = 3, //重庆FUJIAN_PROVINCE = 4, //福建GANSU_PROVINCE = 5, //甘肃GUANGDONG_PROVINCE = 6, //广东GUANGXI_PROVINCE = 7, //广西GUIZHOU_PROVINCE = 8, //贵州HAINAN_PROVINCE = 9, //海南HEBEI_PROVINCE = 10, //河北HENAN_PROVINCE = 11, //河南HEILONGJIANG_PROVINCE = 12, //黑龙江HUBEI_PROVINCE = 13, //湖北HUNAN_PROVINCE = 14, //湖南JILIN_PROVINCE = 15, //吉林JIANGSU_PROVINCE = 16, //江苏JIANGXI_PROVINCE = 17, //江西LIAONING_PROVINCE = 18, //辽宁NEIMENGGU_PROVINCE = 19, //内蒙古NINGXIA_PROVINCE = 20, //宁夏QINGHAI_PROVINCE = 21, //青海SHANDONG_PROVINCE = 22, //山东SHANXI_JIN_PROVINCE = 23, //山西SHANXI_SHAN_PROVINCE = 24, //陕西SHANGHAI_PROVINCE = 25, //上海SICHUAN_PROVINCE = 26, //四川TAIWAN_PROVINCE = 27, //台湾TIANJIN_PROVINCE = 28, //天津XIZANG_PROVINCE = 29, //西藏XIANGGANG_PROVINCE = 30, //香港XINJIANG_PROVINCE = 31, //新疆YUNNAN_PROVINCE = 32, //云南ZHEJIANG_PROVINCE = 33 //浙江}PROVINCE_CITY_IDX;typedef struct tagNET_DVR_GEOGLOCATION{int iRes[2]; /*保留*/DWORD dwCity; /*城市,详见PROVINCE_CITY_IDX */}NET_DVR_GEOGLOCA TION, *LPNET_DVR_GEOGLOCA TION;//场景模式typedef enum _SCENE_MODE_{UNKOWN_SCENE_MODE = 0, //未知场景模式HIGHW AY_SCENE_MODE = 1, //高速场景模式SUBURBAN_SCENE_MODE = 2, //郊区场景模式(保留)URBAN_SCENE_MODE = 3, //市区场景模式TUNNEL_SCENE_MODE = 4 //隧道场景模式(保留)}SCENE_MODE;typedef struct tagNET_DVR_VTPARAM{DWORD dwSize;BYTE byEnable;//使能位,是否使用虚拟线圈,0-不使用,1-使用BYTE byIsDisplay;//是否显示虚拟线圈BYTE byLoopPos; //晚间触发线圈的偏向:0-正向,1-负向(保留)BYTE bySnapGain; /*抓拍增益*/DWORD dwSnapShutter; /*抓拍快门速度*/NET_DVR_TRIGCOORDINA TE struTrigCoordinate;NET_DVR_TRIGCOORDINA TE struRes[MAX_VL_NUM];BYTE by TotalLaneNum;/*视频触发的车道数1*/BYTE byPolarLenType; /*偏振镜类型,0:不加偏振镜;1:加施耐德偏振镜。
AMPIRE128X64LCD编程C
AMPIRE128X64LCD编程C基于uC/COS的直流电机PID转速闭环调速控制系统Proteus仿真实现在工业自动控制系统和各种智能产品中常常会用用电动机进行驱动、传动和控制,而现代智能控制系统中,对电机的控制要求越来越精确和迅速,对环境的适应要求越来越高。
随着科技的发展,通过对电机的改造,出现了一些针对各种应用要求的电机,如伺服电机、步进电机、开关磁阻电机等非传统电机。
但是在一些对位置控制要求不高的电机控制系统如传动控制系统中,传统电机如直流电机乃有很大的优势,而要对其进行精确而又迅速的控制,就需要复杂的控制系统。
随着微电子和计算机的发展,数字控制系统应用越来越广泛,数字控制系统有控制精确,硬件实现简单,受环境影响小,功能复杂,系统修改简单,有很好的人机交换界面等特点。
在电机控制系统开发中,常常需要消耗各种硬件资源,系统构建时间长,而在调试时很难对硬件系统进行修改,从而延长开发周期。
随着计算机仿真技术的出现和发展,可用计算机对电机控制系统进行仿真,从而减小系统开发开支和周期。
计算机仿真可分为整体仿真和实时仿真。
整体仿真是对系统各个时间段对各个对象进行计算和分析,从而对各个对象的变化情况有直观的整体的了解,即能对系统进行精确的预测,如Matlab就是一个典型的实时仿真软件。
实时仿真是对时间点的动态仿真,即随着时间的推移它能动态仿真出当时系统的状态。
Proteus是一个实时仿真软件,用来仿真各种嵌入式系统。
它能对各种微控制器进行仿真,本系统即用Proteus对直流电机控制系统进行仿真。
在系统软件开发中开发中可用操作系统,也可不用操作系统。
如用操作系统,程序可实现模块化,并能对系统资源进行统筹管理,最主要的是可实现多任务运行。
如果需要多任务并行运行,并且需要一定的时间间隔,某些任务对时间的要求不高时,如不用操作系统则要占用定时器资源,并且对栈空间和硬件资源很难进行管理,所以在这种情况下需要操作系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar a,b,c,d;
#define LED_DAT P0
sbit pin_SpeedSenser = P3^5; //速度传感器脉冲信号输出端接在T1上
#define TIME_CYLC 100 //12M晶振,定时器10ms 中断一次我们1秒计算一次转速,1000ms/10ms = 100
#define PLUS_PER 2 //码盘的齿数,这里假定码盘上有2个齿,即传感器检测到2个脉冲,认为1圈
#define K 1.0 //校准系数
sbit zhen1=P1^0;
sbit fan1=P1^1;
sbit en1=P1^2;
uchar code loops[] = {0x7f,0xbf,0xdf,0xef}; //定义显示位控制驱动码
uchar code table[]={0x14,0xd7,0x4c,0x45,0x87,0x25,0x24,0x57,0x04,0x05}; // 0,1,2,3,4,5,6,7,8,9
uint Tcounter = 0; //时间计数器
bit Flag_Fresh = 0; // 刷新标志
bit Flag_clac = 0; //计算转速标志
bit Flag_Err = 0; //超量程标志
//在数码管上显示一个四位数
void DisplayFresh();
//计算转速,并把结果放入数码管缓冲区
void ClacSpeed();
//初始化定时器
void init_timer();
//延时函数
void Delay(uint ms);
void it_timer0() interrupt 1 //定时器0中断的响应函数
{
TF0 = 0; //定时器T0用于数码管的动态刷新
TH0 = 0xD8; //初始化
TL0 = 0xF0;
Flag_Fresh = 1;
Tcounter++;
if(Tcounter>TIME_CYLC)
{
Flag_clac = 1;//周期到,该重新计算转速了
}
}
void it_timer1() interrupt 3 //中断地址是0x001b
{
TF1 = 0; //定时器T1用于单位时间内收到的脉冲数,要速度不是很快,T1永远不会益处
Flag_Err = 1; //如果速度很高,我们应考虑另外一种测速方法:脉冲宽度算转速
}
void main(void)
{
init_timer();
while(1)
{
zhen1=1;
fan1=0;
en1=1;
Delay(31);
en1=0;
Delay(169);
if(Flag_Fresh)
{
Flag_Fresh = 0;
DisplayFresh(); // 定时刷新数码管显示
}
if(Flag_clac)
{
Flag_clac = 0;
ClacSpeed(); //计算转速,并把结果放入数码管缓冲区
Tcounter = 0;//周期定时清零
TH1=TL1 = 0x00;//脉冲计数清零
}
if(Flag_Err) //超量程处理
{
//数码管显示字母'EEEE',开机时初始化为0000
a = 0x2c;
b = 0x2c;
c = 0x2c;
d = 0x2c;
while(1)
{
DisplayFresh();//不再测速等待复位i
}
}
}
}
//在数码管上显示一个四位数
void DisplayFresh()
{
P2 =loops[0] ;
LED_DAT = table[a];
Delay(20);
P2 =loops[1] ;
LED_DAT = table[b];
Delay(20);
P2 =loops[2] ;
LED_DAT = table[c];
Delay(20);
P2 =loops[3] ;
LED_DAT = table[d];
Delay(20);
}
//计算转速,并把结果放入数码管缓冲区
void ClacSpeed()
{
uint speed ;
ulong PlusCounter;
PlusCounter = TH1*256 + TL1;
speed = K*(PlusCounter/PLUS_PER);//K是校准系数,如速度不准,调节K的大小
a = (speed/1000)%10;
b = (speed/100)%10;
c = (speed/10)%10;
d = speed%10;
}
void init_timer() //初始化
{
TMOD = 0x51; //定时10毫秒,TOT1选择软件门方式1,T0定时,T1计数,96页可查
TH0 = 0xD8; //T0初始化
TL0 = 0xF0;
ET0=1; //T0中断允许
EA=1; //T0中断
TR0=1; //TO运行
TH1 = 0x00; //T1初始化
TL1 = 0x00;
ET1=1; //T1中断允许
TR1=1; //T1运行
zhen1=1;
fan1=0;
}
void Delay(uint ms) //延时0.1ms函数
{
uchar x,y;
for(x=ms;x>0;x--)
for(y=11;y>0;y--);
}。