久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
一個自己寫的程序 編碼器轉動沒反應
[打印本頁]
作者:
1120320067
時間:
2016-5-1 17:36
標題:
一個自己寫的程序 編碼器轉動沒反應
大神請指教 本程序測得是增量式編碼器位置 說白了就是計數A B脈沖 但是燒進去之后示數一直是0 轉動編碼器不會有反應 前后改了幾次實在是改不出來了 求大神支招
#include <REG51.H> // 寄存器頭文件包含
#include <INTRINS.H> // 空操作函數,移位函數頭文件包含
#define uchar unsigned char
#define uint unsigned int
unsigned char counter;
unsigned char b;
sbit PINA = P1^0;//csn信號white
sbit PINB = P1^1;//這個是時鐘blue
sbit PIND = P1^2;//這個是數據green
sbit LED1 = P2^7;//LED顯示位選控制 千位
sbit LED2 = P2^6;//LED顯示位選控制 百位
sbit LED3 = P2^5;//LED顯示位選控制 十位
sbit LED4 = P2^4;//LED顯示位選控制 個位
uchar led_buf[4]; /*定義LED顯示緩沖區,將帶顯示數值放入該區域*/
/*------------------------------------------------
數碼管段碼表
------------------------------------------------*/
uchar code disp_buff[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
/*------------------------------------------------
延時子程序
------------------------------------------------*/
void delay(unsigned int cnt)
{
while(--cnt);
}
/*void delay(uint t)
{
uint i;
while(t--)
{
for(i=0;i<125;i++){}
}
}*/
/*------------------------------------------------
取編碼器位置值子程序
------------------------------------------------*/
long GetSSI(void)
{
static bit Curr_encoder_b; //定義一個變量來儲存當前B信號
static bit Last_encoder_b; //定義一個變量來儲存上次B腳信號
static bit updata= 0;
if( PINA && PINB) //編碼器無轉動退出
{
updata = 0;
return;
}
Last_encoder_b = PINB; //記錄B信號
while(!PINA) //等待A由低變高
{
Curr_encoder_b = PINB; //記錄等待期間的B信號(指當前B信號)
updata = 1; }
if(updata)
{
updata = 0 ;
if( (Last_encoder_b == 0)&&(Curr_encoder_b== 1) ) //B從0到1為正轉
{
if(counter == 255)
return;
counter++; //正轉計數加
}
else if( (Last_encoder_b == 1)&&(Curr_encoder_b == 0) ) //B從1到0為反轉
{
if(counter == 0)
return;
counter--; //反轉計數減
}
}
}
//LED 共陽
void main()
{
//設置定時器模式
TMOD = 0x01; //設置定時器模式
TL0 = (65636-50000)/256; //設置定時初值
TH0 = (65636-50000)%256; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時;
//啟動定時器2
counter = 0;
while(1)
{
b=GetSSI();//取絕對值編碼器位置數據
led_buf[3]=b/1000;//千位
led_buf[2]=(b%1000)/100;//百位
led_buf[1]=(b%100)/10;//十位
led_buf[0]=b%10; //個位
//將數據的各位數字放入指定緩沖區
P0 = disp_buff[led_buf[3]]; //取顯示數據,千位段碼
LED1 = 0; //點亮LED1(千位)
delay(200); //延時一小段時間
LED1 = 1; //熄滅LED1
P0 = disp_buff[led_buf[2]]; //取顯示數據,段碼
LED2 = 0; //點亮LED2(第二位百位)
delay(200); //延時一小段時間
LED2 = 1; //熄滅LED2
P0 = disp_buff[led_buf[1]]; //取顯示數據,段碼
LED3 = 0; //點亮LED3(第三位十位)
delay(200); //延時一小段時間
LED3 = 1; //熄滅LED3
P0 = disp_buff[led_buf[0]]; //取顯示數據,段碼
LED4 = 0; //點亮LED4(第四位)
delay(200); //延時一小段時間
LED4 = 1; //熄滅LED4
// delay(300);
}
}
作者:
jwjjwj123
時間:
2016-8-11 18:38
樓主問題解決了嗎,我也正要
作者:
jubaolun
時間:
2016-8-11 19:02
這是我的代碼:
如下:改改
#include<reg52.h>
#include "intrins.h"
#include "delay.h"
#include"Drive_parallel.h"
#define uint8 unsigned char //宏定義
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
#define DataPort P0 //數據口
sbit bianmaqiZ=P1^3; //編碼器Z線
sbit fuwei=P3^5; //復位口
sbit BMQshuruB=P3^2; //輸入口接編碼器B線
sbit DIR=P3^3; //比較口接編碼器A線
int i,count;
long bianma;//編碼
uchar code line1_data[]={" 編碼器測試 "};
uchar code line2_data[]={"計數: "};
///////////////////////////////////////
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1) {X=0x80;}
else if (X==2) {X=0x90;}
else if (X==3) {X=0x88;}
else if (X==4) {X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //顯示地址
}
///////////////////////////////////////
void display() // 開機頁面
{
lcd_clr();
lcd_pos(1,0);
for(i=0;i<16;i++)
{
lcd_wdat(line1_data[i]);
delay_ms(1);
}
lcd_pos(3,0);
for(i=0;i<16;i++)
{
lcd_wdat(line2_data[i]);
delay_ms(1);
}
}
void bianma_display() //顯示計數
{
lcd_pos(3,4);
lcd_wdat(bianma/10000%10+0x30);
lcd_wdat(bianma/1000%10+0x30);
lcd_wdat(bianma/100%10+0x30);
lcd_wdat(bianma/10%10+0x30);
lcd_wdat(bianma%10+0x30);
}
////////////////////////////////////////////
void main()
{
lcd_init();//初始化
lcd_clr(); //清屏
display(); //開機頁面
bianma=0;
EA=1; //開總中斷
EX0=1; //外部中斷0打開
IT0=1; //等于0為電平觸發方式,低電平有效,等于1為脈沖觸發方式,下降沿有效.
while(1)
{
if(!fuwei||bianma>999000||bianma<0)
{
bianma=0;bianmaqiZ=0;
bianma_display();
}
bianma_display();
}
}
/*中斷函數,編碼器AB進入單片機時要通過高速光耦隔離,
INT0與INT1口10K上拉電阻接+5V*/
void int0() interrupt 0
{
EX0=0;//外部中斷0關閉//等于0為電平觸發方式,低電平有效,等于1為脈沖觸發方式,下降沿有效,
if(DIR){count--; }//中斷計數---正轉時,A為下降沿,B為高電平
else count++;
if(!BMQshuruB)bianma++; //中斷計數---反轉時,A為下降沿,B為低電平
EX0=1;//外部中斷0打開
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品久久久久久
|
91视频中文
|
免费福利视频一区二区三区
|
国产91丝袜在线播放
|
久久69精品久久久久久久电影好
|
91精品久久久久久综合五月天
|
九九热re
|
日本精品久久久一区二区三区
|
午夜精品一区二区三区在线观看
|
久久国产精品视频
|
久久久久久久久久性
|
午夜影院中文字幕
|
一级毛片观看
|
亚洲精品乱码久久久久久9色
|
可以看黄的视频
|
国产视频第一页
|
999国产精品视频
|
欧美 视频
|
国产精品视频久久
|
99精品亚洲国产精品久久不卡
|
日韩精品在线免费观看
|
日韩中文字幕在线视频
|
97视频精品
|
手机av免费在线
|
久久精品国产v日韩v亚洲
|
日本不卡一区二区三区在线观看
|
国产高清在线视频
|
99热精品6
|
国产成人精品久久
|
日日做夜夜爽毛片麻豆
|
国产一区二区av
|
超碰在线97国产
|
日韩免费看片
|
久久成人午夜
|
午夜久久久
|
精品免费在线
|
91久久国产综合久久
|
www.99re
|
国产一级在线
|
日本成人中文字幕
|
在线观看av网站永久
|