导航:首页 > 操作系统 > 单片机光电门测速仿真

单片机光电门测速仿真

发布时间:2022-12-13 17:34:55

⑴ 如何进行单片机计数计时

只要开通单片机的定时器中断就可以呀,先设置好定时器的中断周期,然后开启定时器就可以了。

⑵ 怎样用光电门测物体的速度

光电门主要应用于计数,计时,测速等方面当光电门计数时,传感器将高低变化的信号传到计数器上,计数器进行计数。电压升高再恢复原值计数器计数一次。

当计数器计时时,计数器获得高电压时计时开始,获得低电压时计时停止。测得时间为物体完全通过光电门的时间。光电门测速也是根据计时的原理。

光电门原理应用很广泛,现已经不局限于门的形状,如点钞机,生产线计数器,光控路灯等。

(2)单片机光电门测速仿真扩展阅读:

光电门的原理:

当物体通过光电门时光被挡住,计时器开始计时,当物体离开时停止计时,这样就可以根据物体大小与运动时间计算物体运动的速度;若计时装置具备运算功能,使用随机配置的挡光片(宽度一定),可以直接测量物体的瞬时速度。

光电门是由一个小的聚光灯泡和一个光敏管组成的,聚光灯泡对准光敏管,光敏管前面有一个小孔可以接收光的照射。光敏门与计时仪是按以下方式连接的。

即当两个光电门的任一个被挡住时,计时仪开始计时;当两个光电门中任一个被再次挡光时,计时终止。计时仪显示的是两次挡光之间的时间间隔。

其工作原理是光照度改变使光敏电阻阻值的改变,而引起光敏电阻两端电压的改变。电压变化信号通过传感器传到计数器上计数计时。

光电门一端有个线性光源,另一端有个光敏电阻,门中无物体阻挡时光照射到光敏电阻上。有光照时光敏电阻阻值减小,光敏电阻两端为低电压。当门中有物体阻挡时,光敏电阻受到光照度减小,电阻增大,光敏电阻两端为高电压。

换而言之,当光电门传感器之间没有物体阻挡时,其内部电路断开;当光电门传感器之间有物体阻挡时,其内部电路接通。

⑶ 求助高手修改51单片机控制测速的程序

我也才在开始学帮不了你,但想跟你交个朋友

⑷ proteus仿真单片机测速中,motor encoder作为脉冲源就显示转速一直为0是为什么!

你接motor encode的左边或右边引出线,就没有问题了。中间那根线一圈发一个脉冲,如果速度很低的话,可能被舍掉了。

⑸ 单片机制作红外测速仪

运放电路接错了,运放hi虚断的,所以要像你说的那样,接收器要通过电阻接地,再从中间引线到运放正极

⑹ 求一份使用MSP4302553单片机做的样例代码,是调用光电门测速的,越快越好

//******************************************************************************
// HW UART(J4)!!!!!! 特别注意,板子上J4有2个跳线要竖放,设为HW UART模式
// ADC检测,并通过串口发送到PC
// MSP430G2533 Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK
// http://jiwm.blog.163.com
// Baud rate divider with 1MHz = 1MHz/9600 = ~104.2
// ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz
//
// MSP430G2xx3
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P1.2/UCA0TXD|------------>
// | | 9600 - 8N1
// | P1.1/UCA0RXD|<------------
//
// IAR Embedded Workbench Version: 5.40
//******************************************************************************
#include "msp430g2553.h"
long temp;
long IntDegF;
long IntDegC;
unsigned int i;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL1 = INCH_10 + ADC10DIV_3; // Temp Sensor ADC10CLK/4
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE; //The ADC10OSC, generated internally,
//is in the 5-MHz range, but varies with indivial devices, supply voltage, and temperature. See the device-specific data sheet for the ADC10OSC specification.
DCOCTL = 0x00; // Set DCO 1MHz
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // USCI clock source=SMCLK
UCA0BR0 = 104; // 1MHz 9600 Refer to Page 435 of X2xx Guide
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Molation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
__enable_interrupt(); // Enable interrupts.
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
//__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
for(;;)
{ ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
}


}
#pragma vector=USCIAB0RX_VECTOR //串口中断
__interrupt void USCI0RX_ISR(void)
{
if ((UCA0RXBUF == 'c')||(UCA0RXBUF == 'C')) // 'C' or 'c' received?
{
//IE2 |= UCA0TXIE; // Enable USCI_A0 TX interrupt
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
{
UCA0TXBUF=((IntDegC/10240)+48); //10位数

}
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
{
UCA0TXBUF=((IntDegC/1024)%10+48); //个位数

}

while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
{
UCA0TXBUF=46; //.

}
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
{
UCA0TXBUF=((IntDegC*10/1024%10)+48); //小数

}
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
{
UCA0TXBUF=13; //换行

}


}
else
{


//IE2 |= UCA0TXIE; // Enable USCI_A0 TX interrupt
UCA0TXBUF = 13; //换行
}
}

// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
temp = ADC10MEM;
//IntDegC = ((temp - 673) * 423) / 1024; //-278~144 ,精度降低了
IntDegC = ((temp - 673) * 423); //改进后的


}

⑺ 光电门连接单片机测速插拔信号线才有反应,遮挡物通过无反应,为神马

请检测你的光电门输出电平信号是否正常。

⑻ 单片机直流电机测速实验程序

#include<reg52.h>
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int

//*********************//
sbit ENA = P2^2; //驱动芯片使能,若为0则电机停止;
sbit IN1 = P2^1; //控制电机正转和反转
sbit IN2 = P2^0; //控制电机正转和反转
sbit key1 = P1^0; //此键按下,电机正转;IN1=1;IN2=0 ;ENA=1
sbit key2 = P1^1; //此键按下,电机反转;IN1=0,IN2=1 ;ENA=1
sbit key3 = P1^2; //此键按下,电机刹停; IN1=1,IN2=1 ;ENA=1
//*********************//

int motor_change_mank=0;

// 按键设置
//**********************//
uint keylogo()
{
if(key1==0)
{
delayms(2) ;
//while(key1==0);
motor_change_mank=1;//正转标志位
}

if(key2==0)
{
delayms(2) ;
//while(key2==0);
motor_change_mank=2;//反转标志位
}

if(key3==0)
{
delayms(2) ;
//while(key3==0);
motor_change_mank=0;//刹停标志位
}

return(motor_change_mank);

}

//**********************//
//控制驱动芯片函数
//**********************//
void execute_motor()
{
switch(motor_change_mank)
{
case 0: //刹停标志位
{
IN1 = 1;
IN2 = 1;
ENA = 1;
}break;

case 1: //正转标志位
{
IN1 = 1;
IN2 = 0;
ENA = 1;
}break;

case 2: //反转标志位
{
IN1 = 0;
IN2 = 1;
ENA = 1;
}break;

default:break;

}

}
//**********************//

void main()
{

while(1)
{
keylogo();
execute_motor();
}

}

/**********************************************************************/
/**********************************************************************/
#define uint unsigned int

void delayms(uint n)
{
int i;
for(;n>0;n--)
for(i=0;i<1;i++);
}

/**********************************************************************/
/**********************************************************************/
#ifndef delay_h
#define delay_h
#define uint unsigned int

extern void delayms(uint n);

#endif

⑼ 单片机光电门测速

从实验原理看的确只能得到60的倍数。
建议将计数周期从1秒,调整到1.1秒,2.3秒等等,一来可以减少误差,二使得结果不能被整除,估计这样就能出现个位数了。但是单片机估计都不带浮点计算的,程序可能会复杂一点。

阅读全文

与单片机光电门测速仿真相关的资料

热点内容
dvd光盘存储汉子算法 浏览:755
苹果邮件无法连接服务器地址 浏览:958
phpffmpeg转码 浏览:669
长沙好玩的解压项目 浏览:140
专属学情分析报告是什么app 浏览:562
php工程部署 浏览:831
android全屏透明 浏览:730
阿里云服务器已开通怎么办 浏览:801
光遇为什么登录时服务器已满 浏览:300
PDF分析 浏览:483
h3c光纤全工半全工设置命令 浏览:140
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:682
如何取消命令方块指令 浏览:347
风翼app为什么进不去了 浏览:777
im4java压缩图片 浏览:360
数据查询网站源码 浏览:148
伊克塞尔文档怎么进行加密 浏览:889
app转账是什么 浏览:162