#define PORT_0 0x1e0<br />#define PORT_1 PORT_0+1<br />#define PORT_2 PORT_0+2<br />#define PORT_3 PORT_0+3<br />#define PORT_4 PORT_0+4<br />#define PORT_5 PORT_0+5 测转速的端口地址,其中D4位为转速光电 传感器信号<br />#define PORT_6 PORT_0+6<br />#define PORT_7 PORT_0+7<br />#define PORT_8 PORT_0+8 8253计数器0的地址<br />#define PORT_9 PORT_0+9 ... 1....<br />#define PORT_A PORT_0+0xa ... 2 ...<br />#define PORT_B PORT_0+0xb .... 控制字..<br /> 由于计数器的溢出不能用,故采用光读计数器的办法,记到一半时,就重装<br />计数器。实验结果是大部分时间是在误差范围内,但是过一段时间就会出现一两次误差很大的数据,这种情况频繁出现,不知哪里出了问题,清高手指点。<br />#include <stdio.h><br />#include <dos.h><br /><br />void init8253()<br />{<br /> short iTemp8253;<br /> iTemp8253 = 0x30;<br /> outportb(PORT_B,iTemp8253);<br /> iTemp8253 = 0x70;<br /> outportb(PORT_B,iTemp8253);<br />}<br />unsigned int read8253(int l)<br />{ unsigned int i,j;<br /> unsigned char c;<br /> c=l;<br /> outportb(PORT_B,0x00+0x40*c);<br /> c=inportb(PORT_8+l);<br /> i=c;<br /><br /> c=inportb(PORT_8+l);<br /> j=c;<br /><br /> j=j*256+i;<br /> return(j);<br />}<br />main()<br />{<br /> unsigned char k,count,status=0;<br /> unsigned int m,count1;<br /> float time=0,times=0;<br /> printf(" Interval Time
");<br /> init8253();<br /> read8253(0);<br />while(1)<br /> {<br /> k=inportb(PORT_5);<br /> if(k&0x10)<br /> { if(status)<br /> { m=read8253(0);<br /> time=(65535-m)/1000.0*4.47+times;<br /> count1=(unsigned int) (60000/time);<br /> printf("Sudu: %u
",count1); 转速输出<br /><br /><br /><br /> }<br /> else status=1;<br /> outportb(PORT_8,0xff);<br /> outportb(PORT_8,0xff);<br /> times=0;<br /><br /> do<br /> { k=inportb(PORT_5);<br /> }<br /> while(k&0x10);<br /> }<br /> else<br /> { m=read8253(0);<br /> if(m<=32767)<br /> {<br /> outportb(PORT_8,0xff);<br /> outportb(PORT_8,0xff);<br /> times=times+(65535-m)/1000.0*4.47;<br /> do<br /> {<br /> m=read8253(0);<br /> }<br /> while(m>32767);<br /> }<br /><br /> }<br />}<br />} |
|