Đề cương ứng dụng lập trình C cho vi điều khiển 8051
Trong kỹ thuật lập trình vi điều khiển nói chung, ngôn ngữ lập trình được sử dụng thường chia làm 2 loại: Ngôn ngữ bậc thấp và Ngôn ngữ bậc cao.
Ngôn ngữ bậc cao là các ngôn ngữ gần vơi ngôn ngữ con người hơn, do đó việc lập trình bằng các ngôn ngữ này trở nên dễ dàng và đơn giản hơn. Có thể kể đến một số ngôn ngữ lập trình bậc cao như C, Basic, Pascal trong dó C là ngôn
ngữ thông dụng hơn cả trong kỹ thuật vi điều khiển. Về bản chất, sử dụng các ngôn ngữ này thay cho ngôn ngữ bậc thấp là giảm tải cho lập trình viên trong việc nghiên cứu các tập lệnh và xây dựng các cấu trúc giải thuật. Chương trình viết bằng ngôn ngữ bậc cao cũng sẽ được một phần mềm trên máy tính gọi là trình biên dịch (Compiler) chuyển sang dạng hợp ngữ trước khi chuyển sang mã máy.
Khi sử dụng ngôn ngữ C người lập trình không cần hiểu sâu sắc về cấu trúc của bộ vi điều khiển. Có nghĩa là với một người chưa quen với một vi điểu khiển cho trước sẽ xây dựng được chương trình một cách nhanh chóng hơn, do không phải mất thời gian tìm hiểu kiến trúc của vi điều khiển đó. Và việc sử dụng lại các chương trình đã xây dựng trước đó cũng dễ dàng hơn, có thể sử dụng toàn bộ hoặc sửa chữa một phần.
diễn ra. - mẫu viết hàm ngắt như sau: Void name(void)interrupt x(x là số thứ tự ngắt ngoài x = 0 hoặc 2) { //chương trình phục vụ ngắt } - Trong chương trình chính ta phải có thao tác thiết lập việc cho phép các ngắt được sử dụng. 2.3. bài toán: sử dụng ngắt ngoài của vi điều khiển với nhiệm vụ là: bình thường vi điều khiển bật một Led đơn tại chân P1.0 và khi có ngắt ngoài thì tắt Led ở P1.0 và bật Led ở chân P1.1 sau 1s thì bật lại Led P1.0 và tắt Led P1.1. Bài giải: /*==================Bo tien xu li===================*/ #include // Dinh kem file thu vien #define bat 1 // Dinh nghia gia tri bat den Led #define tat 0 // Dinh nghia gia tri tat den Led /*==================khai bao bien==================*/ sbit Led1 = P1^0; // Khai bao bi?n Led ki?u bit chan P1.0 sbit Led2 = P1^1; // Khai bao bi?n Led ki?u bit chan P1.0 /*================= Khai bao hàm==================*/ /*------------------------------ham tre -------------------------------------*/ void delay(long time) { while(time--); } void INT_0(void) interrupt 0 // chuong trinh phuc vu ngat { Led1=tat; Led2=bat; delay(25000); Led1=bat; Led2=tat; } /*--------------------------------ham chinh--------------------------------*/ void main(void) { EA=1; // cho phep ngat toan cuc EX0=1; // cho phep ngat ngoai 0 IT0=1; //ngat kich phat suon Led1=bat; Led2=tat; while(1); } Bài 6: Điều khiển động cơ DC, động cơ Servo, động cơ bước 1. Đông cơ DC 2. Động cơ Servo 3. Động cơ bước (Step motor) Điều khiển động cơ bước với tốc độ tăng dần từ 5 đến 100 v/p, mỗi lần chuyển tốc độ tăng 5v/p thời gian chuyển 1s, hiển thị tốc độ trên LCD. + Chương trình: #include #include #define LCDdata P2 sbit RS=P3^0; sbit RW=P3^1; sbit EN=P3^2; sbit BF=LCDdata^7; #include"lcd.h" unsigned char data Bytecao1,Bytethap1; unsigned char data Buoc,Nbuoc; unsigned char data Mbuoc[4]={144,192,96,48}; void viewspeed(unsigned char speed); void Xuly(unsigned char Nspeed); void Dkdongco(void) interrupt 1 using 0 { TR0=0; TH0=Bytecao1; TL0=Bytethap1; TR0=1; P1=Mbuoc[Buoc]; Buoc++; if(Buoc==4)Buoc=0; } void Xuly(unsigned char speed) { unsigned int data Chuki1,Chuki2; unsigned int data tam1,tam2; TR0=0; viewspeed(speed); Nbuoc=200; tam2=10000/Nbuoc; tam1=6000/speed; Chuki1=tam1*tam2; Chuki2=65535-Chuki1; Bytecao1=Chuki2/256; Bytethap1=Chuki2%256; TR0=1; } void delay(unsigned long time) { while(time--); } void viewspeed(unsigned char speed) { unsigned char data a1,a2; LCDcontrol(0xc0); a1=speed%10; speed=speed/10; a2=speed%10; speed=speed/10; LCDwrite(speed+48); LCDwrite(a2+48); LCDwrite(a1+48); LCDwrites("(vong/phut)"); } void main() { unsigned char data i; TMOD=17; EA=1; LCDinit(); ET0=1; LCDcontrol(0x80); LCDwrites("CT DK DC buoc" ); LCDcontrol(0xc0); LCDwrites("V:5-100(v/p)"); delay(100000); while(1){ Buoc=2; for(i=5;i<101;i=i+5){ LCDcontrol(0x01); LCDcontrol(0x80); LCDwrites("CT DK DC buoc" ); Xuly(i); delay(500000); } } }Bài 7: Giao tiếp Vi điều khiển với Máy tính I. Cổng truyền thông nối tiếp 1. Thanh ghi SCON – SBUF II. Xây dựng chương trình 1. Chương trình VB + Giao diện + Thuật toán + Chương trình: Option Explicit Dim Mau As Byte Private Sub cbcolor_Click() If (cbcolor.Text = "Mau do") Then Mau = 1 txtchu.ForeColor = &HFF& lbHienthi.ForeColor = &HFF& ElseIf (cbcolor.Text = "Mau xanh") Then Mau = 2 txtchu.ForeColor = vbGreen lbHienthi.ForeColor = &HFF00& ElseIf (cbcolor.Text = "Mau cam") Then Mau = 3 txtchu.ForeColor = &H80FF& lbHienthi.ForeColor = &H80FF& End If End Sub Private Sub cbcolor_GotFocus() SendKeys "%{DOWN}" End Sub Private Sub cmdCode_Click() MsgBox Code(txtchu) End Sub Private Sub cmdExit_Click() If MSComm1.PortOpen Then MSComm1.PortOpen = False End If End End Sub Function Code(s As String) As String Dim i As Integer s = Replace(s, " ", "") For i = 1 To Len(s) Code = Code & " " & Asc(Mid(s, i, 1)) Next End Function Private Sub OpenPort() Dim s As String MSComm1.Settings = "57600,N,8,1" MSComm1.CommPort = 1 MSComm1.PortOpen = True MSComm1.InputLen = 0 s = MSComm1.Input MsgBox "Port did open" End Sub Private Sub cmdOpenport_Click() If MSComm1.PortOpen Then MSComm1.PortOpen = False End If OpenPort End Sub Private Sub cmdSend_Click() Dim s As String If MSComm1.PortOpen = False Then MsgBox "Port did not open" OpenPort End If If MSComm1.PortOpen Then txtchu.Text = UCase(txtchu.Text) s = Chr(Mau) & Chr(Len(txtchu.Text)) & txtchu.Text & Chr(255) Do While (MSComm1.OutBufferCount > 0) Loop MSComm1.Output = s End If End Sub Private Sub cmdStop_Click() MSComm1.Output = Chr(250) MsgBox "Port Stoped" End Sub Private Sub Form_Load() txtchu.ForeColor = vbRed txtchu.Text = "DO AN GHEP NOI" Mau = 1 End Sub Private Sub Form_Resize() If (Me.WindowState = 1) Then Me.Height = 4000 Me.Width = 7230 End If End Sub Private Sub txtchu_GotFocus() txtchu.SelStart = 0 txtchu.SelLength = Len(txtchu) End Sub 2. Chương trình vi điều khiển + Thuật toán + Chương trình: /************Khai bao tien xy ly***************/ #include /*********Dinh nghia hang so mau**********/ #define Mdo 1 #define Mxanh 2 #define Mcam 3 /*****Khai bao mang ki tu gom chu so va chu cai****/ unsigned char code Mchar[36][7]={ 48,0,126,129,129,129,126,/*0*/ 49,0,0,33,65,255,1,/*1*/ 50,0,99,135,137,145,97,/* 2 */ 51,0,66,129,145,145,110,/* 3 */ 52,0,24,40,72,255,8,/* 4 */ 53,0,226,145,145,145,142,/* 5 */ 54,0,118,137,137,137,70,/* 6 */ 55,0,128,135,136,144,224,/* 7 */ 56,0,110,145,145,145,110,/* 8 */ 57,0,102,145,145,145,110,/* 9 */ 65,0,63,72,136,72,63,/* A */ 66,0,255,145,145,145,110,/* B */ 67,0,126,129,129,129,70,/* C */ 68,0,255,129,129,129,126,/* D */ 69,0,255,145,145,145,129,/* E */ 70,0,255,144,144,144,128,/* F */ 71,0,126,129,129,137,78,/* G */ 72,0,255,16,16,16,255,/* H */ 73,0,129,129,255,129,129,/* I */ 74,0,2,129,130,252,128,/* J */ 75,0,255,24,36,66,129,/* K */ 76,0,255,1,1,1,1,/* L */ 77,0,255,64,32,64,255,/* M */ 78,0,255,96,24,6,255,/* N */ 79,0,126,129,129,129,126,/* O */ 80,0,255,144,144,144,96,/* P */ 81,0,126,129,133,130,125,/* Q */ 82,0,255,144,144,144,111,/* R */ 83,0,98,144,144,144,78,/* S */ 84,0,128,128,255,128,128,/* T */ 85,0,254,1,1,1,254,/* U */ 86,0,252,2,3,2,252,/* V */ 87,0,255,12,3,12,255,/* W */ 88,0,199,40,16,40,199,/* X */ 89,0,224,16,15,16,224,/* Y */ 90,0,131,133,153,161,193/* Z */ }; /*******Dinh nghia cac chan va cac cong dieu khien*****/ sfr Pxanh=0x90; sfr Pdo=0xA0; sbit Clear=P3^4; sbit Data=P3^3; sbit Clock=P3^2; /**************Khai bao bien toan cuc*************/ unsigned char data Ktnhan,nhanmau,j,i,Maxc,Count,nLap; unsigned char data Mau,Chay,tam,dem; unsigned char data MC[76],MQ[32]; /**********Khoi ham chuong trinh**********/ // Ham ngat noi tiep void Ngatnoitiep(void) interrupt 4 using 0 { if(RI){ RI=0; tam=SBUF; if(tam==250){ Chay=1;i=j=77;dem=8; Count=0; Clear=0; }else{ if(nhanmau){ Mau=tam; Chay=1;i=j=77;dem=8; Count=nhanmau=0; P1=P2=0; Clear=0; }else if(tam==255){ Clear=1; Chay=0; Ktnhan=nhanmau=1; }else{ if(Ktnhan){ Maxc=tam; Ktnhan=0; }else if(Count<76&&Count<Maxc){ MC[Count]=tam; Count++; } } } } } void Khoitao(void) { PCON|=128; EA=1; ES=1; SM0=0; SM1=1; Ktnhan=nhanmau=1; Chay=1; P0=P1=P2=0; P3_0=1; nLap=1; } // Ham tao tre void delay(void) { unsigned char data i; i=10; while(i--); } // Ham hien thi mau cam void Cam(void) { while(nLap--) { Data=1; for(j=0;j<32;j++){ Clock=1; Data=0; Clock=0; Pdo=Pxanh=MQ[j]; delay(); Pxanh=Pdo=0; } } } // Ham hien thi mau xanh void Xanh(void) { while(nLap--) { Data=1; for(j=0;j<32;j++){ Clock=1; Data=0; Clock=0; Pxanh=MQ[j]; delay(); Pxanh=0; } } } // Ham hien thi mau do void Do(void) { while(nLap--) { Data=1; for(j=0;j<32;j++){ Clock=1; Data=0; Clock=0; Pdo=MQ[j]; delay(); Pdo=0; } } } // Ham thay doi mang hien thi void change(void) { MQ[0]=MQ[1];MQ[1]=MQ[2];MQ[2]=MQ[3];MQ[3]=MQ[4]; MQ[4]=MQ[5];MQ[5]=MQ[6];MQ[6]=MQ[7];MQ[7]=MQ[8]; MQ[8]=MQ[9];MQ[9]=MQ[10];MQ[10]=MQ[11];MQ[11]=MQ[12]; MQ[12]=MQ[13];MQ[13]=MQ[14];MQ[14]=MQ[15];MQ[15]=MQ[16]; MQ[16]=MQ[17];MQ[17]=MQ[18];MQ[18]=MQ[19];MQ[19]=MQ[20]; MQ[20]=MQ[21];MQ[21]=MQ[22];MQ[22]=MQ[23];MQ[23]=MQ[24]; MQ[24]=MQ[25];MQ[25]=MQ[26];MQ[26]=MQ[27];MQ[27]=MQ[28]; MQ[28]=MQ[29];MQ[29]=MQ[30];MQ[30]=MQ[31]; } // Ham tim vitri ki tu hien thi trong bang chu cai va chu so unsigned char Chiso(unsigned char chr) { unsigned char data End,Start,Mid,Mctam; if(chr==Mchar[0][0]){ return 0; }else if(chr==Mchar[35][0]){ return 35; }else{ End=35; Start=0; while(1){ Mid=(End+Start)/2; Mctam=Mchar[Mid][0]; if(chr==Mctam){ return Mid; }else if(chr<Mctam){ End=Mid; }else{ Start=Mid; } } } } void Chaychu(void) { unsigned char vitri; for(j=0;j<32;j++){ MQ[j]=0; } for(i=0;i<Count;i++) { if(MC[i]==32){ change(); MQ[31]=0; if(Mau==Mxanh)Xanh(); else if(Mau==Mdo)Do(); else Cam(); change(); MQ[31]=0; if(Mau==Mxanh)Xanh(); else if(Mau==Mdo)Do(); else Cam(); }else{ vitri=Chiso(MC[i]); for(dem=1;dem<7;dem++){ change(); MQ[31]=Mchar[vitri][dem]; if(Mau==Mxanh)Xanh(); else if(Mau==Mdo)Do(); else Cam(); } } } if(!Chay){ for(i=0;i<32;i++){ change(); MQ[31]=0; if(Mau==Mxanh)Xanh(); else if(Mau==Mdo)Do(); else Cam(); } } } // Chuong trinh chinh void main() { Khoitao(); REN=1; while(1){ while(Chay); Chaychu(); } }
File đính kèm:
- Đề cương ứng dụng lập trình C cho vi điều khiển 8051.doc