Xin chào tất cả mọi người,
Em là sinh viên khoa ô tô đang làm đồ án về đo quãng đường đi để nhắc nhở thay dầu. Yêu cầu của đồ án là sử dụng Proteus và Codevision AVR, trong đó phải có màn hình LCD 16x2 và ATmega16
Hiện tại em đang dùng động cơ Encorder để mô phỏng việc đếm xung thay cho đếm số vòng quay bánh xe. Và em cũng đã tham khảo được từ trên mạng một bộ mạch và code của 2 phần mềm trên về đo tốc độ động cơ.
Nhưng bây giờ em đang gặp khó khăn là code em tham khảo là đang đo tốc độ động cơ và hiển thị nó lên LCD. Em rất cần sự trợ giúp từ mọi người giúp em sửa code thành đếm số xung hiển thị lên LCD và đến một số xung nào đó (ví dụ: 5000 xung) thì nó sẽ thông báo "Oil change" lên màn hình LCD.
Em sẽ gửi link file phía dưới ạ
Cám ơn mọi người đã đọc và mong mọi người giúp đỡ e!!!
CODE:
#include <mega16.h>
// Alphanumeric LCD functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <alcd.h>
#include <delay.h>
#include <stdio.h>
//
unsigned int num=0; // Bien dem so xung vao chan INT0
float VT;
//
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
num++;
}
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
}
// Hien thi
void HIEN_THI()
{
unsigned char a,b,c,d,e,f,g;
a=VT/1000;
// lay fan tram
b=(VT-1000*a)/100;
// lay fan chuc
c=(VT-1000*a-100*b)/10;
//
d=VT-1000*a-100*b-10*c ;
//
e=(VT-1000*a-100*b-10*c-d)*10;
f=(VT-1000*a-100*b-10*c-d)*100-e*10;
g=(VT-1000*a-100*b-10*c-d)*1000-e*100-f*10;
// lay hang don vi
lcd_gotoxy(0,1);
// ve vi tri x,y
lcd_putchar(a+48);
// day ra hang tram, ma ascii
lcd_gotoxy(1,1);
lcd_putchar(b+48);
// day ra hang chuc, ma ascii
lcd_gotoxy(2,1);
lcd_putchar(c+48);
// d
lcd_gotoxy(3,1);
lcd_putchar(d+48);
// sau dau thap phan
lcd_gotoxy(5,1);
lcd_putchar(e+48);
// sau so thap phan
lcd_gotoxy(6,1);
lcd_putchar(f+48);
// so sau dau thap phan
lcd_gotoxy(7,1);
lcd_putchar(g+48);
//num=0;
// day ra hang don vi, ma ascii
}
// Declare your global variable
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PIND=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
// Place your code here
if(TCNT1==31250) // Timer1 dem 1s ICNT1 0->31250, voi CLK/256 (TCCR1B=0x04
{
VT=num/24.0;
lcd_gotoxy(0,0);// Dua con tro ve goc, cot 0, dong 0
lcd_putsf("TOC DONG CO: ");// Hien thi dong chu1
HIEN_THI(); // Hien thi gia tri toc do dong co
lcd_gotoxy(4,1);
lcd_putsf(".");
lcd_gotoxy(10,1);// Dua con tro ve goc, cot 0, dong 0
lcd_putsf("(V/s)");// Hien thi dong chu
TCNT1=0;
num=0;
}
}
}
Em là sinh viên khoa ô tô đang làm đồ án về đo quãng đường đi để nhắc nhở thay dầu. Yêu cầu của đồ án là sử dụng Proteus và Codevision AVR, trong đó phải có màn hình LCD 16x2 và ATmega16
Hiện tại em đang dùng động cơ Encorder để mô phỏng việc đếm xung thay cho đếm số vòng quay bánh xe. Và em cũng đã tham khảo được từ trên mạng một bộ mạch và code của 2 phần mềm trên về đo tốc độ động cơ.
Nhưng bây giờ em đang gặp khó khăn là code em tham khảo là đang đo tốc độ động cơ và hiển thị nó lên LCD. Em rất cần sự trợ giúp từ mọi người giúp em sửa code thành đếm số xung hiển thị lên LCD và đến một số xung nào đó (ví dụ: 5000 xung) thì nó sẽ thông báo "Oil change" lên màn hình LCD.
Em sẽ gửi link file phía dưới ạ
Cám ơn mọi người đã đọc và mong mọi người giúp đỡ e!!!
CODE:
#include <mega16.h>
// Alphanumeric LCD functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <alcd.h>
#include <delay.h>
#include <stdio.h>
//
unsigned int num=0; // Bien dem so xung vao chan INT0
float VT;
//
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
num++;
}
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
}
// Hien thi
void HIEN_THI()
{
unsigned char a,b,c,d,e,f,g;
a=VT/1000;
// lay fan tram
b=(VT-1000*a)/100;
// lay fan chuc
c=(VT-1000*a-100*b)/10;
//
d=VT-1000*a-100*b-10*c ;
//
e=(VT-1000*a-100*b-10*c-d)*10;
f=(VT-1000*a-100*b-10*c-d)*100-e*10;
g=(VT-1000*a-100*b-10*c-d)*1000-e*100-f*10;
// lay hang don vi
lcd_gotoxy(0,1);
// ve vi tri x,y
lcd_putchar(a+48);
// day ra hang tram, ma ascii
lcd_gotoxy(1,1);
lcd_putchar(b+48);
// day ra hang chuc, ma ascii
lcd_gotoxy(2,1);
lcd_putchar(c+48);
// d
lcd_gotoxy(3,1);
lcd_putchar(d+48);
// sau dau thap phan
lcd_gotoxy(5,1);
lcd_putchar(e+48);
// sau so thap phan
lcd_gotoxy(6,1);
lcd_putchar(f+48);
// so sau dau thap phan
lcd_gotoxy(7,1);
lcd_putchar(g+48);
//num=0;
// day ra hang don vi, ma ascii
}
// Declare your global variable
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PIND=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
// Place your code here
if(TCNT1==31250) // Timer1 dem 1s ICNT1 0->31250, voi CLK/256 (TCCR1B=0x04
{
VT=num/24.0;
lcd_gotoxy(0,0);// Dua con tro ve goc, cot 0, dong 0
lcd_putsf("TOC DONG CO: ");// Hien thi dong chu1
HIEN_THI(); // Hien thi gia tri toc do dong co
lcd_gotoxy(4,1);
lcd_putsf(".");
lcd_gotoxy(10,1);// Dua con tro ve goc, cot 0, dong 0
lcd_putsf("(V/s)");// Hien thi dong chu
TCNT1=0;
num=0;
}
}
}