|
第一届51测试网有奖征文精彩回放,深圳学林电子版权所有 www.51c51.com (专业51单片机学习网站)转载注明出处! 更多精彩稿件请访问论坛http://www.51c51.com/bbs/index.asp |
|
| 作品1:字符型液晶显示模块
作者联系: 邓杰 |
|
| 作品2:用8X8LED点阵屏循环显示 | 作品7:用虚拟IIC总线实现24C02
的应用
|
| 作品3:虚拟仿真仪器UMPS的应用:牛余朋 |
作品8:语音编程、远程控制试验板
社区乞丐 |
| 作品4:万年历数字钟及可调时钟系统 |
作品9:定时开关控制器的制作 |
|
基于89C51的智能转速计 转速计是日常生活中比较重要的计量仪表之一,在汽、电子、纺织、造纸等方面有广泛的应用。但是由于过去的技术比较落后转速计一般都使用机械式或机电式的机构。其结构原理如下:
这样的机构虽然原理非常简单,设计也比较方便,但其缺点也是显而易见的。例如: ·机械接触式设计会影响被测件的正常工作,低速运转时会产生较大影响 ·传动式结构使测量器件寿命变短,间接提高了产品价格,影响其市场占有率 ·采用测速电机,增加了整个系统的成本降低了测量精度 ·功率消耗大,无便携性可言 可见,这样的设计给市场推广带来了很大的阻碍,而且降低了测量精度。从而给很难占领市场。 相比之下本文介绍的智能转速计避免了老式转速计的以上缺点。采用光电测量的方法。 结构框图如下:
光电测量部分原理: 检测齿轮上有10个齿均匀分布在轮盘周围,并被直接固定在被测轴上,安装时光电耦合器的发光二极管和光敏三极管正对齿轮上的齿,当被测轴转动时带动检测齿轮转动,光电耦合器通过对检测齿轮上的齿进行耦合从而产生数字脉冲。脉冲经过放大送向单片机的计数端。 单片机部分工作原理: 本文采用的单片机为AT89C51,内有两个定时/计数器。在程序设计时笔者将T0定时/计数器作为1秒定时使用,将T1定时/计数器作对脉冲的计数器使用。单片机计数端在接收到脉冲后对脉冲进行计数,每隔1秒提取TH1和TL1中的计数数据,并进行相应的运算,对16进制数据进行处理,得到10进制数据,送显示缓存进行显示输出。 在对TH1和TL1数据整合处理时使用到了C程序中的结构和共用的概念 union {
unsigned int word; struct { unsigned
char high; unsigned char low; } bytes; } result; … result.bytes.high=TH1; result.bytes.low=TL1; counter=result.word; 这样一来就可以把两个无符号字符型变量数据按高低字节合并成一个整型变量来处理了。在本文中四位7段LED能够显示0~9999的数值,根据下文提供的计数值与转速之间的关系可确定计数值范围必须达到0~1667,很显然这样的数据通过字节来处理是非常不方便的,但如果通过上述方法转化成整型变量来处理值域变为0~65535,足以容纳0~1667中的任何一个整型数值。 具体计数值与转速之间的数学关系如下: 转速(round/minute)=
并将转速值通过动态扫描电路和程序显示在4位7段LED数码管上。 其优点如下: ·采用单片机控制,精度高,稳定性好,测量范围大 ·功率小,易于提高其便携性能,突出产品优势 ·产品成本低廉,整套系统价格不超过15元人民币 ·抗干扰能力强,可避免外界电磁干扰和其他干扰因素的影响 ·非接触式测量,采用光电器件测量,无连接轴,对被测件无任何影响,提高测量精度 ·电子式测量方法缩小整个系统的体积,使便携式产品的开发更具可操作性 ·非机械式测量方法,采用电子器件,提高设备的寿命,间接降低成本 通过以上比较不难看出智能转速计不管从成本上、精度上还是便携性能上都比原有的机电式设备好得多。从市场开发的角度来看各方面都比较出色。 该产品通过改进还可以做成出租车里程计、水文监测以及气象监测的有关仪器仪表。 #include "reg51.h" #define uchar unsigned char #define uint unsigned int uchar code disptab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code bittab[]={0x01,0x02,0x04,0x08}; uchar data dispbuf[]={0,0,0,0}; void main(void) { void disp(); EA=1;ET0=1; TMOD=0x51; TH0=0x3c;TL0=0xb0; TR0=1;TR1=1; for(;;) { disp(); } } void disp(void) { uchar i,deley; for(i=0;i<4;i++) { P1=bittab[i]; P2=disptab[dispbuf[i]]; for(deley=0;deley<200;deley++); } } void timer(void) interrupt 1 using 1 { static uchar i; uint counter; union { uint word; struct { uchar high; uchar low; } byte; } result; TH0=0x3c;TL0=0xb0; i++; if(i==10) { result.byte.high=TH1; result.byte.low=TL1; counter=result.word; counter*=6; dispbuf[0]=counter%10; dispbuf[1]=counter%100/10; dispbuf[2]=counter%1000/100; dispbuf[3]=counter/1000; } } 我在贵网站上注册名称是symidnight,我的地址是 淮安市大学城 淮安信息学院 谢谢! 宋炎 2005年8月 |