Hình 3.6 sơ đồ mạch giao tiếp với máy tính RS 232 Đặc tính điện học
RS-232 sử dụng phương thức truyền không đối xứng, tức là sử dụng tín hiệu điện áp chênh lệch giữa một dây dẫn và đất.
Mức điện áp logic được định nghĩa -3V¸ -25V mức logic "1" và +3V¸+25V mức logic "0".
Tốc độ truyền dẫn tối đa phụ thuộc vào chiều dài dây dẫn. Đa số các hệ thống hiện nay chỉ hỗ trợ tới tốc độ 19.2 kbps
Chiều dài cho phép 15m ( 50 feet).
Truyền số liệu Full-duplex sử dụng 3 dây: TxD, RxD, GND.
Các tín hiệu điều khiển dùng để bắt tay (Handshaking) phần cứng là: RTS, CTS, DSR, DTR. Mức logic:+3V¸ +25V -> "1" và <0V -> "0".
Truyền không đồng bộ, cấu trúc một khung truyền bao gồm: 1 start bit, 7-8 data bit, 1- 0 parity bit, 1-1,5-2 stop bit. (Gần đây, sự tiến bộ trong vi mạch đã góp phần nâng cao tốc độ của cổng RS-232 lên nhiều lần so với tốc độ 19,2kbps. Hiện nay đã có những mạch thu phát đạt tốc độ 460kbd và hơn nữa, tuy nhiên tốc độ truyền dẫn thực tế lớn hơn 1 15.2 kbd theo chuẩn RS-232 trong một hệ thống làm việc dựa vào ngắt là một điều khó có thể
Giao diện cơ học:
Chuẩn RS-232 qui định ba loại giắc cắm RS-232 là DB-9, DB-25 và ALT-A, trong đó hai loại đầu được sử dụng rộng rãi hơn
Hình 3.7: sơ đồ chân RS-232 Ý nghĩa của các chân quan trọng được mô tả dưới đây: RXD (receive Data): Đường nhận dữ liệu.
TXD (Transmit Data): Đường gửi dữ liệu.
DTR (Data Terminal Ready): Báo DTE sẵn sàng .Chân DTR thường ở trạng thái ON khi thiết bị đầu cuối sẵn sàng thiết lập kênh truyền thông (tự động quay số hay tự động trả lời). DTR ở trạng thái OFF chỉ khi thiết bị đầu cuối không muốn DCE của nó chấp nhận lời gọi từ xa.
DSR (Data Set Ready): Báo DCE sẵn sàng, ở chế độ trả lời, 1 tone trả lời và DSR ON sau 2 giây khi Modem nhấc máy.
DCD (Data Carrier Detect): Tín hiệu này tích cực khi Modem nhận được tín hiệu từ trạm từ xa và nó duy trì trong suốt quá trình liên kết.
RTS (Request To Send): Đường RTS kiểm soát chiều truyền dữ liệu. Khi một trạm cần gửi dữ liệu, nó đóng mạch RTS sang ON để báo hiệu với modem của nó.
CTS (Clear To Send): Khi CTS chuyển sang ON, Modem xác nhận là DTE có thể truyền số liệu.Quá trình ngược lại nếu đổi chiều truyền số liệu
RI (Ring Indicator): Khi modem nhận được tín hiệu chuông, RI chuyển ON/OFF một cách tuần tự với chuông điện thoại để báo hiệu cho trạm đầu cuối. Tín hiệu này chỉ thị rằng một modem xa yêu cầu thiết lập liên kết dial-up.
3.6 Mạch giao tiếp cảm biến LM 335
Hình 3.8: sơ đồ chân LM335 Chân 1:+Vcc
Chân 2:Vout Chân 3:GND
Nó có 3 chân chính trong đó 2 chân cấp nguồn và 1 chân out tín hiệu analog. Khi ta cấp điện áp 5v cho LM335 thì nhiệt đo được từ cảm biến sẽ chuyển thành điện áp tương ứng tại chân số 2(out). Điện áp này sẽ tỷ lệ với giải nhiệt độ mà nó đo được. Với giải nhiệt độ là 10mv/k . Hoạt động trong giải điện áp từ 05v.
hoạt động chính xác ở dòng điện đầu vào từ 0.4 mA đến 0.5 mA. Dòng điện nằm ngoài khoảng này thì kết quả không chính xác.
điện áp cấp vào ổn định là 5v. trở kháng đầu ra thấp hơn 1
3.7 Mạch giao tiếp đồng hồ DS 1307
Hình 3.9: sơ đồ nguyên lý DS1307
DS 1307 là chíp thời gian thực đây là IC tích hợp cho thời gian bởi vì tính chính xác cho thời gian thực là tuyệt đối với thời gian: ngày,tháng, năm, giờ, phút, giây.
X1 và X2 là đầu vào giao động cho DS 1307 Vbat là nguồn nuôi cho chíp
Vcc là nguồn điện áp cung cấp dùng 5v. Nếu Vcc không có nguồn mà Vbat vẫn có thi DS 1307 vẫn hoạt động bình thường.
GND là nguồn mass
SQW/OUT :là ngõ ra phụ tạo xung giao động
SCL và SDA là 2 bus dữ liệu của DS 1307. Thông tin truyền và ghi đều chuyền qua 2 cổng này.
Chương IV Thiết Kế Phần Mềm Sử dụng phần mềm mô phỏng proteus
code chương trình
/***************************************************** This program was produced by the
CodeWizardAVR V2.05.0 Professional Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 19/03/2013 Author : NeVaDa Company : Comments:
AVR Core Clock frequency: 8,000000 MHz Memory model : Small
External RAM size : 0 Data Stack size : 256
*****************************************************/ #include <mega16.h>
#include <delay.h>
// Alphanumeric LCD Module functions #include <alcd.h> #ifndef RXB8 #define RXB8 1 #endif #ifndef TXB8 #define TXB8 0 #endif #ifndef UPE #define UPE 2 #endif #ifndef DOR #define DOR 3 #endif #ifndef FE #define FE 4 #endif #ifndef UDRE #define UDRE 5 #endif #ifndef RXC
#endif
#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)
// USART Receiver buffer #define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE <= 256
unsigned char rx_wr_index,rx_rd_index,rx_counter; #else
unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif
// This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;
// USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) {
char status,data; status=UCSRA; data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {
rx_buffer[rx_wr_index++]=data; #if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256 if (++rx_counter == 0)
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; #endif rx_buffer_overflow=1; } } } #ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index++]; #if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #endif #asm("cli") --rx_counter; #asm("sei") return data; }
#endif
// USART Transmitter buffer #define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE <= 256
unsigned char tx_wr_index,tx_rd_index,tx_counter; #else
unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif
// USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index++]; #if TX_BUFFER_SIZE != 256
if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; #endif
} }
#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer #define _ALTERNATE_PUTCHAR_
#pragma used+ void putchar(char c) {
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) {
tx_buffer[tx_wr_index++]=c; #if TX_BUFFER_SIZE != 256
if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; #endif ++tx_counter; } else UDR=c; #asm("sei") } #pragma used- #endif
// Standard Input/Output functions #include <stdio.h>
// Declare your global variables here #define KEYPAD_DDR DDRD #define KEYPAD_PORT PORTD #define KEYPAD_PIN PIND
unsigned char scan_code[4]={0x0E,0X0D,0X0B,0x07}; unsigned char ascii_code[4][4]={'7','4','1','E',
'8','5','2','0', '9','6','3','F', 'A','B','C','D', }; int checkpad() {
for(i=0;i<4;i++) { KEYPAD_PORT=0XFF-(1<<(i+4)); delay_us(10); keyin=KEYPAD_PIN&0x0F; if(keyin!=0x0F) for(j=0;j<4;j++)
if(keyin==scan_code[j]) return ascii_code[j][i]; } return 0; } void main(void) { char key,a;
// 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
PORTC=0x0F; DDRC=0xF0;
// 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 PORTD=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;
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: Off
// INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On
// USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00;
UCSRB=0xD8; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33;
// 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; lcd_init(16);
// Global enable interrupts #asm("sei")
lcd_clear(); lcd_gotoxy(0,0);
lcd_putsf(" TEST "); lcd_gotoxy(0,1);
lcd_putsf(" Key 4x4 & UART "); while (1)
{
key = checkpad(); if(key)
lcd_gotoxy(0,0); lcd_putsf(" Key 4x4 "); lcd_gotoxy(0,1); lcd_putsf("Phim da nhan "); lcd_putchar(key); putchar(key); } if(UDR) { a=getchar(); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("Truyen tu PC: "); lcd_putchar(a); } } } /***************************************************** This program was produced by the
CodeWizardAVR V2.05.0 Professional Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 19/03/2013 Author : NeVaDa Company :
Chip type : ATmega16 Program type : Application
AVR Core Clock frequency: 8,000000 MHz Memory model : Small
External RAM size : 0 Data Stack size : 256
*****************************************************/ #include <mega16.h>
#include <delay.h>
// Alphanumeric LCD Module functions #include <alcd.h>
#define FIRST_ADC_INPUT 0 #define LAST_ADC_INPUT 0
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; #define ADC_VREF_TYPE 0x20
// ADC interrupt service routine // with auto input scanning
interrupt [ADC_INT] void adc_isr(void) {
static unsigned char input_index=0; // Read the 8 most significant bits // of the AD conversion result adc_data[input_index]=ADCH; // Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index; // Delay needed for the stabilization of the ADC input voltage
// Start the AD conversion ADCSRA|=0x40;
}
char lcd_buffer[33];
void hienthi(unsigned char so,unsigned char x,unsigned char y) {
unsigned char tram,truc,dv; tram=so/100; truc=(so-100*tram)/10; dv=(so-100*tram-10*truc); lcd_gotoxy(x,y); if(so>=100) { lcd_putchar(tram+48); lcd_putchar(truc+48); lcd_putchar(dv+48); } else if(so < 100) { lcd_putchar(truc+48); lcd_putchar(dv+48); } } void main(void) {
// Declare your local variables here // Input/Output Ports 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 PORTD=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;
// 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=0x00; 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;
// External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// 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 Clock frequency: 250,000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped // Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff); ADCSRA=0xCD;
// SPI initialization // SPI disabled SPCR=0x00;
TWCR=0x00; lcd_init(16);
// Global enable interrupts #asm("sei") while (1) { lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("Nhiet Do: "); hienthi((2*adc_data[0]),11,0); lcd_puts(lcd_buffer); lcd_gotoxy(0,12); lcd_putchar(0xDF); lcd_putchar(0x43); lcd_gotoxy(0,1);
lcd_putsf(" Nhiet Do phong "); delay_ms(100);
} }
/***************************************************** This program was produced by the
CodeWizardAVR V2.05.0 Professional Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com
Project : Version :
Company : Comments:
Chip type : ATmega16 Program type : Application
AVR Core Clock frequency: 8,000000 MHz Memory model : Small
External RAM size : 0 Data Stack size : 256
*****************************************************/ #include <mega16.h>
#include <delay.h>
// Declare your global variables here void main(void)
{ int i;
// 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=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTB=0xFF;
DDRB=0xFF;
// 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 PORTD=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
TCCR1B=0x00; 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: Off
// INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// USART initialization // USART disabled
// 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; while (1) {
// Place your code here for(i=0;i<6;i++) { PORTB=0x00; delay_ms(300); PORTB=0xff; delay_ms(300); } for(i=0;i<2;i++) { PORTB=0xff; delay_ms(300);
delay_ms(200); PORTB.1=0; delay_ms(200); PORTB.2=0; delay_ms(200); PORTB.3=0; delay_ms(200); PORTB.4=0; delay_ms(200); PORTB.5=0; delay_ms(200); PORTB.6=0; delay_ms(200); PORTB.7=0; delay_ms(200); PORTB=0xff; delay_ms(300); PORTB.7=0; delay_ms(200); PORTB.6=0; delay_ms(200); PORTB.5=0; delay_ms(200); PORTB.4=0; delay_ms(200); PORTB.3=0; delay_ms(200); PORTB.2=0;
PORTB.1=0; delay_ms(200); PORTB.0=0; delay_ms(200); } } } /***************************************************** This program was produced by the
CodeWizardAVR V2.05.0 Professional Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 19/03/2013 Author : NeVaDa Company : Comments:
Chip type : ATmega16 Program type : Application
AVR Core Clock frequency: 8,000000 MHz Memory model : Small
External RAM size : 0 Data Stack size : 256
*****************************************************/ #include <mega16.h>
// I2C Bus functions #asm
.equ __i2c_port=0x1B ;PORTA .equ __sda_bit=1
.equ __scl_bit=2 #endasm
#include <i2c.h> unsigned char h,m,s;
//unsigned char day,mon,year;
// DS1307 Real Time Clock functions #include <ds1307.h>
#define led1 PORTD.4 #define led2 PORTD.5 #define led3 PORTD.6 #define led4 PORTD.7 #define led5 PORTD.1 #define led6 PORTD.0