Hình 33: Sơ đồ thuật toán xử lý mạch đo chiều dài Begin Khai báo các thư viện và các biến cần sử dụng trong chương trình Hàm quetvoid.. Nó phục vụ việc xử lý bàn phím Hàm timer1_comp_isr
Trang 1Hình 33: Sơ đồ thuật toán xử lý mạch đo chiều dài
Begin
Khai báo các thư viện và các biến cần sử dụng trong chương trình
Hàm quet(void)
Hàm này chờ phím được ấn và trả lại giá trị của phím ấn
Hàm ext_int1_isr(void) Hàm này được thực hiện khi một ngắt ngoài xảy ra Nó phục vụ việc xử lý bàn phím
Hàm timer1_comp_isr(void) Hàm này được thực hiện khi xảy ra ngắt so sánh bộ định thời
1 Nó kích xung điều khiển
đồng thời chờ tín hiệu điều khiển trên chân PortD4
Hàm main(void)
Đây là hàm chính của chương trình Nó được thực hiện khi bắt
đầu vào chương trình
Kết thúc
Trang 2` Các thư viện được sử dụng trong chương trình viết cho chíp:
#include <90s2313.h>
// Alphanumeric LCD Module functions
#asm
.equ lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <stdlib.h>
#include <delay.h>
#include <string.h>
Thư viện 90s2313.h chứa các hàm về phần cứng của chip AT90s2313 như: Các cổng xuất nhập dữ liệu, các thanh ghi có trong chíp, dung lượng các
bộ nhớ vv
Thư viện lcd.h chứa các hàm về phần cứng của LCD: Số dòng, số ký tự viết được trên màn hình LCD vv
Thư viện stdlib.h thư viện chứa các hàm chuẩn trong C++ Thư viện này
được tích hợp thêm một số hàm khác nữa trong phần mềm CodeVisionAVR C Compiler
Thư viện delay.h chứa các hàm sử dụng cho xử lý ngắt, và các bộ định thời tạo chễ
Thư viện string.h chứa các hàm sử dụng xử lý với ký tự
Sau phần khai báo các thư viện sử dụng trong chương trình tiếp đến khối chương trình con xử lý quét bàn phím
Sơ đồ thuật toán của chương trình xử lý quét bàn phím
Trang 3Hình 34: Sơ đồ khối chương trình quét bàn phím mạch đếm
Sau khi quét xong bàn phím dữ liệu về chiều dài đặt được lưu lại trong
ext_int1_isr(void)
Lưu phím được ấn
Chuyển vị trí con trỏ LCD
đến tọa độ 11, 1
Kiểm tra phím ấn
Nếu là
phím tăng
thì biến
data_e +10
Nếu là phím giảm thì biến data_e - 10
Nếu biến data_e>999 thì data_e=0 Nếu biến data_e<0 thì data_e=999
Di chuyển con trỏ LCD đến tọa độ (11, 0) chuyển data_e thành xâu rồi xuất lên LCD
Chờ phím bấm tiếp theo
trễ 100ms
Kiểm tra có phải phim OK?
Đổi data_e từ cm thành số xung rồi chuyển vào OCR1 để so sánh
Kết thúc
Nếu là phím sang trái thì biến
data_e /10
Nếu là phím sang phải thì biến data_e *10
Trang 4đưa vào chíp Cuối cùng trong chương trình chính chíp xử lý tín hiệu Encoder chuyển đổi các xung thành độ dài Cm và sau khi đủ chiều dài chíp xuất ra một tín hiệu đưa vào PLC
Hình 35: Sơ đồ khối chương trình chính mạch đếm
Main (void)
Chọn PortD4 làm chân xuất dữ liệu
Bộ định thời 1 hoạt động với tần số xung nhịp trên chân T1 và ở chế độ giá trị cao nhất là giá trị của thanh ghi OCR1 Ngắt là ngắt so sánh bộ
định thời
Ngắt ngoài 1 cho phép được hoạt động
Nó có tích cực trên sườn lên của chân INT1.
Khởi tạo LCD
Xuất lên LCD dòng chữ “do dai dat Cm”
Chuyển con trỏ xuống dòng 2, xuất lên LCD dòng chữ “Do dai do Cm”
Đổi data_e từ đơn vị cm sang số xung, rồi nạp vào thanh ghi OCR1
Chuyển data_e sang dạng xâu, rồi xuất lên LCD ở tọa độ (11,0)
Chuyển con trỏ LCD sang tọa độ (11,1) rồi xuất giá trị hiện thời đo
được lên LCD
Trang 5Ch−¬ng tr×nh ®iÒu khiÓn vµ m¹ch ®o cô thÓ nh− sau:
#include <90s2313.h>
// Alphanumeric LCD Module functions PhÇn khai b¸o c¸c th−
#asm
.equ lcd_port=0x18 ;PORTB
#include <lcd.h>
#include <stdlib.h>
#include <delay.h>
#include <string.h>
flash char *data_f[]={"Do dai do Cm","Do dai dat Cm"};
eeprom int data_e=100;
char i;
char str[4];
char quet(void)
{
#asm
LOOP:
sbis $10,3
rjmp LOOP
#endasm
return PIND&0x07;
}
// External Interrupt 1 service routine
// §o¹n ch−¬ng tr×nh xö lý quÐt bµn phÝm
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
char b;
b=quet();
Trang 6TCCR1B=0x00;
lcd_gotoxy(11,1);
while(b!=6)
{
switch(b){
case 2: data_e*=10;
break;
case 1: data_e/=10;
break;
case 4:data_e++;
break;
case 3: data_e ;
}
if(data_e<0) data_e=999 ;
if(data_e>999) data_e=0;
lcd_gotoxy(11,0);
itoa(data_e,str);
lcd_puts(str);
if(strlen(str)<3)
for(i=1;i<=3-strlen(str);i++)
lcd_putchar(' ');
b=quet();
delay_ms(100);
}
OCR1=data_e*57.14;
TCCR1B=0x0f;
}
// Timer 1 output compare interrupt service routine
interrupt [TIM1_COMP] void timer1_comp_isr(void)
{
Trang 7// Place your code here
PORTD|=0x10;
TCCR1B=0x00;
delay_ms(1000);
PORTD&=0xEF;
#asm
LOOP1:
sbic $10,6
rjmp LOOP1
#endasm
TCCR1B=0x0F;
}
// Declare your global variables here
// §o¹n ch−¬ng tr×nh chÝnh
void main(void)
{
DDRD=0x10;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Timer/Counter 1 initialization
// Clock source: T1 pin Rising Edge
// Mode: CTC top=OCR1A
// OC1 output: Discon
// Noise Canceler: Off
// Input Capture on Falling Edge
Trang 8// Input Capture Interrupt: Off
// Compare Match Interrupt: On
TCCR1B=0x0F;
// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Rising Edge
GIMSK=0x80;
MCUCR=0x0C;
GIFR=0x80;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
lcd_putsf(data_f[1]);
lcd_gotoxy(0,1);
lcd_putsf(data_f[0]);
OCR1=data_e*57.14;
itoa(data_e,str);
lcd_gotoxy(11,0);
lcd_puts(str);
if(strlen(str)<3);
Trang 9+5V +5V
+5V
+5V
+5V
+5V
KEY 7
RW
KEY 3 XTA2
KEY 2
KEY8
KEY 7
XTA1
D6
E
D7 D4
KEY1
KEY 4
KEY 4
KEY 3
D6 KEY 8
XTA2
D5 RESET
KEY 5
KEY 4
KEY 1
D5
+5V
KEY5 KEY 2
D7
KEY 6 XTA1
RESET
V0 KEY 5
RW
KEY 2
KEY 1
V0
KEY6
RS KEY3
RS
KEY 6
RESET
D4
E U2
AT90S2313/SO
1 4
20
12 14 16 18
2 6 8 11
RESET XTAL2
VCC
PB0/AIN0 PB2 PB3/OC1 PB4 PB5/MOSI PB6/MISO PB7/SCK
PD0/RXD PD1/TXD PD2/INT0 PD4/T0 PD6/ICP
Y1
4MHz
SW2 SW3
SW5
J3
Nguon
1
U3 LM7805 1
3 VI
J2
LCD
C15 470uF
C13 10uF
SW6
D2
1N4007
D1 1N4148
SW7
R4
4.7K
C12 105
SW8
C14 104
C11 10uF
R5
10K
P1
CONNECTOR DB9
5 4 3 2 1
R2 RESISTOR VAR
R7
RESISTOR SIP 9
4 6 8
R3 100 J1
Input 1 3
D3
LED
C3
U1
74148
10 12 1 3 5
9 6 14
D0 D2 D4 D6 EI
Q0 Q2 GS
C8
C9 C10
SW9
SW1
for(i=1;i<=3-strlen(str);i++)
lcd_putchar(' ');
while (1)
{
// Place your code here
lcd_gotoxy(11,1);
itoa(TCNT1*0.0175,str);
lcd_puts(str);
if(strlen(str)<3);
for(i=1;i<=3-strlen(str);i++)
lcd_putchar(' ');
delay_ms(5);
};
}
Hình 36.Sơ đồ mạch nguyên lý của mạch đo chiều dài
Trang 10Báo cáo tốt nghiệp Nguyễn Duy Hoàng
4.3 Chương trình điều khiển
Để thiết kế hệ thống điều khiển tự động cắt ống em đã thiết kế hai phần bao gồm: Cơ khí và điện điều khiển
Về cơ khí :
Để kéo được ống nhựa Φ32 ( thay cho ống thép ở thực tế), em đã dùng hai khối lô kẹp vào ống và các khối lô này được truyền động bằng động cơ
220V AC 50 W Để cắt được ống em dùng một dao dạng đĩa quay tròn lắp trên một động cơ 1 chiều 25 W Ngoài ra còn có các xilanh khí nén dùng để
đẩy dao xuống và kẹp chặt ống khi cắt, các xilanh này được điều khiển bằng các van thuỷ khí 220 V
Về mạch điều khiển:
Mạch điều khiển được thiết kế sao cho có thể cắt ống bằng tay thông qua ấn nút bấm hoặc cắt tự động thông qua việc điều khiển của PLC
Click to buy NOW!
w
w
w
.d ocu -tra c k. co
w d ocu -tra c k. co
m
.