Do An
Do An
2
2. Sử dụng ma trận đèn LED 4 × 8 tạo bởi các port P0, P1, P2, P3 để hiện tên của bản
thân, thời gian chuyển trạng thái của mỗi ký tự là 500ms. Mô phỏng trên proteus và kiểm
tra trên mạch phần cứng.
#include<REGX52.H>
#include<intrins.h>
#include<string.h>
#include<stdio.h>
int i;
int j,k;
int h,z,w;
int q,e;
void delay(int cnt) {
while(cnt--)
_nop_();
}
3
unsigned char code chu[][8]= {
{0xFF,0x01,0x01,0xEF,0xEF,0x01,0x01,0xFF},//H
{0xFF,0x03,0x01,0xED,0xED,0x01,0x03,0xFF},//A
{0xFF,0x01,0x01,0xEF,0xEF,0x01,0x01,0xFF},//H
{0xFF,0x81,0x01,0x7F,0x7F,0x01,0x01,0xFF},//U
{0xFF,0xF1,0xE1,0x0F,0x0F,0xE1,0xF1,0xFF},//Y
{0xFF,0x01,0x01,0xEF,0xEF,0x01,0x01,0xFF},//H
{0xFF,0x03,0x01,0xED,0xED,0x01,0x03,0xFF},//A
{0xFF,0x01,0x01,0xF3,0xE7,0xCF,0x01,0x01},//N
{0xFF,0x01,0x01,0xEF,0xEF,0x01,0x01,0xFF},//H
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//space
};
unsigned char led[][8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
char character[]={'H','A','H','U','Y','H','A','N','H',' '};
void hienChuChinhSua(unsigned char code chaychu[][8]){
for(i=0;i<8;i++){
P3=chaychu[0][i];
P2=0x80>>i;
delay(80);
P2=0;
}
}
void chay1Chu(unsigned int tocDo,unsigned int soKyTu){
for(h=0;h<8;h++){
for(z=0;z<7;z++){
led[0][z]=led[0][z+1];
}
4
led[0][7]=chu[soKyTu][h];
for(w=0;w<tocDo;w++){
hienChuChinhSua(led);
}
}
}
void quetChu(char *hienthi,unsigned int tocdo){
for(q=0;q<strlen(hienthi);q++){
for(e=0;e<sizeof(character)-1;e++){
if(hienthi[q]==character[e]){
chay1Chu(30,e);
break;
}
}
}
}
void main(){
while(1){
quetChu("HA HUY HANH",30);
}
}
5
6
BÀI 2: GIAO TIẾP VỚI MA TRẬN BÀN PHÍM VÀ MÀN HÌNH LCD 16x2
2.1. MỤC ĐÍCH
- Tìm hiểu và viết chương trình giao tiếp với keypad 4x4;
- Hiển thị trạng thái phím bấm lên LCD 16x2.
2.2. CƠ SỞ LÝ THUYẾT
2.2.1. Ma trận bàn phím
2.2.2. Làm việc với LCD 16x2
2.3. THIẾT BỊ THỰC HÀNH THÍ NGHIỆM VÀ VẬT TƯ TIÊU HAO:
2.3.1. Thiết bị thực hành thí nghiệm
- Máy tính cài đặt phần mềm MikroC for 8051.
2.4. CÁC BƯỚC TIẾN HÀNH THÍ NGHIỆM
2.4.1. Giao tiếp với ma trận phím và màn hình LCD 16x2
2.4.2. Bài tập thực hành
unsigned short kp, cnt, oldstate = 0;
char txt[6];
char keypadPort at P0;
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;
sbit LCD_D4 at P2_2_bit;
sbit LCD_D5 at P2_3_bit;
sbit LCD_D6 at P2_4_bit;
sbit LCD_D7 at P2_5_bit;
void main() {
cnt = 0;
Keypad_Init();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
7
Lcd_Out(1, 1, "Key :");
Lcd_Out(2, 1, "Times:");
do {
kp = 0;
do
kp = Keypad_Key_Click();
while (!kp);
switch (kp) {
case 1: kp = 49; break; // 1
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
case 4: kp = 65; break; // A
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
case 8: kp = 66; break; // B
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
case 12: kp = 67; break; // C
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
case 16: kp = 68; break; // D
}
if (kp != oldstate) {
cnt = 1;
oldstate = kp;
8
}
else {
cnt++;
}
Lcd_Chr(1, 10, kp);
if (cnt == 255) {
cnt = 0;
Lcd_Out(2, 10, " ");
}
WordToStr(cnt, txt);
Lcd_Out(2, 10, txt);
} while (1);}
1. Viết chương trình nhập vào một số nhị phân 4 bit và chuyển đổi số nhị phân
đó sang số hexa hiển thị lên màn hình LCD. Mô phỏng trên proteus và kiểm tra trên
mạch phần cứng.
unsigned short kp, cot=5, i,Dec,flag;
9
char bin[4];
char Hex1[6];
char Hex;
char keypadPort at P0;
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;
sbit LCD_D4 at P2_2_bit;
sbit LCD_D5 at P2_3_bit;
sbit LCD_D6 at P2_4_bit;
sbit LCD_D7 at P2_5_bit;
void main() {
Keypad_Init(); // Initialize Keypad
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1, 1, "Bin : "); // Write message text on LCD
Lcd_Out(2, 1, "Hex: ");
do {
kp = 0; // Reset key code variable
do
kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);
switch (kp) {
case 1:
kp = 49;
bin[i]=1;
i++;
10
break; // 1
case 14:
kp = 48;
bin[i]=0;
i++;
; break; // 0
case 15:
i=0;
cot=8;
break; // #
case 16:
Dec=bin[0]*8+bin[1]*4+bin[2]*2+bin[3]*1;
flag=1;
break; // D
}
if(flag==1){
switch (Dec) {
case 0:
Hex = 48;
break; // 0
case 1:
Hex = 49;
break; // 1
case 2:
Hex = 50;
break; // 2
case 3:
11
Hex = 51;
break; // 3
case 4:
Hex = 52;
break; // 4
case 5:
Hex = 53;
break; // 5
case 6:
Hex = 54;
break; // 6
case 7:
Hex = 55;
break; // 7
case 8:
Hex = 56;
break; // 8
case 9:
Hex = 57;
break; // 9
case 10:
Hex = 65;
break; // A
case 11:
Hex = 66;
break; // B
case 12:
12
Hex = 67;
break; // C
case 13:
Hex = 68;
break; // D
case 14:
Hex = 69;
break; // E
case 15:
Hex = 70;
break; // F
}
}
Lcd_Chr(2, 7, Hex);
cot++;
Lcd_Chr(1, cot, kp);
} while (1);
}
13
2. Viết chương trình nhập vào hai số hexa và tính tổng, tích của hai số hiển thị
hai số đó lên màn hình LCD. Mô phỏng trên proteus và kiểm tra trên mạch phần cứng.
unsigned short kp, cot = 5, i, Dec, flag;
char bin[4];
char Hex1[6];
char Hex;
char keypadPort at P0;
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;
sbit LCD_D4 at P2_2_bit;
sbit LCD_D5 at P2_3_bit;
sbit LCD_D6 at P2_4_bit;
sbit LCD_D7 at P2_5_bit;
unsigned short hexToDec(char hex) {
if (hex >= '0' && hex <= '9') {
return hex - '0';
} else if (hex >= 'A' && hex <= 'F') {
14
return hex - 'A' + 10;
}
return 0;
}
char decToHex(unsigned short dec) {
if (dec >= 0 && dec <= 9) {
return dec + '0';
} else if (dec >= 10 && dec <= 15) {
return dec - 10 + 'A';
}
return '0';
}
void main() {
unsigned short firstNumber = 0, secondNumber = 0, sum, product;
unsigned short inputCount = 0;
Keypad_Init(); // Initialize Keypad
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1, 1, "so1: "); // Write message text on LCD
Lcd_Out(2, 1, "So2: ");
do {
kp = 0; // Reset key code variable
do
kp = Keypad_Key_Click(); // Store key code in kp variable
while (!kp);
switch (kp) {
15
case 1:
kp = '1';
break; // 1
case 2:
kp = '2';
break; // 2
case 3:
kp = '3';
break; // 3
case 4:
kp = 'A';
break; // A
case 5:
kp = '4';
break; // 4
case 6:
kp = '5';
break; // 5
case 7:
kp = '6';
break; // 6
case 8:
kp = 'B';
break; // B
case 9:
kp = '7';
break; // 7
16
case 10:
kp = '8';
break; // 8
case 11:
kp = '9';
break; // 9
case 12:
kp = 'C';
break; // C
case 13:
kp = '*';
break; // *
case 14:
kp = '0';
break; // 0
case 15:
kp = '#';
break; // #
case 16:
kp = 'D';
break; // D
}
if (kp == '#') {
inputCount++;
cot = inputCount == 1 ? cot + 1 : cot;
} else if (inputCount == 0) {
firstNumber *=16;
17
firstNumber += hexToDec(kp);
Lcd_Chr(1, cot++, kp);
} else if (inputCount ==1) {
secondNumber *=16;
secondNumber += hexToDec(kp);
Lcd_Chr(2, cot++, kp);
}
if (inputCount ==2) {
sum = firstNumber + secondNumber;
product = firstNumber * secondNumber;
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"tong: ");
Lcd_Chr(1,6,decToHex(sum/16));
Lcd_Chr(1,7,decToHex(sum%16));
Lcd_Out(2,1,"tich: ");
Lcd_Chr(2,10,decToHex(product/256));
Lcd_Chr(2,11,decToHex((product%256)/16));
Lcd_Chr(2,12,decToHex(product%16));
}
} while (1);
}
18
BÀI 3: GIAO TIẾP VỚI CÁC ĐÈN LED 7 THANH
3.1. MỤC ĐÍCH
- Tìm hiểu về Led 7 thanh và phương pháp điều khiển;
- Lập trình ứng dụng hiển thị Led 7 thanh.
3.2. CƠ SỞ LÝ THUYẾT
3.2.1. Giới thiệu về đèn LED 7 thanh
3.3. THIẾT BỊ THỰC HÀNH THÍ NGHIỆM VÀ VẬT TƯ TIÊU HAO:
3.3.1. Thiết bị thực hành thí nghiệm
- Máy tính cài đặt phần mềm MikroC for 8051.
3.4. CÁC BƯỚC TIẾN HÀNH THÍ NGHIỆM
3.4.1. Lập trình giao tiếp với các đèn LED 7 thanh
19
3.4.2. Bài tập thực hành
1.Viết chương trình thực hiện hiển thị số có 4 chữ số lên đèn LED 7 thanh và đếm
lùi về 0000.
#include <REGX51.H>
char so[]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x89,0x06,0xC7,0x40};
char i;
int dem;
unsigned char nghin, tram, chuc, donVi;
#define led1 P2_0
#define led2 P2_1
#define led3 P2_2
#define led4 P2_3
#define sang 0
#define tat 1
void delay(int time){
while(time--);
}
void main(){
led1 = led2 = led3 = led4 = tat;
while(1){
for (dem=100;dem>=0;dem--){
nghin = dem/1000;
tram = (dem%1000)/100;
chuc = ((dem%1000)%100)/10;
donVi = ((dem%1000)%100)%10;
20
for (i=0 ;i<=3;i++){
led1 =sang;
P0 = so[nghin];
delay(1000);
led1 = tat;
led2 = sang;
P0 = so[tram];
delay(1000);
led2 = tat;
led3 =sang;
P0 = so[chuc];
delay(1000);
led3 = tat;
led4 = sang;
P0 = so[donVi];
delay(1000);
led4 = tat;
}
}
}
}
21
2. Xây dựng đồng hồ hiển thị giờ và phút lên 04 LED 7 thanh. Mô phỏng trên
proteus và kiểm tra trên mạch phần cứng.
#include <REGX51.H>
#define LED_PORT P0
unsigned char gio, phut;
#define led1 P2_0
#define led2 P2_1
#define led3 P2_2
#define led4 P2_3
#define sang 0
#define tat 1
unsigned char code Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90};
22
void main()
{
unsigned char gio, phut;
unsigned char chuc, dvi;
unsigned char i;
while(1)
{
for(i=0;i<166;i++)
{
// Hien thi gio
chuc = gio/10;
dvi = gio%10;
LED_PORT = Code7Seg[chuc];
led1 = 0;
delay(1);
led1 = 1;
LED_PORT = Code7Seg[dvi];
led2 = 0;
delay(1);
led2 = 1;
23
LED_PORT = Code7Seg[chuc];
led3 = 0;
delay(1);
led3 = 1;
LED_PORT = Code7Seg[dvi];
led4 = 0;
delay(1);
led4 = 1;
}
{
phut++;
if(phut==60)
{
phut = 0;
gio++;
if(gio == 24)
{
gio = 0;
}
}
}
}
}
24
25
BÀI 4: GIAO TIẾP VỚI CẢM BIẾN NHIỆT ĐỘ
4.1. MỤC ĐÍCH
- Tìm hiểu cảm biến nhiệt độ DS1820;
- Lập trình ứng dụng đo và hiển thị nhiệt độ lên LCD.
4.2. CƠ SỞ LÝ THUYẾT
4.2.1. Cảm biến nhiệt độ DS1820
4.3. THIẾT BỊ THỰC HÀNH THÍ NGHIỆM VÀ VẬT TƯ TIÊU HAO:
4.3.1. Thiết bị thực hành thí nghiệm
- Máy tính cài đặt phần mềm MikroC for 8051.
4.4. CÁC BƯỚC TIẾN HÀNH THÍ NGHIỆM
4.4.1. Lập trình giao tiếp với cảm biến nhiệt độ DS1820
4.4.2. Bài tập thực hành
1.Viết lại chương trình trên đổi nhiệt độ C -> F và ngược lại. Mô phỏng trên proteus và
kiểm tra trên mạch phần cứng.
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;
sbit LCD_D4 at P2_2_bit;
sbit LCD_D5 at P2_3_bit;
sbit LCD_D6 at P2_4_bit;
sbit LCD_D7 at P2_5_bit;
sbit OW_Bit at P1_2_bit;
const unsigned short TEMP_RESOLUTION = 9;
char *text = ".0";
unsigned temp;
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
26
char temp_whole;
unsigned int temp_fraction;
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
}
temp_whole = temp2write >> RES_SHIFT;
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';
text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
text[2] = temp_whole%10 + 48; // Extract ones digit
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
text[4] = temp_fraction/1000 + 48; // Extract thousands digit
text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
text[7] = temp_fraction%10 + 48; // Extract ones digit
Lcd_Out(2, 5, text);
}
void main() {
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, " NHIET DO : ");
27
Lcd_Out(2, 1, " 26 do F");
delay_ms(2000);
Lcd_Chr(2,13,223); // different LCD displays have different char code for
Lcd_Chr(2,14,'F');
do {
Display_Temperature(temp);
P3=0XFF;
Delay_ms(500);
} while (1);
}
2. Hiển thị nhiệt độ đo được từ cảm biến DS1820 lên các đèn LED 7 thanh. Mô phỏng
trên proteus và kiểm tra trên mạch phần cứng.
#include<REGX52.H>
28
#define DS18B20_READ_SCRATCH_PAD 0xBE
unsigned char
code7seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
time=time*25;
while(time--){;}
load_value=65536-t;
TH0=load_value>>8;
TL0=load_value&0x00FF;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;
DS18B20_PIN=0;
T0_Delay_us(480);
DS18B20_PIN=1;
T0_Delay_us(70);
result=DS18B20_PIN;
T0_Delay_us(410);
return result;
void DS18B20_Write1()
DS18B20_PIN=0;
T0_Delay_us(6);
DS18B20_PIN=1;
T0_Delay_us(64);
void DS18B20_Write0()
DS18B20_PIN=0;
T0_Delay_us(60);
30
DS18B20_PIN=1;
T0_Delay_us(10);
if(b==1)
DS18B20_Write1();
else
DS18B20_Write0();
DS18B20_PIN=0;
T0_Delay_us(6);
DS18B20_PIN=1;
31
T0_Delay_us(9);
result= DS18B20_PIN;
T0_Delay_us(55);
return result;
while(i--)
b>>=1;
unsigned DS18B20_Read_Byte()
while(i--)
result >>=1;
result|= (DS18B20_Read_Bit()<<7);
32
}
return result;
void main()
TMOD|= 0x01;
while(1)
while (DS18B20_Reset());
DS18B20_Write_Byte(DS18B20_SKIP_ROM);
DS18B20_Write_Byte(DS18B20_CONVERT_T);
Delay_ms(750);
while(DS18B20_Reset());
DS18B20_Write_Byte(DS18B20_SKIP_ROM);
DS18B20_Write_Byte(DS18B20_READ_SCRATCH_PAD);
temp= DS18B20_Read_Byte();
temp= (DS18B20_Read_Byte()<<8)|temp;
int_part=temp>>4;
chuc= int_part/10;
Dv= int_part%10;
33
decimal_part=temp&0x000F;
decimal_part=decimal_part*10/16;
P0=code7seg[chuc];
P2=code7seg[Dv];
P3=code7seg[decimal_part];
34
35