Mã CCS:
/ * ElectronicsPht * /
#fuses HS NOWDT, NOPROTECT, NOLVP, NOBROWNOUT
// # sử dụng fast_io (d)
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <lcd.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
// # sử dụng delay (clock = 20000000)
RS232 #use (baud = 9600, parity = N, xmit = PIN_C6, RCV = PIN_C7, bit = 8)
//DINH NGHIA CAC LED
#define LED1 PIN_D0
#define LED2 PIN_D1
#define LED3 PIN_D2
#define LED4 PIN_D3
#define LED5 PIN_D4
#define LED6 PIN_D5
#define LED7 PIN_D6
#define LED8 PIN_D7
//DINH NGHIA CAC CHAN NUT NHAN HOAC 02 CHAN ENCODER
#define SW1 PIN_B0 //NGAT NGOAI
#define SW2 PIN_B4
//DINH NGHIA CHAN TU CAM BIEN LM35
#define LM35 PIN_A1
//DINH NGHIA CHAN DIEU KHIEN DONG CO DUNG L298
#define DIR1 PIN_C0 // IN1
#define PWM PIN_C2 //CHAN DIEU RONG XUNG, ENA
#define dir2 PIN_C1 // IN2
//DINH NGHIA CAC BIEN
//BIEN NHAN DU LIEU
char c_start,c_stop,c_tem; //bien tam luu ma bat dau
và ket thúc
char s1[9]; //bi?n t?m luu d? li?u nh?n du?c t? máy
tính
int k; // bi? N ch? S? cho m? ng d? li? u nh? n du? c
int biennhan; // bi?n báo hi?u dã nh?n d? li?u xong
// BIÊN MA LED
char sled1[] = "l1"; // mã d? sáng/t?t led1
char sled2 [] = "l2"; // LED2
char sled3 [] = "l3"; // LED3
char sled4 [] = "L4"; // LED4
char sled5 [] = "l5"; // led5
char sled6 [] = "l6"; // led6
char sled7 [] = "l7"; // led7
char sled8 [] = "L8"; // led8
unsigned char led1_on; // bi?n tr?ng thái sáng t?t led
1
unsigned char led2_on;
unsigned char led3_on;
unsigned char led4_on;
unsigned char led5_on;
unsigned char led6_on;
unsigned char led7_on;
unsigned char led8_on;
//BIEN MA NHIET DO
char snhietdo[] = "nd"; //yeu cau nhiet do
// MOTOR BIÊN MA
char smthuan [] = "mt"; // dongcoquaythuan
int co_thuan; // bi?n báo tr?ng thái d?ng co quay
thu?n
char smnghich [] = "mn"; // dongcoquaynghich
int co_nghich; //bi?n báo tr?ng thái d?ng co quay
ngh?ch
char smstop [] = "ms"; // dongcongungchay
// luu y: neu nhan ma @td+"xxx"+x
char smpwm [] = "td"; // ma_nap_pwm
// CŨNG PWM
long ppwm; // bi?n luu giá tr? %PWM nh?n du?c t? máy
tính
//BIEN SW - NGAT NGOAI
int ngat;//báo tr?ng thái ng?t ngoài
signed int32 TSW=0; //bien dem cho hai SW1 va SW2
int bien_goinhietdo;
int dem_t; // bi? N luu s? l? nd? m timer1
///////////////////////////////////////////////////////////////////////////////
//CHUONG TRINH NGAT RS232
//NEU DUNG MA SE LUU VAO S1, BIEN NHAN = 1,
//NEU KHONG DUNG MA BIEN NHAN = 0
#int_rda
khoảng trống RDA_isr (void)
{
c_tem=getc();//NHAN TUNG KI TU
if (c_tem == '@') // xet ki tu bat dau "@"
{
c_start = c_tem;
k = 0;
s1 [k] = c_start;
}
if
(c_tem=='x') //xet ki tu ket thuc "x"
{
c_stop = c_tem;
s1 [k] = c_stop;
}
if (c_start == '@' && c_stop == 'x')
{
k = 0;
biennhan=1;//bao hieu da nhan dung ma dau-cuoi
c_start = 0;
c_stop = 0;
}
khác
{
s1[k]=c_tem;
a ++;
if (k> = 9) {k = 0;}
}
}
///////////////////////////////////////////////////////////////////////////////
// chuong trinh ngat ngoài
#INT_RB
khoảng trống RB_isr (void)
{
if
(!input(SW1)) //có tác d?ng nút nh?n SW1
{
while (đầu vào (SW1)!);
TSW + = 1; // tang s? d m?
ngat=1; //báo
tr?ng thái ng?t
}
if
(!input(SW2)) //có tác d?ng nút nh?n SW2
{
while (đầu vào (SW2)!);
TSW--; // gi m? S? d m?
ngat=1; //báo
tr?ng thái ng?t
}
}
///////////////////////////////////////////////////////////////////////////////
//CHUONG TRINH CON DAOLED
void daoled1() //sáng t?t led 1
{
led1_on = ~ led1_on;
output_bit (LED1, led1_on);
printf ( "% s \ n \ r", "@ dao dẫn 1x"); // g? Id? li? uv? your computer
}
khoảng trống daoled2 ()
{
led2_on = ~ led2_on;
output_bit (LED2, led2_on);
printf ( "% s \ n \ r", "@ dao dẫn 2x");
}
khoảng trống daoled3 ()
{
led3_on = ~ led3_on;
output_bit (LED3, led3_on);
printf ( "% s \ n \ r", "@ dao dẫn 3x");
}
khoảng trống daoled4 ()
{
led4_on = ~ led4_on;
output_bit (LED4, led4_on);
printf ( "% s \ n \ r", "@ dao dẫn 4x");
}
khoảng trống daoled5 ()
{
led5_on = ~ led5_on;
output_bit (LED5, led5_on);
printf ( "% s \ n \ r", "@ dao dẫn 5x");
}
khoảng trống daoled6 ()
{
led6_on = ~ led6_on;
output_bit (LED6, led6_on);
printf ( "% s \ n \ r", "@ dao dẫn 6x");
}
khoảng trống daoled7 ()
{
led7_on = ~ led7_on;
output_bit (LED7, led7_on);
printf ( "% s \ n \ r", "@ dao dẫn 7x");
}
khoảng trống daoled8 ()
{
led8_on = ~ led8_on;
output_bit (LED8, led8_on);
printf ( "% s \ n \ r", "@ dao dẫn 8x");
}
///////////////////////////////////////////////////////////////////////////////
//CHUONG TRINH DOC NHIET DO
khoảng trống goinhietdo ()
{
nổi adcndo;
// ADC dài;
delay_ms (10);
// bo ADC 10 bit = 1024
// Vref- = 0, Vref + = 1,5 1500 mV - 1024, // 10mV - 1 làm C
// adcndo = (1520 * (float) read_adc () / 1023);
// ADC = read_adc ();
//nhiet=adc*0.488;
adcndo = (2000f * (float) read_adc () / 1023);
// printf ( "% s% u% s \ n \ r", "a", nhiet, "s");
printf("%s %3.2f
%s\n\r","@ND",adcndo,"x"); //goi du lieu ve máy tính
theo quy d?nh
}
//NGAT TIMER 1
# INT_TIMER1
khoảng trống ngattimer1 ()
{
//Th?ch anh 20000000, chu ki máy 0.2us
//Timer1 16 bit, tràn khi dem toi: 0.2*65535*8 =
104856 us, voi 8 là so scale khi cài d?t
// timer: DIV_BY_8
set_timer1 (4856); // timer dơi dau dem tu 4856
dem_t++; //moi lan tang khi timer 1 tran, tuong ung
voi 100000 us
if (dem_t==10) //dem toi 10 thì tuong ung voi chu ki
1s
{
bien_goinhietdo=1; //báo chu ki 1s
}
}
///////////////////////////////////////////////////////////////////////////////
//CHUONG TRINH DIEU KHIEN MOTOR
//CHUONG TRINH NHAN %PWM TU MAY TINH
khoảng trống nappwm ()
{
char SPWM [3];
spwm[0]=s1[4]; //l?y giá tr? %PWM t? bi?n nh?n theo
quy d?nh
SPWM [1] = s1 [5];
SPWM [2] = s1 [6];
PWM = atoi (PWM);
printf ( "% s% Lu% s \ n \ r", "@ Toc làm:", ppwm, "% x");
}
//CHUONG TRINH MOTOR STOP
khoảng trống motostop ()
{
set_pwm1_duty (0);
// output_bit (PWM, 0);
output_bit(DIR1,0); // motor ngung khi Dir 1 và 2 = 0
output_bit (DIR2,0);
setup_ccp1 (CCP_OFF); // Ngung xu t PWM?
co_thuan=0; //reset tr?ng thái ch?y thu?n ngh?ch
co_nghich=0;
printf ( "% s \ n \ r", "@ mstopx");
}
//CHUONG TRINH MOTOR CHAY THUAN
//Luu y ve cach tinh do rong xung
// pwm_chuki = [PR2 + 1] * 4 * T_daodong * Tmr2
//tmr2: 16,4,1===>dua vao chu ky xung mong muon,
xac dinh pr2
//tu pr2 xac dinh 100% la gia tri bao nhieu (x)
//tu do nap gia tri dieu rong xung vao. vidu: 50% la
x*50%
//vi du thach anh 20.000.000 Hz, tao xung 2440hz, tinh
ra pr2=127
//tinh ra chu ky xung pwm la 512 ung voi 100%
khoảng trống quaythuan ()
{
nổi pwm_t;
pwm_t = (float) ppwm * 512/100;
setup_ccp1(CCP_PWM); //cho phep xuat PWM kenh 1
output_bit (DIR1,1); // ch? N hu? Ng quay
output_bit (DIR2,0);
set_pwm1_duty ((int16) pwm_t); // p xung PWM n?
co_thuan=1;
printf ( "% s \ n \ r", "@ mthuanx");
}
//CHUONG TRINH MOTOR CHAY THUAN
khoảng trống quaynghich ()
{
nổi pwm_n;
pwm_n = (float) ppwm * 512/100;
setup_ccp1 (CCP_PWM);
output_bit (DIR1,0);
output_bit (DIR2,1);
set_pwm1_duty ((int16) pwm_n);
co_nghich=1;
printf ( "% s \ n \ r", "@ mnghichx");
}
///////////////////////////////////////////////////////////////////////////////
//CHUONG TRINH XOA BIEN NHAN
khoảng trống xoanhan ()
{
int j;
for (j = 0; j <= 9; j ++) {s1 [j] = 0;}
}
///////////////////////////////////////////////////////////////////////////////
//CHUONG TRINH CON XET MA NHAN DUOC
khoảng trống xetma ()
{
if ((biennhan) && (Ngát == 0))
{
if (strncmp (strstr (s1, sled1), sled1,2) == 0) {daoled1 ();} // n u = “l1”
if (strncmp (strstr (s1, sled2), sled2,2) == 0) {daoled2 ();} // n u =”l2”
if (strncmp (strstr (s1, sled3), sled3,2) == 0) {daoled3 ();}
if (strncmp (strstr (s1, sled4), sled4,2) == 0) {daoled4 ();}
if (strncmp (strstr (s1, sled5), sled5,2) == 0) {daoled5 ();}
if (strncmp (strstr (s1, sled6), sled6,2) == 0) {daoled6 ();}
if (strncmp (strstr (s1, sled7), sled7,2) == 0) {daoled7 ();}
if (strncmp (strstr (s1, sled8), sled8,2) == 0) {daoled8 ();}
if (strncmp (strstr (s1, snhietdo), snhietdo, 2) == 0) {goinhietdo ();} // n u = “nd”
if (strncmp (strstr (s1, smthuan), smthuan, 2) == 0) {quaythuan ();} // nau = “mt”
if (strncmp (strstr (s1, smnghich), smnghich, 2) == 0) {quaynghich ();} // nau = “mn”
if (strncmp (strstr (s1, smstop), smstop, 2) == 0) {motostop ();} // nau = “ms”
if (strncmp (strstr (s1, smpwm), smpwm, 2) == 0) // nau = “td”
{
nappwm ();
if (co_thuan) {quaythuan ();}
if
(co_nghich) {quaynghich();}
}
xoanhan();
biennhan = 0;
}
}
///////////////////////////////////////////////////////////////////////////////
// DOCNUTNHAN
khoảng trống nutnhan ()
{
char sodem [8];
char sf [8] = "@ SD";
char duong[3]="+";
char ssl [3] = "x";
if ((Ngát) && (biennhan == 0))
{
if (TSW> 0)
{
itoa (TSW, 10, sodem); // dai sa đập thành dang chuai
strcat(sodem,ssl);//ghép sa dam voi ss1
strcat(sf,duong); //ghép chuoi
strcat(sf,sodem);// ghép chuoi
}
if (TSW <= 0)
{
itoa (HƯƠNG, 10, sodem);
strcat (sodem, ssl);
strcat (sf, sodem);
}
printf ( "% s \ n \ r", sf);
ngat=0;
}
}
///////////////////////////////////////////////////////////////////////////////
//CHUONG TRINH CHINH
void main ()
{
ext_int_edge(H_TO_L ); //quy dinh ngat ngoài tích cuc
muc thap = canh xuong
enable_interrupts(INT_RB0);//khai bao INT0, canh xuong
enable_interrupts(INT_RB4);//khai bao INT4, canh xuong
enable_interrupts(INT_RDA);//cho phep ngat truyen thong
enable_interrupts(INT_TIMER1); // cho phép ngat timer1
enable_interrupts(GLOBAL); //cho phép ngat toàn cuc
setup_adc_ports(VREF_VREF);//quy dinh áp nguong so
sánh ADC
setup_adc_ports (san1);
setup_adc (ADC_CLOCK_INTERNAL); // Built-in A / D chức năng thiết lập
set_adc_channel(1); //chon ADC kênh 1
setup_timer_2(T2_DIV_BY_16,127,1);//cài dat timer2
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); // cài dat timer1
set_timer1 (4865);
delay_ms (10);
while (true)
{
xetma();//goi chuong trình xét mã nhan duoc tu máy
tính
nutnhan(); //goi chuong trình nhan nút nhan
if (bien_goinhietdo==1) //goi nhiet do dua vào chu ki
xap xi 1s dã thiet lap tu ngat timer1
{
goinhietdo ();
bien_goinhietdo = 0;
dem_t = 0;
}
}
}
Giao diện
Visual Basic :
nhập khẩu Hệ thống
nhập khẩu
System.ComponentModel
nhập khẩu
System.IO.Ports
Công Lớp GiaodienHoangThinh
không nhietdo
không bodemnhan
Private Sub
GiaodienHoangThinh_Load (người gửi Như Object , e Như EventArgs ) Xử lý MyBase Load
Baotrangthai.Text = "Mời bạn
mở cổng COM"
MoCongCOM.Enabled = Đúng
DongCOM.Enabled = False
goi.Enabled = False
Nhan.Enabled = False
led_1.Enabled = False
led_2.Enabled = False
led_3.Enabled = False
led_4.Enabled = False
led_5.Enabled = False
led_6.Enabled = False
led_7.Enabled = False
led_8.Enabled = False
End Sub
Private Sub MoCongCOM_Click (người gửi Như Object , e Như EventArgs ) Xử lý MoCongCOM.Click
Nếu (CongCOM.IsOpen) Sau đó,
Exit Sub
EndIf
với CongCOM
.PortName = "COM1"
.BaudRate = 9600
.Parity = IO.Ports. chẵn lẻ .None
.StopBits = IO.Ports. StopBits .Một
.DataBits = 8
.ReceivedBytesThreshold = 1
End Với
Thử
CongCOM.Open ()
MoCongCOM.Enabled = False
DongCOM.Enabled = Đúng
goi.Enabled = Đúng
Nhan.Enabled = True
led_1.Enabled = Đúng
led_2.Enabled = Đúng
led_3.Enabled = Đúng
led_4.Enabled = Đúng
led_5.Enabled = Đúng
led_6.Enabled = Đúng
led_7.Enabled = Đúng
led_8.Enabled = Đúng
Baotrangthai.Text = "Cổng COM đã
mở"
Catch ex Như ngoại lệ
End Try
End Sub
Private Sub DongCOM_Click (người gửi Như Object , e Như EventArgs ) Xử lý DongCOM.Click
CongCOM.Close ()
MoCongCOM.Enabled = Đúng
DongCOM.Enabled = False
goi.Enabled = False
Nhan.Enabled = False
led_1.Enabled = False
led_2.Enabled = False
led_3.Enabled = False
led_4.Enabled = False
led_5.Enabled = False
led_6.Enabled = False
led_7.Enabled = False
led_8.Enabled = False
Baotrangthai.Text = "Mời bạn mở cổng
COM"
End Sub
PrivateSub Thoat_Click(sender AsObject, e AsEventArgs) Handles Thoat.Click
If MsgBox("Bạn có muốn thoát khỏi chương trình?",
MsgBoxStyle .YesNo + MsgBoxStyle .Question,
"Exit" ) =
MsgBoxResult .Yes Sau đó,
Gần()
EndIf
End Sub
Private Sub led_1_Click (người gửi Như Object , e Như EventArgs ) Xử lý led_1.Click
CongCOM.Write ( "@ L1x" )
End Sub
Private Sub DATA_RECEIVED (người gửi Như Object , e Như IO.Ports. SerialDataReceivedEventArgs ) Xử lý
CongCOM.DataReceived
Dim v_start Như Integer
Dim v_stop Như Integer
Dim v_nhietdo Như Integer
Thử
CheckForIllegalCrossThreadCalls = False
bodemnhan + = CongCOM.ReadExisting
Nếu bodemnhan.Contains ( "@" ) Sau đó,
Nếu
bodemnhan.EndsWith ( "x" ) Sau đó,
CongCOM.DiscardInBuffer ()
v_start = bodemnhan.IndexOf ( "@" )
v_stop = bodemnhan.IndexOf ( "x" )
Nếu
bodemnhan.Contains ( "NĐ" ) Sau đó,
v_nhietdo = bodemnhan.IndexOf ( "NĐ" )
nhietdo = bodemnhan.Substring (v_nhietdo + 2, v_stop - (v_nhietdo + 1) - 1) + "oC"
khác
Onhan.Text = bodemnhan.Substring (v_start + 1, v_stop - 1 - v_start)
EndIf
Nếu
bodemnhan.Contains ( "+" ) Sau đó,
sw1.BackColor = Màu .Green
khác
sw1.BackColor = Màu .Red
EndIf
Nếu
bodemnhan.Contains ( "-" ) Sau đó,
sw2.BackColor = Màu .Green
khác
sw2.BackColor = Màu .Red
EndIf
bodemnhan = ""
EndIf
EndIf
Catch ex Như ngoại lệ
End Try
End Sub
PrivateSub Nhan_Click(sender AsObject, e AsEventArgs) Handles Nhan.Click
laymau.Start ()
End Sub
Private Sub led_2_Click (người gửi Như Object , e Như EventArgs ) Xử lý led_2.Click
CongCOM.Write ( "@ L2x" )
End Sub
Private Sub led_3_Click (người gửi Như Object , e Như EventArgs ) Xử lý led_3.Click
CongCOM.Write ( "@ l3x" )
End Sub
Private Sub led_4_Click (người gửi Như Object , e Như EventArgs ) Xử lý led_4.Click
CongCOM.Write ( "@ L4x" )
End Sub
Private Sub led_5_Click (người gửi Như Object , e Như EventArgs ) Xử lý led_5.Click
CongCOM.Write ( "@ L5X" )
End Sub
Private Sub led_6_Click (người gửi Như Object , e Như EventArgs ) Xử lý led_6.Click
CongCOM.Write ( "@ L6x" )
End Sub
Private Sub led_7_Click (người gửi Như Object , e Như EventArgs ) Xử lý led_7.Click
CongCOM.Write ( "@ L7x" )
End Sub
Private Sub led_8_Click (người gửi Như Object , e Như EventArgs ) Xử lý led_8.Click
CongCOM.Write ( "@ l8x" )
End Sub
Private Sub laymau_Tick (người gửi Như Object , e Như EventArgs ) Xử lý laymau.Tick
Thử
Nếu CongCOM.IsOpen Sau đó,
onhietdo.Text = nhietdo
EndIf
Catch ex Như ngoại lệ
End Try
End Sub
Private Sub Onhan_TextChanged (người gửi Như Object , e Như EventArgs ) Xử lý Onhan.TextChanged
End Sub
Private Sub goi_Click (người gửi Như Object , e Như EventArgs ) Xử lý goi.Click
CongCOM.Write ( "@" + ogoi.Text + "x" )
Dim bodemgoi Như Chuỗi
bodemgoi = ogoi.Text
CongCOM.Write (bodemnhan)
End Sub
End Lớp
Và đây là kết quả :