Chương 3 : Thiết kế phần cứng của hệ thống
4. 2 Chương trình code sử dụng Keil uVision
Trong phần viết chương trình điều khiển, nhóm em xin phép được sử dụng phần mềmKeil uVision4 để viết chương trình. Chương trình điều khiển như sau:
/***************************************************** Chip type : ATmega16
Program type : Application Memory model : Small External RAM size : 0 Data Stack size : 256
*****************************************************/ #include <mega16.h> #include <delay.h> #include <alcd.h> #include <stdio.h> #include <string.h> #define on 1 #define off 0 #define senso_on 0 #define senso_off 1
#define senso_gas PINB.3 #define senso_khoi PINB.4 #define buzzer PORTB.0 #define relay_1 PORTB.1 #define relay_2 PORTB.2 bit bit_check_khoi = off; bit bit_check_gas = off; bit bit_check_nhiet_do = off; char data;
char tem; int i;
char buff[16];
interrupt [USART_RXC] void usart_rx_isr(void) {
data=UDR; }
#define ADC_VREF_TYPE 0x00 // Read the AD conversion result
unsigned int read_adc(unsigned char adc_input) {
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage delay_us(10);
// Start the AD conversion ADCSRA|=0x40;
// Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10; return ADCW; }
/***Chuong trinh gui du lieu qua TX***/
void send1(unsigned char udata){//Ham gui 1 ky tu ASCII while(!(UCSRA & (1<<UDRE)));//Kiem tra co UDRE UDR=udata;//Send 1 byte
}
void send(unsigned char *u){//Ham gui mot chuoi ky tu unsigned char n,i;
n=strlen(u); //Dem so ky tu
for(i=0;i<n;i++) send1(u[i]);//Gui het chuoi } void chong_nhieu(){ for(i=0;i<40;i++){ adc_data=adc_data+read_adc(0); delay_ms(5); } adc_data=adc_data/40; } void read_tem(){ chong_nhieu();
tem=(adc_data*8)/(0.01*1024); //Set nhiet do }
void lcd(){
sprintf(buff,"NHIET DO:%4d'C",tem); lcd_gotoxy(0,0);
lcd_puts(buff);
if(senso_khoi == senso_off && senso_gas == senso_off && tem < 40){ lcd_gotoxy(2,1);
lcd_puts("KHONG CO CHAY"); }
else{ lcd_gotoxy(2,1);
lcd_puts("CANH BAO CHAY"); }
}
send("AT+CMGF=1"); //Dua module ve cho do text delay_ms(500); send("AT+CMGS="); send1(34); send("0393534690"); send1(34); delay_ms(1000); send(a); delay_ms(500);
send1(26); //Gui tin hieu ket thuc. }
void gsm_init(){ // send("ATE0"); // delay_ms(50);
send("AT+IPR=9600"); //Set toc do baudrate UART module sim. delay_ms(50);
}
// Declare your global variables here 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=Out Func1=Out Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTA=0x00; DDRA=0x07;
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00; DDRB=0x07;
// 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;
// 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=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
// 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: Off
// USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00;
UCSRB=0x08; 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 Clock frequency: 125.000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x86;
// SPI disabled SPCR=0x00; // TWI initialization // TWI disabled TWCR=0x00; // Alphanumeric LCD initialization // Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTC Bit 7 // RD - PORTC Bit 6 // EN - PORTC Bit 5 // D4 - PORTC Bit 3 // D5 - PORTC Bit 2 // D6 - PORTC Bit 1 // D7 - PORTC Bit 0 // Characters/line: 16 lcd_init(16); gsm_init(); lcd_gotoxy(3,0); lcd_puts("OCEAN SMART"); lcd_gotoxy(2,1);
lcd_puts("MACH BAO CHAY"); buzzer = on; delay_ms(2000); buzzer = off; lcd_clear(); while (1) {
read_tem();
lcd();
if(senso_khoi == senso_on) // Khi co su co {
if(bit_check_khoi == off) {
send_sms("Day La Tin Nhan Canh Bao Co Khoi!!!"); } bit_check_khoi = on; } if(senso_gas == senso_on) { if(bit_check_gas == off) {
send_sms("Day La Tin Nhan Canh Bao Co Khi Gas!!!"); } bit_check_gas = on; } if(tem >= 40) { if(bit_check_nhiet_do == off) {
send_sms("Day La Tin Nhan Canh Bao Nhiet Do Cao!!!"); }
bit_check_nhiet_do = on;
}
if(senso_khoi == senso_off && senso_gas == senso_off && tem < 40 ){
relay_1 = off; // Trang thai mac dinh cua relay relay_2 = off; bit_check_khoi = off; bit_check_gas = off; bit_check_nhiet_do = off; } else{
relay_1 = on; // Trang thai relay khi co su co relay_2 = on; buzzer = ~buzzer; delay_ms(200); } } }