Đề 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.

 

doc83 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 3795 | Lượt tải: 1download
Tóm tắt nội dung Đề cương ứng dụng lập trình C cho vi điều khiển 8051, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trê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:

  • docĐề cương ứng dụng lập trình C cho vi điều khiển 8051.doc