Thứ Tư, 24 tháng 10, 2012

code mẫu cho 8051 - Nháy LED tạo hiệu ứng đơn giản

Chương trình mô phỏng trên ISIS - Proteus:




Mã nguồn C:

#include<at89x52.h>
unsigned char nhayled[20]={0x05,0x0e,0x1d,0x3e,0x7d,0xfe,0x01,0x82,0xc1,0xe2,0xf1,0xfa,0xfd,0x02,0xfd,0x02,0xfd,0x02,0xfd,0x02}; //cac hieu ung
void delay(unsigned int i)
{
while(i--)
{
unsigned char j=121;
while(j--){}
}
}
main()
{
unsigned char k;
while(1)
{
for(k=0;k<20;k++)
{
P0=nhayled[k];
delay(250);
}
}
}


code mẫu cho 8051 - Đo nhiệt độ, hiển thị lên LCD 16x2

Chương trình thực hiện đo nhiện độ và hiển thị kết quả lên LCD 16x2, các bước khởi tạo LCD, khởi tạo bộ ADC trong 8051.

Mã nguồn C:


#include <AT89X51.H>
#include <stdio.h>
#include<string.h>

#define RS P3_5
#define RW P3_6//RW=0 => ghi
#define EN P3_7//RW=1 => doc
//RS=0 => code
//RS=1 => data
#define LCD_PORT P1

#define INTR P3_2
#define RD P3_3
#define WR P3_4


//===========================
void delay_ms(int n)
{
int k,j;
for(k=0;k<n;k++)
{
for(j=0;j<500;j++);
}

}
//==========================
void delay_5ms()
{
int i,j;
for(i=0;i<250;i++)
for(j=0;j<4;j++){}
}
//===========================
void delay_15ms()
{
int i,j;
for(i=0;i<250;i++)
for(j=0;j<100;j++){}
}
//============================
void LCDWriteCmd(unsigned char c) //CT con ghi du lieu len LCD
{
RS=0;//code
RW=0;//ghi
LCD_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//==============================
void LCDWriteData(unsigned char c) //CT con doc du lieu tu LCD
{
RS=1;//data
RW=0;//ghi
LCD_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//===============================
void LCD_init() // Khoi tao LCD
{
delay_15ms();
LCDWriteCmd(0x38); //che do 8bit,2 hang,kieu ky tu 5x8 diem anh.
LCDWriteCmd(0x0C); //hien thi man hinh.
LCDWriteCmd(0x06); //tu dong tang bo dem dia chi
LCDWriteCmd(0x01); // Xoa man hinh LCD
}
//================================
void LCD_clear()
{
LCDWriteCmd(0x01);
}
//===============================
void LCD_home()
{
LCDWriteCmd(0x80);
}
//=============================
void LCD_putstr(unsigned char *s)
{
while (*s)
{
LCDWriteData(*s);
s++;
}
}
//============================
void HienThi_ADC(unsigned char t)
{
unsigned char v;
if(t<10)
LCDWriteData(t+48);
else if(t<100)
{
LCDWriteData(t/10+48);
LCDWriteData(t%10+48);
}
else
{
v=t/10;
LCDWriteData(v/10+48);
LCDWriteData(v%10+48);
LCDWriteData(t%10+48);
}
}
//==========================================
void main (void)
{
unsigned char gt=0; //gt la bie^n' cho gia tri 8bit ADC
LCD_init();
while(1)
{
WR=0; // Bat dau chuyen doi gia tri tu ADC
delay_ms(5); // Tao tre de cap nhat du lieu tu ADC
WR=1; //ket thuc chuyen doi.
// while(!INTR);
RD=0; // Nhan du lieu da duoc chuyen doi
gt=P2; //cap nhat ADC.
LCDWriteCmd(0x01);
LCDWriteCmd(0x83);
LCD_putstr("8051 & ADC");
LCDWriteCmd(0xC0);
LCD_putstr("Nhiet do:");
HienThi_ADC(gt);
delay_ms(150);
}
}







code mẫu cho 8051 - Đo nhiệt độ, hiển thị LCD, truyền dữ liệu qua RS232

Chương trình thực hiện kết hợp đo nhiệt độ, hiển thị lên LCD, và truyền dữ liệu lên máy tính qua giao tiếp RS232.

Mô phỏng trên ISIS - Proteus:




mô phỏng trên ISIS - Proteus
Mã nguồn C:


#include<at89x51.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
//========================= #DEFINE LCD
#define RS P3_5
#define RW P3_6//RW=0 => ghi
#define EN P3_7//RW=1 => doc
//RS=0 => code
//RS=1 => data
#define LCD_PORT P1
//========================= #DEFINE ADC
#define INTR P3_2
#define RD P3_3
#define WR P3_4
//============================================================== DELAY
void delay_ms(int n)
{
int k,j;
for(k=0;k<n;k++)
{
for(j=0;j<500;j++);
}

}
//==========================
void delay_5ms()
{
int i,j;
for(i=0;i<250;i++)
for(j=0;j<4;j++){}
}
//===========================
void delay_15ms()
{
int i,j;
for(i=0;i<250;i++)
for(j=0;j<100;j++){}
}
//============================================================== LCD
//============================== GUI LENH CHO LCD
void LCD_CODE(unsigned char c)
{
RS=0;//code
RW=0;//ghi
LCD_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//=============================== KHOI TAO LCD
void LCD_INIT()
{
delay_15ms();
LCD_CODE(0x38); //che do 8bit,2 hang,kieu ky tu 5x8 diem anh.
LCD_CODE(0x0C); //hien thi man hinh,có con tro, con tro nhâp' nháy.
LCD_CODE(0x01); // Xoa man hinh LCD
}
//============================== IN KY TU
void LCD_DATA(unsigned char c)
{
RS=1;//data
RW=0;//ghi
LCD_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//=============================== IN CHUOI KY TU
void LCD_STRING(unsigned char *s)
{
while(*s) //den NULL thi thoi
{
LCD_DATA(*s);
s++;
}
}
//============================================================== KHOI TAO RS232
void SetupSerial()
{
TMOD=0x20; /* timer 1 che do 2: 8-Bit tu dong nap lai. */
TH1=0xFD; /* toc do 9600 baud */
TL1=0xFD;
SCON=0x52; /* Che do 1: 8-bit UART, cho phep truyen */
TR1=1; /* timer 1 run */
TI=0; /* co ngat nha^n.=0*/
RI=0; /* co ngat' truye^n =0*/
ES=1; /* cho phep ngat noi tiep */
}
//============================================================== HIEN THI GIA TRI ADC LEN LCD
void HIENTHI_ADC(unsigned char t)
{
unsigned char v;
if(t<10)
LCD_DATA(t+48);
else
if(t<100)
{
LCD_DATA(t/10+48);
LCD_DATA(t%10+48);
}
else
{
v=t/10;
LCD_DATA(v/10+48);
LCD_DATA(v%10+48);
LCD_DATA(t%10+48);
}
}
//============================================================== HAM GUI SO LIEU LEN VB
void send(unsigned char a)
{
if(a<10)
{
SBUF=a+48;
while(TI==0){}
TI=0;
}
if(a>9&&a<100)
{
unsigned char c=a/10;
unsigned char d=a%10;
SBUF=c+48;
while(TI==0){}
TI=0;
SBUF=d+48;
while(TI==0){}
TI=0;
}
if(a>99)
{
unsigned char t=a/100;
unsigned char c=a/10-10*t;
unsigned char d=a%10;
SBUF=t+48;
while(TI==0){}
TI=0;
SBUF=c+48;
while(TI==0){}
TI=0;
SBUF=d+48;
while(TI==0){}
TI=0;
}
}
//============================================================== NGAT NOI TIEP
void RS232(void) interrupt 4
{
unsigned char *c,count=0;
while(RI==0){}
RI=0;
*c=SBUF;
if(count==1&&*c=='1') *c='3';
if(count==1&&*c=='2') *c='4';
switch(*c)
{
case '0': //xoa man hinh LCD
{
LCD_CODE(0x01);
}
break;
//o day co the su dung ma thap phan! (ngoai tru cac ky tu dieu khien)

case '-': //lui con tro hien thi LCD 1 don vi.
{
LCD_CODE(0x10);
}
break;

case '1': //truyen len may tinh: gia tri do duoc.
{
send(P2);
}
break;

case '2': //truyen len may tinh: gia tri do duoc.
{
send(P2);
}
break;

case '9': //thoat khoi ham ngat, cho ADC làm viec.
{
TI=0; //cho phep thoat khoi ham ngat.
count=0; //ket thuc viec truyen ky tu len LCD
}
break;

default : //truyen ky tu xuong LCD ^^.
{
if(TI==0)
LCD_CODE(0x01);
LCD_DATA(*c);
TI=1; //de cho chuong trinh ko thoat khoi ham ngat,phuc vu viec truyen ky tu len LCD.
count=1; //danh dau bat dau viec truyen ky tu len LCD
}
}
}
//============================================================== MAIN
void main()
{
SetupSerial(); //Khoi tao cac thong so cho truyen thong noi tiep
LCD_INIT();
//LCD_CODE(0x80);//hien thi 2 hang : dia chi hien thi + 80
EA = 1; //Cho phep ngat nhung chi? có ngat noi tiep duoc dung trong code nay
while(1)
{
//if(P0_3==1)
{
P0_0=P0_1=P0_2=0;
WR=0; //Bat dau chuyen doi gia tri tu ADC
delay_ms(10); //Tao tre de cap nhat du lieu tu ADC
WR=1; //Ket thuc chuyen doi
RD=0; //Chot du lieu da duoc chuyen doi: P2
LCD_CODE(0x01);
LCD_putstr("Nhiet do:");
HIENTHI_ADC(P2);
LCD_STRING(" oC");
delay_ms(300);
}
}
}

Hướng dẫn sử dụng Keil-C lập trình cho 8051

Xem hình:

B1:



B2

B3:

B4:

B5:

B6:

B7:

B8:

B9:

B10:

B11:

B12:

B13:


B14:

B15:

code ASM mẫu cho 8051 - Tạo xung vuông chính xác theo tỉ lệ

Chương trình ASM tạo xung vuông 70/30 tần số 12Khz, với Thạch anh 12Mhz.
Sử dụng trình dịch Reads51, mô phỏng trên Proteus:





Mã nguồn ASM:



; ------------- READS51 generated header --------------
; module : C:\Users\Sony\Desktop\xung vuong\xung.asm
; created : 02:05:56, Sunday, February 19, 2012
; -----------------------------------------------------
#include <sfr51.inc>
org 0h
main:
MOV sp,#60h

MOV TMOD,#01H ; Chon Timer0, che do 1 (16 bit)

; Chu ky xung: 1/12K=83 us
;chu ky may: 12/12M=1 us
; => 70/30 = 58/25
; 58-8=50
; 25-10=15

HERE: SETB P0.1 ;1 Bat P0.1
MOV TL0, #0CEH ;2 byte thap;CE
MOV TH0, #0FFH ;2 byte cao
SETB TR0 ;1 Khoi dong Timer0

AGAIN1: JNB TF0, AGAIN1 ;1 Kiem tra co bo dinh thoi TF0
CLR TR0 ;1 Dung bo dinh thoi
CLR TF0 ;1 Xoa co bo dinh thoi cho vong sau


CLR P0.1 ;1 Lat P0.1
MOV TL0, #0F1H ;2 byte thap;F1
MOV TH0, #0FFH ;2 byte cao
SETB TR0 ;1 Khoi dong Timer0

AGAIN2: JNB TF0, AGAIN2 ;1 Kiem tra co bo dinh thoi TF0
CLR TR0 ;1 Dung bo dinh thoi
CLR TF0 ;1 Xoa co bo dinh thoi cho vong sau

SJMP HERE ;2

end
DBS M05479
Quang Cao