M
mattycha
Guest
Chào.Tôi cố gắng để nhân rộng một dự án từ tốt nhất-vi điều khiển-ví dụ.
Đây là một loạt dự án dectector siêu âm.Ban đầu, nó được viết bằng 16F88
nhưng tôi thay đổi thành 18F2455.Ngoài ra, mã ban đầu được viết bằng mikroC
nhưng tôi chuyển sang C18.Vấn đề tôi gặp là mặc dù Hoa Kỳ phát hiện phạm vi của tôi là
khoảng 11cm về từ tường, đọc LCD là 23.641 ......
Tôi không chắc chắn là lý do tại sao các hình LCD hiển thị như một giá trị lớn.Tôi đã thay đổi
nhị phân thành thập phân bằng cách sử dụng một chức năng "putdec".Tôi đang sử dụng 20MHz tinh thể và
Tôi tính để sản xuất một khoảng thời gian 40kHz trên RC1.RC2 là pin tiếp nhận,
cố gắng nắm bắt tín hiệu bằng cách sử dụng CCP1CON = 0b00000101.
Mã số:# include <p18f2455.h>
# include <delays.h>
# pragma config FOSC = HS
# pragma config WDT = OFF
# pragma config PWRT = OFF
# pragma config BOR = OFF
# pragma config LVP = OFF
# pragma config MCLRE = ON# pragma ngắt MyHighInt
# pragma code high_vector = 0x08void MyHighInt (void);
void high_vector (void);
void enable_interrupts (void);
void disable_interrupts (void);
void siêu âm (void);
void display (int value);
void welcome ();
void clearLCD ();
void writeData (unsigned char dữ liệu);
void sendData (unsigned char dữ liệu);
void writeString (rom char * str);
void putdec (int n);int T1_O = 0; / / timer1 tràn cập nhật trong ngắt thường lệ
int t_capL = 0; / / timer1 thấp
int t_capH = 0; / / timer1 cao
int t_capO = 0; / / timer1 tràn
int CapVal = 0; / / chụp
unsigned short CapInt = 0; / / chiếm được một cái gì đó trong ngắt thường lệ
unsigned short capon = 1; / / chụp chỉ có 1 giá trị# define gửi PORTCbits.RC1
# define LCDData PORTB
# define rs PORTAbits.RA3
# define PORTAbits.RA2 rw
# define en PORTAbits.RA5void high_vector (void)
(
_asm GOTO MyHighInt _endasm
)# pragma mãvoid MyHighInt (void)
(
nếu (PIR1bits.TMR1IF == 1)
(
PIR1bits.TMR1IF = 0; / / rõ ràng tràn timer1 bit
T1_O ;
)nếu (PIR1bits.CCP1IF == 1)
(
PIR1bits.CCP1IF = 0; / / rõ ràng chụp flagnếu (capon == 1)
(
Capon = 0;
t_capL = CCPR1L;
t_capH = CCPR1H;
t_capO = T1_O;
CapInt = 1;
)
)
)void main (void)
(
int val, s1, s2, tH, TL, tO;
unsigned long calc = 0;CCP1CON = 0b00000101; / / ĐTC để nắm bắt mọi cạnh tăng
T1CONbits.TMR1ON = 1; / / timer1 ngày
ADCON0 = 0;
ADCON1 = 0x0F;
PORTB = 0;
TRISB = 0;
TRISCbits.TRISC1 = 0; / /
TRISCbits.TRISC2 = 1; / / nhận tín hiệu Mỹ
/ / LCD
TRISAbits.TRISA3 = 0;
TRISAbits.TRISA2 = 0;
TRISAbits.TRISA5 = 0;
rs = 0;
rw = 0;
en = 0;CapInt = 0; / / đặt lại chụp chỉ báofor (;
(
Capon = 1; / / cho phép chụp một giá trị
tO = T1_O; / / lấy giá trị hiện tại
tH = TMR1H;
TL = TMR1L;t_capL = 0; t_capH = 0; t_capO = 0; / / khởi tạo chụpsiêu âm ();
enable_interrupts ();
hiển thị (val);
disable_interrupts ();nếu (CapInt == 0) / / không echo??
(
enable_interrupts ();
hiển thị (val);
disable_interrupts ();
)if (CapInt == 1) / / chiếm được bất cứ điều gì??
(
CapInt = 0; / / đặt lại cho thời gian tới
s1 = (t_capH - tH);
s2 = (t_capL - TL);
calc = ((s1 <<8)) s2;
calc *= 34;
calc / = 10000; / / (1/20MHz) * 340m / s * 100cm / m * 2
val = (int) calc;
hiển thị (val);
)
clearLCD ();
)
)
void enable_interrupts (void)
(
PIR1bits.TMR1IF = 0; / / timer1
PIR1bits.CCP1IF = 0; / / chụp
PIE1bits.CCP1IE = 1; / / ngắt bật
INTCONbits.GIE = 1; / / cho phép ngắt toàn cầu
INTCONbits.PEIE = 1; / / cho phép ngắt ngoại vi
)
void disable_interrupts (void)
(
INTCONbits.GIE = 0; / / vô hiệu hóa toàn cầu ngắt
INTCONbits.PEIE = 0; / / vô hiệu hóa ngắt ngoại vi
)
void siêu âm (void)
(
gửi = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
gửi = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();gửi = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
gửi = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();gửi = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
gửi = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
gửi = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
gửi = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
)
void display (int value) (
welcome ();
sendData (0xC0); / / dòng 2, vị trí 0
writeString ( "Quận:");
sendData (0xC5);
putdec (giá trị);
Delay1KTCYx (5000); / / chờ 1second
)
void welcome ()
(
Delay1KTCYx (250); / / Đợi 20ms
sendData (0x38); / / Set LCD đến 8-bit hoạt động, 2-hiển thị dòng và 5 x 8 dot character font
Delay1KTCYx (250); / / Wait 2ms
sendData (0x0E); / / Turn off màn hình LCD, con trỏ chuột ra và blinker off
Delay1KTCYx (15); / / Wait 2ms
sendData (0x01); / / Xoá màn hình LCD
Delay1KTCYx (15); / / Wait 2ms
sendData (0x06); / / Đặt chế độ nhập LCD để tăng bởi một và để chuyển con trỏ đến bên phải.
Không có thay đổi sẽ hiển thị.sendData (0x80);
writeString ( "siêu âm trong cm");
)void clearLCD ()
(
Delay1KTCYx (250); / / Đợi 20ms
sendData (0x38); / / Set LCD đến 8-bit hoạt động, 2-hiển thị dòng và 5 x 8 dot character font
Delay1KTCYx (250); / / Wait 2ms
sendData (0x0E); / / Turn off màn hình LCD, con trỏ chuột ra và blinker off
Delay1KTCYx (15); / / Wait 2ms
sendData (0x01); / / Xoá màn hình LCD
Delay1KTCYx (15); / / Wait 2ms
sendData (0x06); / / Đặt chế độ nhập LCD để tăng bởi một và để chuyển con trỏ đến bên phải.
Không có thay đổi sẽ hiển thị.
)void sendData (unsigned char data) (
LCDData = dữ liệu;
rs = 0;
rw = 0;
en = 1;
Delay1KTCYx (1);
en = 0;
)void writeData (unsigned char data) (
LCDData = dữ liệu;
rs = 1;
rw = 0;
en = 1;
Delay1KTCYx (1);
en = 0;
)void writeString (rom char * str) (
while (* str) (
writeData (* str);
str ;
)
)void putdec (int n)
(
int rem = n% 10;
int quot = n / 10;
nếu (quot> 0)
(
putdec (quot);
)
writeData (rem '0 ');
)
Đây là một loạt dự án dectector siêu âm.Ban đầu, nó được viết bằng 16F88
nhưng tôi thay đổi thành 18F2455.Ngoài ra, mã ban đầu được viết bằng mikroC
nhưng tôi chuyển sang C18.Vấn đề tôi gặp là mặc dù Hoa Kỳ phát hiện phạm vi của tôi là
khoảng 11cm về từ tường, đọc LCD là 23.641 ......
Tôi không chắc chắn là lý do tại sao các hình LCD hiển thị như một giá trị lớn.Tôi đã thay đổi
nhị phân thành thập phân bằng cách sử dụng một chức năng "putdec".Tôi đang sử dụng 20MHz tinh thể và
Tôi tính để sản xuất một khoảng thời gian 40kHz trên RC1.RC2 là pin tiếp nhận,
cố gắng nắm bắt tín hiệu bằng cách sử dụng CCP1CON = 0b00000101.
Mã số:# include <p18f2455.h>
# include <delays.h>
# pragma config FOSC = HS
# pragma config WDT = OFF
# pragma config PWRT = OFF
# pragma config BOR = OFF
# pragma config LVP = OFF
# pragma config MCLRE = ON# pragma ngắt MyHighInt
# pragma code high_vector = 0x08void MyHighInt (void);
void high_vector (void);
void enable_interrupts (void);
void disable_interrupts (void);
void siêu âm (void);
void display (int value);
void welcome ();
void clearLCD ();
void writeData (unsigned char dữ liệu);
void sendData (unsigned char dữ liệu);
void writeString (rom char * str);
void putdec (int n);int T1_O = 0; / / timer1 tràn cập nhật trong ngắt thường lệ
int t_capL = 0; / / timer1 thấp
int t_capH = 0; / / timer1 cao
int t_capO = 0; / / timer1 tràn
int CapVal = 0; / / chụp
unsigned short CapInt = 0; / / chiếm được một cái gì đó trong ngắt thường lệ
unsigned short capon = 1; / / chụp chỉ có 1 giá trị# define gửi PORTCbits.RC1
# define LCDData PORTB
# define rs PORTAbits.RA3
# define PORTAbits.RA2 rw
# define en PORTAbits.RA5void high_vector (void)
(
_asm GOTO MyHighInt _endasm
)# pragma mãvoid MyHighInt (void)
(
nếu (PIR1bits.TMR1IF == 1)
(
PIR1bits.TMR1IF = 0; / / rõ ràng tràn timer1 bit
T1_O ;
)nếu (PIR1bits.CCP1IF == 1)
(
PIR1bits.CCP1IF = 0; / / rõ ràng chụp flagnếu (capon == 1)
(
Capon = 0;
t_capL = CCPR1L;
t_capH = CCPR1H;
t_capO = T1_O;
CapInt = 1;
)
)
)void main (void)
(
int val, s1, s2, tH, TL, tO;
unsigned long calc = 0;CCP1CON = 0b00000101; / / ĐTC để nắm bắt mọi cạnh tăng
T1CONbits.TMR1ON = 1; / / timer1 ngày
ADCON0 = 0;
ADCON1 = 0x0F;
PORTB = 0;
TRISB = 0;
TRISCbits.TRISC1 = 0; / /
TRISCbits.TRISC2 = 1; / / nhận tín hiệu Mỹ
/ / LCD
TRISAbits.TRISA3 = 0;
TRISAbits.TRISA2 = 0;
TRISAbits.TRISA5 = 0;
rs = 0;
rw = 0;
en = 0;CapInt = 0; / / đặt lại chụp chỉ báofor (;
(
Capon = 1; / / cho phép chụp một giá trị
tO = T1_O; / / lấy giá trị hiện tại
tH = TMR1H;
TL = TMR1L;t_capL = 0; t_capH = 0; t_capO = 0; / / khởi tạo chụpsiêu âm ();
enable_interrupts ();
hiển thị (val);
disable_interrupts ();nếu (CapInt == 0) / / không echo??
(
enable_interrupts ();
hiển thị (val);
disable_interrupts ();
)if (CapInt == 1) / / chiếm được bất cứ điều gì??
(
CapInt = 0; / / đặt lại cho thời gian tới
s1 = (t_capH - tH);
s2 = (t_capL - TL);
calc = ((s1 <<8)) s2;
calc *= 34;
calc / = 10000; / / (1/20MHz) * 340m / s * 100cm / m * 2
val = (int) calc;
hiển thị (val);
)
clearLCD ();
)
)
void enable_interrupts (void)
(
PIR1bits.TMR1IF = 0; / / timer1
PIR1bits.CCP1IF = 0; / / chụp
PIE1bits.CCP1IE = 1; / / ngắt bật
INTCONbits.GIE = 1; / / cho phép ngắt toàn cầu
INTCONbits.PEIE = 1; / / cho phép ngắt ngoại vi
)
void disable_interrupts (void)
(
INTCONbits.GIE = 0; / / vô hiệu hóa toàn cầu ngắt
INTCONbits.PEIE = 0; / / vô hiệu hóa ngắt ngoại vi
)
void siêu âm (void)
(
gửi = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
gửi = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();gửi = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
gửi = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();gửi = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
gửi = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
gửi = 1;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
Delay1TCY ();
gửi = 0;
Delay10TCYx (6);
Delay1TCY ();
Delay1TCY ();
)
void display (int value) (
welcome ();
sendData (0xC0); / / dòng 2, vị trí 0
writeString ( "Quận:");
sendData (0xC5);
putdec (giá trị);
Delay1KTCYx (5000); / / chờ 1second
)
void welcome ()
(
Delay1KTCYx (250); / / Đợi 20ms
sendData (0x38); / / Set LCD đến 8-bit hoạt động, 2-hiển thị dòng và 5 x 8 dot character font
Delay1KTCYx (250); / / Wait 2ms
sendData (0x0E); / / Turn off màn hình LCD, con trỏ chuột ra và blinker off
Delay1KTCYx (15); / / Wait 2ms
sendData (0x01); / / Xoá màn hình LCD
Delay1KTCYx (15); / / Wait 2ms
sendData (0x06); / / Đặt chế độ nhập LCD để tăng bởi một và để chuyển con trỏ đến bên phải.
Không có thay đổi sẽ hiển thị.sendData (0x80);
writeString ( "siêu âm trong cm");
)void clearLCD ()
(
Delay1KTCYx (250); / / Đợi 20ms
sendData (0x38); / / Set LCD đến 8-bit hoạt động, 2-hiển thị dòng và 5 x 8 dot character font
Delay1KTCYx (250); / / Wait 2ms
sendData (0x0E); / / Turn off màn hình LCD, con trỏ chuột ra và blinker off
Delay1KTCYx (15); / / Wait 2ms
sendData (0x01); / / Xoá màn hình LCD
Delay1KTCYx (15); / / Wait 2ms
sendData (0x06); / / Đặt chế độ nhập LCD để tăng bởi một và để chuyển con trỏ đến bên phải.
Không có thay đổi sẽ hiển thị.
)void sendData (unsigned char data) (
LCDData = dữ liệu;
rs = 0;
rw = 0;
en = 1;
Delay1KTCYx (1);
en = 0;
)void writeData (unsigned char data) (
LCDData = dữ liệu;
rs = 1;
rw = 0;
en = 1;
Delay1KTCYx (1);
en = 0;
)void writeString (rom char * str) (
while (* str) (
writeData (* str);
str ;
)
)void putdec (int n)
(
int rem = n% 10;
int quot = n / 10;
nếu (quot> 0)
(
putdec (quot);
)
writeData (rem '0 ');
)