PDA

View Full Version : Chương trình đọc encoder


kiwi
27-04-2009, 04:48 AM
Các bác cho em hỏi chương trình đọc encoder của em như thế này có ổn không vậy?
Với một vấn đề nữa là em dùng thạch anh 4MHz, nhưng em khai báo
#FUSES XT thì nó không chạy được mà phải khai báo là HS, em không hiểu vì sao?
#include "E:\Mo phong\Doc encoder\Doc encoder.h"
#include "def_877a.h"
#include<lcd_lib_4bit.c>
#use delay(clock=4000000)

int8 nghin,tram,chuc,donvi;
int16 count,so_vong,int_count1,x;
void tinhtoan_hienthi(int16 x);

#define INTS_PER_SECOND1 4
#int_rtcc // Ngat Timer 0

void Timer0_isr()
{
count++;
}

#INT_TIMER1 // Chuong trinh ngat Timer 1
void Timer11_isr()
{
SET_TIMER1(12140);
if(--int_count1==0)
{
int_count1 = INTS_PER_SECOND1;
so_vong = (count*255 + get_timer0())*60/100;
count = 0;
set_timer0(0);
}

}


void tinhtoan_hienthi(int16 x) // thuc hien tach so va dua ra hien thi luon
{
nghin = x / 1000 + 0x30;
x = x % 1000;
tram = x / 100 + 0x30; // tách so hang tram
x = x % 100; // chia lay phan du
chuc = x / 10 + 0x30; // tach lay phan chuc
donvi = x % 10 + 0x30; // phan don vi
lcd_putcmd(0xC0);
printf(lcd_putchar,"toc do=");
lcd_putchar(nghin);
lcd_putchar(tram);
lcd_putchar(chuc);
lcd_putchar(donvi);
}

void init()
{
lcd_putcmd(0x80);
int_count1 = INTS_PER_SECOND1;//4 lan 1 giay
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L); // Timer0 is Counter
set_timer0(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // Timer1 is Timer
set_timer1(12140);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
count = 0;
lcd_init();
delay_ms(200);
printf(lcd_putchar,"toc do dong co");
}

void main()
{
init();


so_vong = 0;
// a = 0;
TRISA = 0xFF;
// trisB = 0xFF;
// portb = 0xff;
RD2 = 1;
trisD = 0;
// lcd_init();
// delay_ms(200);
// printf(lcd_putchar,"Liencoi");
while(1) // doan chuong trinh hien thi len LCD
{
tinhtoan_hienthi(so_vong);
delay_ms(500);
}
}

phandinh
27-04-2009, 08:22 AM
theo mình được biết khai báo XT khi dao động ngoài =< 2 Mhz

nguyentrivysv
29-10-2009, 12:21 AM
các anh ơi! anh nào có thể chỉ em viết chương trình vdk đọc encoder và xuất ra tín hiệu điều khiển 1 động cơ "DC servo" ko? để làm cơ cấu master_slave 1 khớp đó .cảm ơn

dinh080888
04-11-2009, 08:57 PM
đây là phần dịch đo tốc độ động cơ dùng encoder = phần mềm keilc mọi người cùng tham khảo nhé: ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIMER
ORG 0013H
LJMP DEM
ORG 0030H
MAIN:

MOV TMOD,#01H
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
MOV IE,#10000111B
SETB TR0
SETB IT1
MOV 40H,#0
MOV R3,#20
HERE:
SJMP HERE
DEM:
INC 40H
RETI
TIMER:
CLR TF0 ;xoa co tran TF0
MOV TH0,#HIGH(-50000) ;nap gia tri dem cho timer
MOV TL0,#LOW(-50000) ;nap gia tri dem cho timer
DJNZ R3,EXIT ;giam R3 roi nhay den nhan ?it neu R=0
MOV R3,#20 ;nap lai gia tri cho R3
CALL HIENTHI ;goi chuong trinh hien thi
EXIT:
RETI ;quay lai chuong trình chinh khi goi ngat
HIENTHI:
MOV A,40H ;nap gia tri cua o nho 40h vao thanh ghi a
MOV B,#10 ;nap gia tri cho thanh ghi b=10
DIV AB ;chia a cho b
MOV DPTR,#MALED ;nap chuong trinh ma led 7 thanh vao thanh ghi dia chi
MOVC A,@A+DPTR
MOV P2,A ;dua gia tri thanh ghi a ra cong p0
SETB P1.0 ;lap gia tri chan p2.0
CLR P1.0 ;xoa chan p2.0
MOV A,B ;nap gia tri trong thanh ghi b vao thanh ghi b
MOVC A,@A+DPTR
MOV P2,A
SETB P1.1
CLR P1.1
MOV 40H,#0
JMP EXIT
MALED : DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END