我用51單片機連接直流電機的編碼器(帶碼盤385直流電機 AB相編碼器,96線碼盤,A相和B相輸出可直接單片機IO口識別,我只接了A相),用二個四段共陰數碼管的后五位顯示編碼器輸出了多少次脈沖,用手工轉動電機,當轉速很慢的時候,一圈可以讀取96個數,是正確的,但當轉速稍快一點時,一圈就只能讀20-30左右個數,丟了很多,更別說通電旋轉每分鐘6000轉了,丟的更多,不知道為什么,請高手幫忙指教。
單片機源程序如下:
#include "reg52.h"
typedef unsigned int u16; //對系統默認數據類型進行重定義
typedef unsigned char u8;
#define SMG_A_DP_PORT P0 //使用宏定義數碼管段碼口
//定義數碼管位選信號控制腳
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//共陰極數碼管顯示0~F的段碼數據
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//定義輸入控制腳
sbit bianma=P3^1;
/*******************************************************************************
* 函 數 名 : delay_10us
* 函數功能 : 延時函數,ten_us=1時,大約延時10us
* 輸 入 : ten_us
* 輸 出 : 無
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* 函 數 名 : smg_display
* 函數功能 : 動態數碼管顯示
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void smg_display(u8 dat[])
{
u8 i=0;
for(i=3;i<8;i++)
{
switch(i)//位選
{
case 0: LSC=1;LSB=1;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[0]];break;
case 1: LSC=1;LSB=1;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[1]];break;
case 2: LSC=1;LSB=0;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[2]];break;
case 3: LSC=1;LSB=0;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[3]];break;
case 4: LSC=0;LSB=1;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[4]];break;
case 5: LSC=0;LSB=1;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[5]];break;
case 6: LSC=0;LSB=0;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[6]];break;
case 7: LSC=0;LSB=0;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[7]];break;
}
delay_10us(1);//延時一段時間,等待顯示穩定
SMG_A_DP_PORT=0x00;//消音
}
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
u16 roll_11=0;
u16 roll;
u8 key=0;
u8 rollb8[8];
while(1)
{
if(key==0&&bianma==0)//有接地脈沖
{
delay_10us(1);//消抖
key=1;
if(bianma==0)roll_11++;
}
else if(bianma==1) //無接地脈沖
{
delay_10us(1);//消抖
key=0;
}
roll=roll_11;
rollb8[3]=roll/100000; //讀取萬位數
rollb8[4]=roll%10000/1000; //讀取千位數
rollb8[5]=roll%1000/100; //讀取百位數
rollb8[6]=roll%100/10; //讀取十位數
rollb8[7]=roll%10; //讀取個位數
smg_display(rollb8); //調用數碼管顯示
}
}
|