⑴ 如何進行單片機計數計時
只要開通單片機的定時器中斷就可以呀,先設置好定時器的中斷周期,然後開啟定時器就可以了。
⑵ 怎樣用光電門測物體的速度
光電門主要應用於計數,計時,測速等方面當光電門計數時,感測器將高低變化的信號傳到計數器上,計數器進行計數。電壓升高再恢復原值計數器計數一次。
當計數器計時時,計數器獲得高電壓時計時開始,獲得低電壓時計時停止。測得時間為物體完全通過光電門的時間。光電門測速也是根據計時的原理。
光電門原理應用很廣泛,現已經不局限於門的形狀,如點鈔機,生產線計數器,光控路燈等。
(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秒等等,一來可以減少誤差,二使得結果不能被整除,估計這樣就能出現個位數了。但是單片機估計都不帶浮點計算的,程序可能會復雜一點。