Giao diện điều khiển nhiệt độ, đèn LED, tốc độ động cơ , quay thuận nghịch, nút nhấn gởi nhận dữ liệu,...(Phần 1)

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ả :



Previous
Next Post »