You are on page 1of 15

#include <16f877a.

h>
#device *=16 ADC=10
#include <stdlib.h>
#use delay(clock=20M)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,
NOCPD, NOWRT
#priority rda,timer1,EXT
#use rs232(baud=9600,parity=n,xmit=pin_c6,rcv=pin_c7)
#bit leddon1 = 0x06.4
#byte DAC = 0x08
int16 xung,i,j,k; //Dem xung Encoder
int16 gtxuat;//Van toc Dong Co
int8 donvi,chuc,tram,nghin,t;
int8 udk;
char string[5];
char c;
float volts, ki, kd,Vdat, vantoc, ampe, kp,ek, ek2, udk2, udk3;
int16 temp, adc_value;
void truyenRS232()
{
gtxuat=adc_value;
nghin=gtxuat/1000;
gtxuat=gtxuat%1000;
tram=gtxuat/100;
gtxuat=gtxuat%100;
chuc=gtxuat /10;
donvi=gtxuat%10;
printf("!%u%u%u%u@",nghin,tram,chuc,donvi);
}
#INT_EXT
void dem_encoder()
{
xung++;; //Tang Xung len 1
}
#int_timer1 // ngat timer 1 khi timer 1 tran
void ngat_timer1()
{

//Do toc do
vantoc = (float)xung*6;
ek = Vdat - vantoc;
udk2 = udk2 + kp*ek + ki*ek2;
if (udk2 >3187) udk2 = 3187;
if (udk2 < 1) udk2 = 1;
ek2 = ek;
udk3 = udk2 * kd;
udk = (int8)udk3;
DAC = ~udk;
xung = 0;
set_timer1(3036);
}
#int_rda //Ngat Truyen Thong
void serial_isr() {
disable_interrupts(INT_RDA);
string[i]=getc();
if (string[i]=='#')
{
c=string[i-1];
i=0;
t=1;
switch(c)
{
case 'p' :
{
kp=atof(string);break;
}
case 'i' :
{
ki=atof(string);break;
}
case 'd' :
{
kd=atof(string);break;
}
case 'u' :
{
udk=atoi(string);DAC = ~udk;break;
}
case 'v' : //Toc do dat
{
Vdat = atof(string); break;
}
case ')' : //Bat Led
{
leddon1 = 1;break;
}
case '(' : //Tat Led
{
leddon1 = 0;break;
}
case '&' : //Tat Led
{
putc('&');break;
}
}
}
else i++;
enable_interrupts(INT_RDA);
}

void main()
{
//Cai dat ngat truyen thong
enable_interrupts(int_rda);
ext_int_edge( H_TO_L );
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Timer1 is Timer
setup_timer_2(t2_div_by_16,6,10);
enable_interrupts(INT_TIMER1); //Timer1 65536
set_timer1(3036);
enable_interrupts(INT_EXT);
enable_interrupts(global);
xung = 0;
vantoc = 0;
t=0;
Vdat = 1500;
kp = 0;
ki = 0;
kd = 0;
//Cai dat vao ra
set_tris_a(0xFF);
//set_tris_b(0x0F);
set_tris_b(0xFF);
set_tris_c(0xc0);
set_tris_d(0x00);
delay_ms(50);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(RA0_ANALOG);
set_adc_channel(0);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
delay_ms(50);
while(1)
{
delay_ms(200);
adc_value = 0;
k = 100;
for(j=0;j<k;j++)
{
temp = read_adc();
if (temp >= 512) {
adc_value += temp;
delay_ms(2);
} else {
k++;
}
}
volts = (float)adc_value/100;
ampe = (volts - 512) * 0.00488;
ampe = ampe/0.185;
printf("!%4.0f|%1.3f|%u|%4.0f|%4.0f@",(float)vantoc,(float)ampe,udk,(float)ek,(float)Vdat);
}
}

Dim rs_giatri As String 'Bien trung gian luu gia tri doc tu PIC
Dim seach_COM As Integer 'Bien trung gian de tim thiet bi
Dim COM_true As Boolean 'Bien trung gian xac dinh dung cong COM
Dim dien_ap As Integer
Dim rs_kind As Byte
Dim tocdo(1 To 50000) As Long
Dim temp_tocdo As Long
Dim vdat As String

Private Sub Command1_Click()
'lbl_udk.Caption = CStr(14 - (HScroll1.Value * 0.0546875))

Dim i As Integer
For i = 1 To Len(Text2.Text)
MSComm1.Output = Mid(Text2, i, 1)
Next i
MSComm1.Output = "u#"
End Sub

Private Sub Command2_Click()
Timer1.Enabled = True
End Sub

Private Sub cmd_cauhinh_Click()
MSComm1.Output = txt_Kp + "p#"
MSComm1.Output = txt_Ki + "i#"
MSComm1.Output = txt_Kd + "d#"
End Sub

Private Sub cmd_khoidong_Click()
f cmd_khoidong.Caption = "Khi dng" Then
cmd_khoidong.Caption = "Dng dng c"
MSComm1.Output = "0.03d#"
Else
cmd_khoidong.Caption = "Khi dng"
MSComm1.Output = "0d#"
End If
End Sub

Private Sub cmd_setV_Click()
MSComm1.Output = txt_Vdat + "v#"
vdat = txt_Vdat
End Sub

Private Sub cmd_xoa_Click()
temp_tocdo = 1
TChart1.Series(0).Clear
TChart1.Series(1).Clear
TChart1.Series(2).Clear
TChart1.Series(0).AddXY 0, 0, "", vbRed
TChart1.Series(1).AddXY 0, 0, "", vbGreen
TChart1.Series(2).AddXY 0, 0, "", vbBlue
End Sub

'==================================
'Cai dat khi Load chuong trinh
'==================================
Private Sub Form_Load()
seach_COM = 0
COM_true = False
dien_ap = 20
rs_kind = 0
temp_tocdo = 1
rs_giatri = ""
vdat = "2000"
TChart1.Series(0).AddXY 0, 0, "", vbRed
TChart1.Series(1).AddXY 0, 0, "", vbGreen
TChart1.Series(2).AddXY 0, 0, "", vbBlue
End Sub

'==================================
'Doan chuong trinh ket noi cong COM
'==================================
Private Sub cmd_connect_Click()
On Error GoTo Loi
f cmd_connect.Caption = "Kt Ni" Then
If op_tudong.Value = True Then
tmr_seach_com.Enabled = True
pro_seach_com.Value = 0
pro_seach_com.Visible = True
Else
If MSComm1.PortOpen = False Then 'Kiem tra chua ket noi cong COM
MSComm1.Settings = "9600,n,8,1"
If cb_com.Text = "COM" Then
MsgBox "Ban chua chon cng COM", , "Thng bo"
Exit Sub
End If
MSComm1.CommPort = cb_com.Text
MSComm1.PortOpen = True 'Mo ket noi cong COM
lbl_thongbao.Caption = " kt ni COM" + cb_com.Text
cb_com.Enabled = False
Else
MsgBox " kt ni ri", , "Thng bo"
End If
cmd_connect.Caption = "Ngt kt ni"
End If
Else
cmd_connect.Caption = "Kt Ni"
lbl_thongbao.Caption = " ngt kt ni"
cb_com.Enabled = True
MSComm1.PortOpen = False
COM_true = False
seach_COM = 0
End If
Exit Sub
Loi:
lbl_thongbao.Caption = "Kt ni li..."
End Sub

Private Sub HScroll1_Change()
'MsgBox HScroll1.Value
lbl_udk.Caption = CStr(12 - (HScroll1.Value * 0.046875))
If HScroll1.Value < 10 Then
MSComm1.Output = "00" + CStr(HScroll1.Value) + "u#"
Else
If HScroll1.Value < 100 Then
MSComm1.Output = "0" + CStr(HScroll1.Value) + "u#"
Else
MSComm1.Output = CStr(HScroll1.Value) + "u#"
End If
End If

End Sub

Private Sub Timer1_Timer()
If (CInt(txt_Vthuc) > CInt(txt_Vdat)) Then
dien_ap = dien_ap - 1
Else
dien_ap = dien_ap + 1
End If
If dien_ap > 225 Then
dien_ap = 225
End If
If dien_ap < 20 Then
dien_ap = 20
End If
MSComm1.Output = CStr(dien_ap) + "u#"
Me.Caption = CStr(dien_ap)
End Sub

'==================================
'Tu dong do thiet bi
'==================================
Private Sub tmr_seach_com_Timer()
On Error GoTo Handler
tmr_seach_com.Interval = 400
If COM_true = True Then
lbl_thongbao.Caption = " kt ni COM" + CStr(seach_COM)
cb_com.Enabled = False
cmd_connect.Caption = "Ngt kt ni"
tmr_seach_com.Enabled = False
pro_seach_com.Visible = False
Exit Sub
Else
seach_COM = seach_COM + 1
pro_seach_com.Value = seach_COM
If seach_COM = 50 Then seach_COM = 1
lbl_thongbao.Caption = "ang th kt ni COM" + CStr(seach_COM)
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
End If

MSComm1.Settings = "9600,n,8,1"
MSComm1.CommPort = CStr(seach_COM)
MSComm1.PortOpen = True 'Mo ket noi cong COM
MSComm1.Output = "&#"
Exit Sub
Handler:
tmr_seach_com.Interval = 100
End Sub

'==================================
'Tuy chon Tu dong/Thu cong
'==================================
Private Sub op_tudong_Click()
If op_tudong.Value = True Then
cb_com.Visible = False
End If
End Sub
Private Sub op_thucong_Click()
If op_thucong.Value = True Then
cb_com.Visible = True
End If
End Sub

'==================================
'Cap nhat ty gia
'==================================
Private Sub cmd_capnhat_Click()
Dim i As Integer
If MSComm1.PortOpen = False Then
MsgBox "Chua ket noi voi thiet bi", , "Thong bao"
Exit Sub
End If
If Len(txt_capnhat) > 4 Then txt_capnhat = Left(txt_capnhat, 5)
MSComm1.Output = "#"
For i = 1 To 5
MSComm1.Output = Mid(txt_capnhat, i, 1)
Next i
MSComm1.Output = "@"
txt_capnhat.Visible = False
cmd_capnhat.Visible = False
lbl_tygia.Visible = True
lbl_tygia.Caption = txt_capnhat
End Sub
'==================================
'Click sua chua ty gia
'==================================
Private Sub lbl_tygia_DblClick()
txt_capnhat.Visible = True
cmd_capnhat.Visible = True
lbl_tygia.Visible = False
txt_capnhat.SetFocus
txt_capnhat = lbl_tygia.Caption
End Sub
'==================================
'Ngat ky tu nhan duoc tu PIC
'==================================
Private Sub MSComm1_OnComm()
Dim kytunhan As String 'Khai bao bien
kytunhan = MSComm1.Input 'Doc gia tri nhan duoc tu cong com
If kytunhan = "&" Then
COM_true = True
Exit Sub
End If
If kytunhan = "!" Then
rs_kind = 1
Exit Sub
End If
If kytunhan = "#" Then
rs_kind = 2
Exit Sub
End If
If rs_kind <> 0 Then
If kytunhan = "@" Then
hienthi_dothi
Exit Sub
End If
rs_giatri = rs_giatri + kytunhan
End If

'If kytunhan = "@" Then
'Text1.Text = tygia
'MANG(bien_dem) = CLng(Val(tygia))
'If MANG(bien_dem) <> 0 Then
'With TChart1.Series(0)
' .AddXY bien_dem, MANG(bien_dem), "", vbRed
'End With
' bien_dem = bien_dem + 1
' End If
' tygia = ""
' Exit Sub
' End If
'tygia = tygia + kytunhan
'Me.Caption = kytunhan
End Sub
Private Sub hienthi_dothi()
Select Case (rs_kind)
Case 1
Me.Caption = CStr(rs_giatri)
Dim s() As String
s = Split(rs_giatri, "|")
txt_Vthuc = s(0)
txt_dong = s(1)
'tocdo(temp_tocdo) = CStr(Val(rs_giatri))
If CStr(Val(s(0))) <> 0 Then
TChart1.Series(0).AddXY temp_tocdo, CStr(Val(s(0))), "", vbRed
TChart1.Series(1).AddXY temp_tocdo, CLng(vdat), "", vbGreen
TChart1.Series(2).AddXY temp_tocdo, CStr(Val(s(1)) * 500), "", vbBlue
'MsgBox CStr(s(0))
temp_tocdo = temp_tocdo + 1
End If
rs_kind = 0
rs_giatri = ""
Case 2
rs_kind = 0
End Select

End Sub
'==================================
'Update/Save Ty gia
'==================================
Private Sub cmd_update_Click()
Dim TextLine
Open "TEST" For Input As #1 ' Mo file.
Line Input #1, TextLine ' Doc tung dong gan vao bien TextLine
lbl_tygia.Caption = Replace(TextLine, """", "")
txt_capnhat = Replace(TextLine, """", "")
cmd_capnhat_Click
Close #1 ' Dong file.
End Sub
Private Sub cmd_save_Click()
Dim FileNumber
FileNumber = FreeFile ' Gan FileNumber = Trong
Open "TEST" For Output As #FileNumber ' mo file
Write #FileNumber, lbl_tygia.Caption ' Ghi vo file
Close #FileNumber ' Dong file
MsgBox "Da luu du lieu", , "Thong bao"
End Sub

You might also like