Chương trình cho VXL PIC 16f877

Một phần của tài liệu Chuyên Đề Tốt Nghiệp Kiểm Soát Nhiệt Độ Bể Ươm Thủy Sản (Trang 42 - 47)

• #include <16F887.h> bỏ thêm thư viện tập lệnh ic

• #device ADC=10 khai báo chế độ lấy mẫu adc(analog convert digial) = 10bit=1024 mức

• #FUSES NOWDT

• #FUSES NOBROWNOUT

• #FUSES NOLVP

• #use delay(crystal=12000000) khai báo thạch anh ic dung để chương trình chọn hàm delay cho phù hợp

• #use

rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1) Khai báo dung uart chuẩn rs233 với tốc độ baund 9600, chân truyền là C6, chân nhận là C7

• #define n1 PIN_B3 gắn chân nút nhấn 1 với vdk chân B3

• #define n2 PIN_B2

• #define n3 PIN_B4

• #define n4 PIN_B5

• #define rl1 PIN_C4

• #define rl2 PIN_C5

• unsigned int8 t_now,t_set,t_tam; Tạo các biến 8bit

• float value; biến số thực

• unsigned int16 dem; biến 16bit 3.3.2.1.2. Hàm main.c

• #include <main.h> // đính kèm hàm main.h

• #include <convert.c> // đính kèm hàm convert.c

• #include <lcd.c>

• #define LCD_ENABLE_PIN PIN_D0 // gán chân từ vdk tới lcd

• #define LCD_RS_PIN PIN_D4

• #define LCD_RW_PIN PIN_D1

• #define LCD_DATA4 PIN_C3

• #define LCD_DATA5 PIN_C2

• #define LCD_DATA6 PIN_C1

• #define LCD_DATA7 PIN_C0 void main()

{

enable_interrupts(INT_RDA);

enable_interrupts(GLOBAL);

Chương trình chính (khi cấp nguồn, vdk chạy chương trình này đầu tiên)

Cho phép dùng ngắt nhận uart(rs232) Cho phép dùng ngắt tổng

Nếu ko có ngắt, vdk phải chạy tới ô chứa dữ

t_set=read_eeprom(0x01);

if(t_set<20 || t_set>70){t_set=40;};

setup_adc_ports(sAN0|VSS_VDD);

setup_adc(ADC_CLOCK_DIV_8);

set_adc_channel(0);

lcd_init();

lcd_putc("\f");

liệu xem có dữ liệu không, có thì lấy, không thì thôi=> mất thời gian,vì vdk còn làm việc khác nữa=>nên ngta mới tạo cho vdk 1 cái giống như điện thoại của con người, khi có dữ liệu thì nó sẽ thông báo cho vdk tới lấy dữ liệu. Đó là nguyên nhân vdk nào cũng cần có ngắt.

Trong chương trình dùng eeprom để lưu nhiệt độ set để khi mất điện, ko mất giá trị vừa set.

Vậy nên khi cấp nguồn ta cần nạp lại cho biến t_set giá trị của ô nhớ tại địa chỉ 0x01

Nếu t_set bị sai hoặc chưa có giá trị thì cho t_set bằng 40

Thiết lập adc tại chân A0 của vdk Thiết lập tần số xung nhịp cho adc Thiết lập lấy dữ liệu tại kênh 0

Khởi tạo lcd (hàm này giống giấy hải quan, thủ tục passport để lcd vs vdk bắt tay nhau)

Xóa sạch kí tự có trên lcd, giống refesh

Trong khi điều kiện này đúng thì thực hiện lệnh bên trong. Điều kiện ở đây luôn luôn đúng, nếu chương trình chạy xong, lại chạy lại, tạo thành 1 chương trình vòng tròn, ko kết thúc.

Đọc giá trị adc lưu vào biến value

while(TRUE) {

value=read_adc();

value=(value*5)/1024;

value=(50000- value*10000)/value;

t_now=c_to_t(value);

lcd_gotoxy(1,1);

printf(lcd_putc," Temp Now:

%d*C",t_now);

lcd_gotoxy(1,2);

Chuyển giá trị value đó thành tín hiệu điện áp theo công thức sau:

1024mức  5v X mức => ? v Tỉ lệ thuận nên

Áp dụng nhân chia chéo ta đc công thức này.

Chuyển giá trị điện áp thành giá trị điện trở.

10000 :là giá trị điện trở phân áp. 10k

50000 : là giá trị điện trở của cảm biến nhiệt.

50k

Chuyển giá trị điện trở thành nhiệt độ

Chuyển con trỏ lcd tới tọa độ x=1, y=1(dòng đầu tiên, chữ đầu tiên để bắt đầu viết chữ tại đó kéo về sau)

Viết lên lcd nội dung temp now:

%d là lấy giá trị của t_now

Nếu nút nhấn n1 mà kéo xuống mức 0 Nếu t_set <70 => t_set tăng thêm 1 giá trị;

Đợi khoảng 200 miligiay (chống nhảy phím, nếu ko có delay ở đây, vdk thực hiện rất nhanh, làm nhảy số liên tục, ko thể thấy đc)

printf(lcd_putc," Temp Set:

%d*C",t_set);

if(input(n1)==0){

if(t_set<70) t_set++;

delay_ms(200);

write_eeprom(0x01,t_set);};

if(input(n2)==0){

if(t_set>20) t_set;

delay_ms(200);

write_eeprom(0x01,t_set);};

if(t_set==t_now)

{output_high(rl1);output_high(rl2);}

if(t_set>t_now)

{output_high(rl1);output_low(rl2);};

if(t_set<t_now)

{output_low(rl1);output_high(rl2);};

putc(t_now);

Lưu giá trị set vào eeprom để khỏi mất khi mất điện

Giống trên nút nhấn n2 đc nhấn thì biến t_set sẽ giảm 1 đơn vị.

Role tắt khi chân kích kéo 5v, kéo xuống đất rowle bật

Nếu t_set bằng t_now => thì kéo chân rơ le 1 và rowle 2 lên cao.

Tương tự

Gửi giá trị t_now qua uart cho phần mềm trên máy tính

Các kí tự sau dấu // ko có giá trị trong chương trình (giống như viết chú thích)

//putc('\n');

//TODO: User Code }

}

//===========================

=========

#INT_RDA

void RDA_isr(void){

t_tam=getc();

if((t_tam > 10) & (t_tam<70)) {t_set=t_tam;};

}

Ngắt uart nhận(khi có dữ liệu vào thanh ghi trong vdk, chương trình này sẽ chạy)

Khởi tạo tên chương trình

Lấy dữ liệu gán vào biến tạm thời Nếu biến tạm phù hợp vs yêu cầu Thì lấy nó, nạp vào biến t_set

Một phần của tài liệu Chuyên Đề Tốt Nghiệp Kiểm Soát Nhiệt Độ Bể Ươm Thủy Sản (Trang 42 - 47)

Tải bản đầy đủ (DOC)

(50 trang)
w