chào các bạn hè rảnh không có việc gì làm nên làm cái mạch này chơi!
Phần cứng:
mega8 nối PORTB là data của led 7 đoạn còn PORTC là quét nối 6 con tran còn IR nối với chân INT0 nói chung phần cứng rất đơn giản![21](http://dientuvietnam.net/forums/images/smilies/21.gif)
Phần mền:
hiện giờ thì mình đã có đủ phần hiển thị giờ(ko có RealTime) và giải mã remote Sony rất good nhưng ko hiểu sao gép 2 phần lại thì lại có vẻ là do delay nên sai số
rất mong các cao thủ góp ý cái nhak![57](http://dientuvietnam.net/forums/images/smilies/57.gif)
CODE:
/************************************************** ***
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers
Project :
Version :
Date :
Author :
Company :
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 1,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/
#include <mega8.h>
#include <delay.h>
#define data_led PORTB
#define quet_led PORTC
#define un unsigned
un char gio,phut,giay;
flash unsigned char ma_led[]={0x80,0xF3,0x49,0x60,0x33,0x25,0x05,0xF1,0x01,0x2 1,255,255};
void ht()
{ un int i=1000;
while(--i>0)
{
quet_led=0b11111110;
data_led=ma_led[giay%10];
delay_ms(1);data_led=255;
quet_led=0b11111101;
data_led=ma_led[giay/10];
delay_ms(1);data_led=255;
quet_led=0b11111011;
data_led=ma_led[phut%10];
delay_ms(1);data_led=255;
quet_led=0b11110111;
data_led=ma_led[phut/10];
delay_ms(1);data_led=255;
quet_led=0b11101111;
data_led=ma_led[gio%10];
delay_ms(1);data_led=255;
quet_led=0b11011111;
data_led=ma_led[gio/10];
delay_ms(1);data_led=255;
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void tang_so()
{
if(++giay>59)
{giay=0;
if(++phut>59)
{ phut=0;
if(++gio>23) gio=0;
}
}
}
unsigned int read_IR (void);
void Control (unsigned char code, unsigned char address);
void port_init(void)
{
PORTB = 0xff;
DDRB = 0xff;
PORTC = 0xff;
DDRC = 0xff;
PORTD = 0xff;
DDRD = 0x00;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCCR0 = 0x03; //CLK / 64
TCNT0 = 0;
}
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char count, code, address;
unsigned int IR_input;
TCNT0 = 0;
while(!(PIND & 0x04));
count = TCNT0;
if(count < 30) //Bit Start (2.4 ms long)
{
//delay_ms(20);
GICR |= 0x40;
return;
}
gio++;
IR_input = read_IR ();
code = (unsigned char) ((IR_input & 0xff00) >> 8);
address = (unsigned char) (IR_input & 0x00ff);
Control ( code, address );
}
unsigned int read_IR (void)
{
unsigned char pulseCount=0, code = 0, address = 0, timerCount;
unsigned int IR_input;
while(pulseCount < 7) //7bit command(ma lenh)
{
while(PIND & 0x04);
TCNT0 = 0;
while(!(PIND & 0x04));
pulseCount++;
timerCount = TCNT0;
if(timerCount > 14)
code = code | (1 << (pulseCount-1));
else
code = code & ~(1 << (pulseCount-1));
}
pulseCount = 0;
while(pulseCount < 5) //5bit address(dia chi)
{
while(PIND & 0x04);
TCNT0 = 0;
while(!(PIND & 0x04));
pulseCount++;
timerCount = TCNT0;
if(timerCount > 14)
address = address | (1 << (pulseCount-1));
else
address = address & ~(1 << (pulseCount-1));
}
IR_input = (((unsigned int)code) << 8) | address;
return(IR_input);
}
void Control (unsigned char code, unsigned char address)
{
if (address != 1)
return;
if((code == 16) || (code == 17)) //Channel+ or Channel- button is pressed
{
gio++;
}
if(code == 18) //Volume- button pressed
{
gio++;
}
if(code == 19) //Volume+ button pressed
{
gio++;
}
if(code == 9) //'0' button pressed
{
gio++;
}
if(code == 0) //'1' button pressed
{
gio++;
}
}
void init_devices(void)
{
#asm("cli")
port_init();
MCUCR = 0x02;
GICR = 0x40;
TIMSK = 0x00;
#asm("sei")
}
void main(void)
{
while(1)
{
tang_so();
ht();
init_devices();
}
}
Phần cứng:
mega8 nối PORTB là data của led 7 đoạn còn PORTC là quét nối 6 con tran còn IR nối với chân INT0 nói chung phần cứng rất đơn giản
![21](http://dientuvietnam.net/forums/images/smilies/21.gif)
Phần mền:
hiện giờ thì mình đã có đủ phần hiển thị giờ(ko có RealTime) và giải mã remote Sony rất good nhưng ko hiểu sao gép 2 phần lại thì lại có vẻ là do delay nên sai số
rất mong các cao thủ góp ý cái nhak
![57](http://dientuvietnam.net/forums/images/smilies/57.gif)
CODE:
/************************************************** ***
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers
Project :
Version :
Date :
Author :
Company :
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 1,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/
#include <mega8.h>
#include <delay.h>
#define data_led PORTB
#define quet_led PORTC
#define un unsigned
un char gio,phut,giay;
flash unsigned char ma_led[]={0x80,0xF3,0x49,0x60,0x33,0x25,0x05,0xF1,0x01,0x2 1,255,255};
void ht()
{ un int i=1000;
while(--i>0)
{
quet_led=0b11111110;
data_led=ma_led[giay%10];
delay_ms(1);data_led=255;
quet_led=0b11111101;
data_led=ma_led[giay/10];
delay_ms(1);data_led=255;
quet_led=0b11111011;
data_led=ma_led[phut%10];
delay_ms(1);data_led=255;
quet_led=0b11110111;
data_led=ma_led[phut/10];
delay_ms(1);data_led=255;
quet_led=0b11101111;
data_led=ma_led[gio%10];
delay_ms(1);data_led=255;
quet_led=0b11011111;
data_led=ma_led[gio/10];
delay_ms(1);data_led=255;
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void tang_so()
{
if(++giay>59)
{giay=0;
if(++phut>59)
{ phut=0;
if(++gio>23) gio=0;
}
}
}
unsigned int read_IR (void);
void Control (unsigned char code, unsigned char address);
void port_init(void)
{
PORTB = 0xff;
DDRB = 0xff;
PORTC = 0xff;
DDRC = 0xff;
PORTD = 0xff;
DDRD = 0x00;
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCCR0 = 0x03; //CLK / 64
TCNT0 = 0;
}
interrupt [EXT_INT0] void ext_int0_isr(void)
{
unsigned char count, code, address;
unsigned int IR_input;
TCNT0 = 0;
while(!(PIND & 0x04));
count = TCNT0;
if(count < 30) //Bit Start (2.4 ms long)
{
//delay_ms(20);
GICR |= 0x40;
return;
}
gio++;
IR_input = read_IR ();
code = (unsigned char) ((IR_input & 0xff00) >> 8);
address = (unsigned char) (IR_input & 0x00ff);
Control ( code, address );
}
unsigned int read_IR (void)
{
unsigned char pulseCount=0, code = 0, address = 0, timerCount;
unsigned int IR_input;
while(pulseCount < 7) //7bit command(ma lenh)
{
while(PIND & 0x04);
TCNT0 = 0;
while(!(PIND & 0x04));
pulseCount++;
timerCount = TCNT0;
if(timerCount > 14)
code = code | (1 << (pulseCount-1));
else
code = code & ~(1 << (pulseCount-1));
}
pulseCount = 0;
while(pulseCount < 5) //5bit address(dia chi)
{
while(PIND & 0x04);
TCNT0 = 0;
while(!(PIND & 0x04));
pulseCount++;
timerCount = TCNT0;
if(timerCount > 14)
address = address | (1 << (pulseCount-1));
else
address = address & ~(1 << (pulseCount-1));
}
IR_input = (((unsigned int)code) << 8) | address;
return(IR_input);
}
void Control (unsigned char code, unsigned char address)
{
if (address != 1)
return;
if((code == 16) || (code == 17)) //Channel+ or Channel- button is pressed
{
gio++;
}
if(code == 18) //Volume- button pressed
{
gio++;
}
if(code == 19) //Volume+ button pressed
{
gio++;
}
if(code == 9) //'0' button pressed
{
gio++;
}
if(code == 0) //'1' button pressed
{
gio++;
}
}
void init_devices(void)
{
#asm("cli")
port_init();
MCUCR = 0x02;
GICR = 0x40;
TIMSK = 0x00;
#asm("sei")
}
void main(void)
{
while(1)
{
tang_so();
ht();
init_devices();
}
}