Tổng hợp các Code chương trình mẫu 8051, 89S, STM

Đây là những dòng code họ VĐK 8051 được sưu tầm từ nhiều nguồn, nhiều tác giả khác nhau. Nó có thể giúp các chúng ta rất nhiều trong lúc bắt đầu học, hoặc sau một thời gian chúng ta bắt đầu lại thì đây là nguồn code tham khảo rất hay. Và các bạn học các loại VĐK khác cũng có thể tham khảo.

Code chương trình tạo trễ (Delay)

Đây là một 2 chương trình con tạo trễ, để sử dụng các chương trình này nó cần được gọi đến trong chương trình chính, và truyền vào nó một tham số chính là thời gian trễ, với chương trình con delay_ms thời gian tính bằng ms; chương trình delay_us thời gian tính bằng us.

/* -------------------------------------------------
Đoạn chương trình con tạo trễ
1. delay_ms: Chương trình tạo trễ tính bằng ms (1s = 1000ms)
2. delay_us Chương trình tạo trễ tính bằng us (1s = 1000.000us)
-------------------------------------------------- */
#include <main.h>

void delay_ms(unsigned int Time)
{
  unsigned int i,j,t;
  t=Time;
  for(i=0;i<t;i++)
  {
    for(j=0;j<125;j++);
  }
}
void delay_us(unsigned int Time)
{
  unsigned int i,j;
  for(i=0;i<Time;i++)
  {
    for(j=0;j<2;j++);
  }
}

Hiển thị Led 7 thanh

/**
  * Ten Tep:		  Led7.c
  * Tac Gia:	  	Nguyen Quy Nhat
  * Tom Tat:     Dinh nghia cac ham dieu khien man hinh led 7.							 
  */		
	
#include "led7.h"

static unsigned char chu_so[10]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};	
//Ma Hien Thi		0	1	2	3	4	5	6	7	8	9
static unsigned char buffer_led[4];		

//---------------------------------------------------
// Ham chuyen doi gia tri so dua vao
// Tach cac chu so hang tram nghin, hang chuc nghin... dua vao mang buffer_led[8]
//---------------------------------------------------
void LED7_ChuyenDoi(unsigned long int number)
{
		unsigned char i,j;
		unsigned long int temp;
		for(i=3;i>0;i--)
		{
			temp=1;
			for(j=i;j>0;j--)
			{
					temp*=10;
			}
			buffer_led[3-i]=chu_so[number/temp];	
			number=number%temp;
		}
		buffer_led[3]=chu_so[number];
}

//---------------------------------------------------
// Ham cho phep hien thi tung LED 
//---------------------------------------------------
void LED7_OnLed(unsigned char addr)
{
	PORT_DATA=0xff;
	PORT_DATA=buffer_led[addr];
	PORT_ADDR=~(0x01<<addr);
}

//---------------------------------------------------
// Ham hien thi Number ra LED 7 thanh 4 so
//---------------------------------------------------
void LED7_Display(unsigned long int number)
{

		unsigned char i=4;
		LED7_ChuyenDoi(number);
		while(i!=0)
		{	
			LED7_OnLed(--i);			
			delay_ms(3);	
	}
}

Đọc bàn phím 4×4

/**
  ******************************************************************************
  * Ten Tep		:		  MTP4x4.c
  * Tac Gia		:	  	LE ANH QUANG
  * Tom Tat   :     Dinh nghia cach thuc su dung trong ham MTP4x4.
  *           
  *
  */
	
#include <main.h>

// Ban phim trong mo phong protues
static unsigned char code KEYS_PAD[4][4] ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};   

unsigned char mtp_quetphim()
{	
	unsigned char r,c;
	P1=0x0f;																		
	delay_us(2);
	
	if((P1&0x0f)!=0x0f)										// Kiem tra xem co phim bat ky nao duoc bam hay khong?
	{	
		delay_us(100);											// Chong nhieu 
		if((P1&0x0f)!=0x0f)									// Neu dung c� phim duoc bam: Bat dau qua trinh quet phim
		{
			for(c=0;c<4;c++)									// Quet theo cot
			{
				P1=~(0x01<<(4+c));							// Lan luot keo cac cot xuong muc logic 0
				delay_ms(1);
				for(r=0;r<4;r++)								// Kiem tra cac hang
				{
						if((P1&(0x01<<r))==0)				// Neu hang nao co muc logic 0
						{
							while((P1&0x0f)!=0x0f);		// Cho den khi nut bam duoc tha ra
							return KEYS_PAD[r][c];		// Tra ve ma phim da duoc bam
						}
				}
			}
		}
	}
	return 0;														// Neu khong co phim nao duoc nhan: Tra ve gia tri 0
}

// ------------------END OF FILE--------------------
// -------------------------------------------------

Điều khiển timer

#include "timer.h"
void delay_timer_500us(void)
{
		TL0=0x33;		
		TH0=0xfe;	
		TF0=0;
		TR0=1;
		while(!TF0);
		TR0=0;
		TF0=0;
}

void delay_timer_200us(void)
{
		TL0=0x48;		
		TH0=0xff;	
		TF0=0;
		TR0=1;
		while(!TF0);
		TR0=0;
		TF0=0;
}

void delay_timer_750us(void)
{
		TL0=0x4d;		
		TH0=0xfd;	
		TF0=0;
		TR0=1;
		while(!TF0);
		TR0=0;
		TF0=0;
}

uint8_t INFR_CheckStart()
{
	uint8_t i;
	if(INFR_DATA==0)             
    {
        delay_timer_500us();           
        if(INFR_DATA==0)         
        {       
            for(i=0;i<40;i++)   
            {
                delay_timer_200us();
                if(INFR_DATA==1) return 0;    
            } 
            while(INFR_DATA==1);               
          // return 1;            
        }  
				
    } 
		return 1;  
}


uint16_t INFR_GetCode(void)
{
		uint8_t i;
    uint16_t data_infr=0;
    if(INFR_CheckStart())             // Neu dung xung START
    {
        while(INFR_DATA==0);          // Cho het bit 0 tiep theo
        for(i=0;i<24;i++)             // Lay 24 bit du lieu (bao gom 8 bit 0 va 8 bit 1 dau tien sau xung start)
        {    
            delay_timer_750us();            // Delay 750us de kiem tra bit
            data_infr=data_infr<<1;
            if(INFR_DATA==0) data_infr|=1;
            while(INFR_DATA==1);      // cho canh len
            while(INFR_DATA==0);     
        }
        delay_ms(600);                // Cho het tin hieu (chong nhieu) 
    }
		return data_infr;
}

Cảm Biến Nhiệt Độ DS18B20

DS18B20 là cảm biến số dùng đo nhiệt độ mới của hãng MAXIM với độ phân giải 12bit. Cảm biến giao tiếp với chip 8051 sử dụng 1 dây rất gọn gàng, dễ lập trình. Cảm biến còn có chức năng cảnh báo nhiệt độ khi vượt ngưỡng và đặc biệt hơn là có thể cấp nguồn từ chân data  (parasite power). Ứng dụng kiểm soát nhiệt môi trường, đo nhiệt độ bên trong các tòa nhà, thiết bị, máy móc, và  trong hệ thống giám sát…

READ  Cách nhận biết các khối chức năng nguồn xung bằng hình ảnh
Cảm Biến Nhiệt Độ DS18B20
  /**
  **********************************************************
  * Ten Tep		:		  ds18b20.c
  * Tom Tat   :     Dinh nghia cac ham xu ly DS18b20
  *           
  **********************************************************
  */
  
#include <main.h>

static bit presence;
//-------------------------------------------------
// Ham khoi tao DS18b20
//-------------------------------------------------
bit DS18B20_Init()
{
     DQ = 1 ;      
     delay_us(8);   
     DQ = 0 ;     
     delay_us(90) ;   
     DQ = 1 ;       
     delay_us(8) ;
     presence = DQ ;    
     delay_us(100) ;
     DQ = 1 ;
     return(presence) ; 
}

//-------------------------------------------------
// Ham doc 1 byte tu DS18b20 ra ngoai
//-------------------------------------------------
unsigned char ds18b20_readbyte(void)
{
unsigned char i = 0 ;
unsigned char Data = 0 ;
for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ;
    Data >>= 1 ;
    DQ = 1 ; 
    if(DQ)
     Data |= 0x80 ;
    delay_us(4) ;
  }
  return (Data) ;
}

//-------------------------------------------------
// Ham viet 1 byte vao DS18b20
//-------------------------------------------------
void ds18b20_writebyte(unsigned char Data)
{
  unsigned char i = 0 ;
  for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ;
    DQ = Data&0x01 ;
    delay_us(5) ;
    DQ = 1 ;
    Data>>=1 ;
  }
}

//-------------------------------------------------
// Ham chuyen doi va tra ve gia tri nhiet do do duoc
//-------------------------------------------------
float ds18b20_readtemp(void)
{
      float temp;
      unsigned char a,b;
      DS18B20_Init();				// Khoi tao DS18b20
      ds18b20_writebyte(0xCC) ;  		// Cho phep VDK truy cap thang den cac lenh bo nho cua DS18b20
      ds18b20_writebyte(0x44) ; 		// Khoi dong qua trinh do va chuyen doi nhiet do ra so nhi phan
      DS18B20_Init() ;
      ds18b20_writebyte(0xCC) ;  
      ds18b20_writebyte(0xBE) ;			// Cho phep doc du lieu tu bo nho DS18b20 ra ngoai
  
      a = ds18b20_readbyte(); 
      temp=((float)(a&0x0f))/16;		// Lay phan thuc cua gia tri nhiet do
      b = ds18b20_readbyte(); 				
      a =((a&0xf0)>>4)|((b&0x0f)<<4) ;	// Lay phan nguyen cua gia tri nhiet do
      temp=temp+a;
      return temp;				// Tra ve gia tri nhiet do
}

// ------------------END OF FILE--------------------
// -------------------------------------------------

Chương trình con điều khiển giao tiếp với LCD 128×64 mode 8 bit

/*******************************************************************
  *	@file 		glcd.c
  * @brief  	File cac ham de dieu khien LCD 128x64 mode 8 bit
********************************************************************/
#include "main.h"

void lcd_enable()
{
	LCD_E = 1;
	delay_us(50);
	LCD_E = 0;
	delay_us(30);
}
// ==============================================

void write_data_lcd(unsigned char WDLCD)
{
	delay_us(200);						// LUU Y SU CAN THIET CUA KHOANG THOI GIAN DELAY NAY 
	LCD_RS = 1;
	LCD_RW = 0;
	LCD_Data = WDLCD;
	lcd_enable();
}

// ==============================================

void write_command_lcd(unsigned char WCLCD) 
{
	delay_us(200);						// LUU Y SU CAN THIET CUA KHOANG THOI GIAN DELAY NAY 
	LCD_RS = 0;
	LCD_RW = 0; 
	LCD_Data = WCLCD;
	lcd_enable();
}

// ===============================================
	
// HAM KHOI TAO LCD ------------------------------
// MODE 8 bit -----------------------------------
void lcd_init(void)
{
	// Function set
	write_command_lcd(0x30); 					// Chon che do truyen 8 bit
	delay_us(150);											// delay > 100us
	write_command_lcd(0x30); 					// Chon che do truyen 8 bit
	delay_us(50);												// delay > 37us
	
	// Display ON/OFF control
	write_command_lcd(0x0C); 					// Cho phep hien thi ra LCD 128x64
	delay_us(120);											// delay > 100us
	
	// Clear LCD
	write_command_lcd(0x01); 					// Xoa man hinh			
	delay_ms(40);												// delay > 10ms
	
	// Entry mode set
	write_command_lcd(0x06); 					// Chon che do hien thi ki tu ra man hinh LCD 128x64 (Ki tu sau xuat hien ben phai ki tu truoc)
}
// ===============================================

void lcd_clear(void) 
{
	write_command_lcd(0x01);
}

// ===============================================
void lcd_putchar(unsigned char X, unsigned char Y, unsigned char DData)
{
	if(Y<1)
		Y=1;
	if(Y>4)
		Y=4;
	X &= 0x0F; 
	switch(Y)
	{
		case 1:X|=0X80;break;
		case 2:X|=0X90;break;
		case 3:X|=0X88;break;
		case 4:X|=0X98;break;
	}
	write_command_lcd(X); 
	write_data_lcd(DData);
}
// ================================================
void lcd_puts(unsigned char X, unsigned char Y, unsigned char *DData)
{
	unsigned char ListLength,X2;

	ListLength = 0;
	X2=X;
	if(Y<1)
		Y=1;
	if(Y>4)
		Y=4;
	X &= 0x0F; 
	switch(Y)
	{
		case 1:X2|=0X80;break;	
		case 2:X2|=0X90;break;
		case 3:X2|=0X88;break;
		case 4:X2|=0X98;break;
	}
	write_command_lcd(X2); 
	while (DData[ListLength]>=0x20) 
	{
		if (X <= 0x0F) 
		{
			write_data_lcd(DData[ListLength]);
			ListLength++;
			X++;
			delay_ms(5);
		}
	}
}
// ==============================================
void lcd_display_image  (unsigned char *DData)
{
	unsigned char x,y,i;
	unsigned int tmp=0;
	for(i=0;i<9;)
	{		
		for(x=0;x<32;x++)
		{				
			write_command_lcd(0x34);
			write_command_lcd((0x80+x));
			write_command_lcd((0x80+i));	
			write_command_lcd(0x30);		
			for(y=0;y<16;y++)	
				write_data_lcd(DData[tmp+y]);
			tmp+=16;		
		}
		i+=8;
	}
		write_command_lcd(0x36);	
		write_command_lcd(0x30);
}
*/
/* -----------------END OF FILE---------------------------- */

Đọc dữ liệu từ bàn phím

#include "key.h"
unsigned int get_key(void)
{
    KEY0=KEY1=KEY2=KEY3=1;
    if(!KEY0)
    {
        delay_ms(10);
        if(!KEY0)
        return 1;
    }
    if(!KEY1)
    {
        delay_ms(10);
        if(!KEY1)
        return 2;
    }
    if(!KEY2)
    {
        delay_ms(10);
        if(!KEY2)
        return 3;
    }
    if(!KEY3)
    {
        delay_ms(10);
        if(!KEY3)
        return 4;
    }
    return 0;
}

Giáo tiếp với LCD 16×2

/**
  ******************************************************************************
  * Ten Tep:		  Lcd1602.c
  * Tac Gia:	  	LE ANH QUANG
  * Tom Tat:     Dinh nghia cac ham dieu khien LCD1602.							 
  ******************************************************************************
  */
	
#include <main.h>

// Ham Khoi Tao LCD
 void lcd1602_enable(void)
{
	LCD_E=1;	
	delay_us(3);	 	
	LCD_E=0;
	delay_us(5); 	
}
// --------------------------------------------------
// Ham Gui 4 Bit Du Lieu Ra LCD
 void lcd1602_send_4bit_data ( unsigned char cX )
{
 LCD_D4 = cX & 0x01; 
 LCD_D5 = (cX>>1)&1;
 LCD_D6 = (cX>>2)&1;
 LCD_D7 = (cX>>3)&1;
}

// --------------------------------------------------
// Ham Gui 1 Lenh Cho LCD
 void lcd1602_send_command (unsigned char cX )
{
	lcd1602_send_4bit_data  ( cX >>4 );    	// send 4 bit high  
	lcd1602_enable() ;
	lcd1602_send_4bit_data ( cX  );		 			// send 4 bit low  
	lcd1602_enable() ;
}

// --------------------------------------------------
// Ham Khoi Tao LCD
 void lcd1602_init ( void )
{
	lcd1602_send_4bit_data ( 0x00 );
	delay_ms(200);
	
	LCD_RS=0;	
	LCD_RW=0;
	LCD_E=0;																	// che do gui lenh
	
	lcd1602_send_4bit_data ( 0x03 );          // ket noi 8 bit
	lcd1602_enable() ;
	lcd1602_enable () ;
	lcd1602_enable () ;
	lcd1602_send_4bit_data ( 0x02 );     	 		// ket noi 4 bit
	lcd1602_enable() ;
	
	lcd1602_send_command( 0x2C );     				// giao thuc 4 bit, hien thi 2 hang, ki tu 5x8
	lcd1602_send_command( 0x80);
	lcd1602_send_command( 0x0C); 							// cho phep hien thi man hinh
	lcd1602_send_command( 0x06 );     			 	// tang ID, khong dich khung hinh
	lcd1602_send_command( CLEAR_LCD );      	// xoa toan bo khung hinh
}

// --------------------------------------------------
// Ham Thiet Lap Vi Tri Con Tro
void lcd1602_gotoxy(unsigned char x, unsigned char y)
{
  unsigned char address;
  if(!y)
  address = (LINE_1+x);
  else
  address = (LINE_2+x);
  delay_ms(3);
  lcd1602_send_command(address);
  delay_ms(1);
}

// --------------------------------------------------
// Ham Xoa Man Hinh LCD
void lcd1602_clear(void)
{
	lcd1602_send_command( CLEAR_LCD );  
  //delay_us(300);
}

// --------------------------------------------------
// Ham Gui 1 Ky Tu Len LCD
 void lcd1602_putchar ( unsigned int cX )
{
	LCD_RS=1;	
	lcd1602_send_command( cX );
  LCD_RS=0;
}

// --------------------------------------------------
// Ham Gui 1 Chuoi Ky Tu Len LCD
void lcd1602_puts(char *s)
{
   while (*s)
   {
			lcd1602_putchar(*s);
      s++;
   }
}
// ------------------END OF FILE--------------------
// -------------------------------------------------

Giao tiếp URT

#include "uart.h"
static unsigned char tran_busy;
void UART_Init(void)
{
	#ifdef UART_USE_TIMER1
	TMOD&=0x0f;
	TMOD |= 0x20;  //Timer 1 mode 2.
	TL1 = 0xFD; 			
	TH1 = 0xFD; 	// baud rate =9600    		  
	TR1 = 1;
	#endif
	#ifdef UART_USE_TIMER2
	RCLK=1;
	TCLK=1;	//Timer 2: Baud Rate Generator
	RCAP2L  = 0xDC;  //Baud Rate 9600
	RCAP2H  = 0xFF;	//Baud Rate 9600
	TR2=1;
	#endif
	ES = 1;       // Kich hoat ngat UART.
	IP = 0x10;    // Thiet lap muc uu tien cho ngat UART. 
	SCON = 0x50;  // Chon che do UART mode 1.
	PCON=PCON&(~(0x80));//khong nhan doi toc do baud.	
}
void UART_PutChar(unsigned char c)
{
	tran_busy = 1; 
	SBUF = c; 
	while(tran_busy); 
}
unsigned char UART_GetChar(void)
{	
	unsigned char temp=0;
	if(RI==1)
	{
		RI=0;
		temp=SBUF;
	}
	return temp;
}

void Ngat_Uart(void) interrupt 4
{
	if(TI==1)
		{
			TI=0;
			tran_busy=0;
		}
}
void UART_Puts(unsigned char *s)
{
	while (*s)
   {
      UART_PutChar(*s);
      s++;
   }
}