Đâ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…
/** ********************************************************** * 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++; } }
Nguồn: Sưu Tầm