Tải bản đầy đủ (.docx) (22 trang)

BÀI TẬP HỆ THỐNG NHÚNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (100.27 KB, 22 trang )

Tài liệu đính kèm file code KeilC và mơ phỏng proteus
1.Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình
thực hiện các nhiệm vụ sau: a. Hiển thị số 8 lên LED 7 thanh được nối và cổng P3
(dùng LED 7 thanh anot chung); b. Hiển thị đếm tăng dần từ 0 đến 9 sau mỗi
800ms.
2.Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình
thực hiện các nhiệm vụ sau: a. Cấu hình ngắt ngồi INT1 ở chế độ ngắt sườn
xuống; b. Đếm số lần nút bấm nút được nối vào chân INT1, hiển thị kết quả lên
LED 7 thanh nối vào cổng P2 (nếu số lần bấm bằng 10 thì quay về 0).
3. Sử dụng vi điều khiển AT89C52, mơ phỏng trên phần mềm Proteus và lập trình
thực hiện các nhiệm vụ sau: a. Hiển thị số 1 lên LED 7 thanh nối vào cổng P3; b.
Tăng số đếm sau mỗi 800ms, nếu số đếm bằng 5 thì dừng lại.
4. Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình
thực hiện các nhiệm vụ sau: a. Cấu hình ngắt ngồi INT0 ở chế độ ngắt sườn
xuống; b. Đếm số lần nút bấm nút nối vào chân INT0 được bấm, hiển thị kết quả
lên LED 7 thanh nối vào cổng P0 (nếu số lần bấm bằng 7 thì quay về 0).
5. Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus cho 3 nút bấm
B1, B2, B3 lần lượt nối vào các chân P2.0, P2.1, P2.2. và 3 Led L1, L2, L3 lần lượt
nối vào các chân P0.0, P0.1, P0.2. Lập trình chức năng sau: bấm B1 sẽ đảo trạng
thái Led L1, bấm B2 sẽ đảo trạng thái Led L2, bấm B3 sẽ đảo trạng thái Led L3.
6.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối với
LCD. Sử dụng ngắt ngoài chân INT1 đếm số lần thay đổi trạng thái của một nút
bấm gắn vào nó. Hiển thị số lần bấm nút lên LCD, khi số lần bấm đạt 9 lần thì hiển
thị trên LCD “Return to 0” sau đó reset số lần đếm về 0 và lặp lại quá trình trên.
7.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ cho nút bấm B1 nối vào các P1.0 và 8
Led L1, L2, L3, L4, L5, L6, L7, L8 lần lượt nối vào các chân của PORT P0. Vẽ sơ
đồ mơ phỏng trên Proteus và lập trình chức năng sau: bấm giữ B1 sẽ sáng nhấp
nháy các Led từ L1 đến L8 với khoảng thời gian 1 giây.
8. Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mơ phỏng trên Proteus sử dụng ngắt
ngồi chân INT0 đếm số lần thay đổi trạng thái của một nút bấm gắn vào nó. Hiển
thị số lần bấm nút lên UART, khi số lần bấm đạt 9 lần thì hiển thị trên UART “Họ


tên SV” sau đó reset số lần đếm về 0. 2

1


9.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus kết nối theo
thứ tự 8 Led L1 đến L8 vào 8 chân của PORT P0. Lập trình hiệu ứng các Led sáng
lần lượt từ L1 đến L8 với thời gian trễ cho mỗi hiệu ứng là 1s, sau đó tắt tất cả các
Led và lặp lại hiệu ứng sáng lần lượt.
10.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối với
LCD theo chế độ 4bit, hiển thị họ tên, mã số sinh viên lên LCD.
11.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng Led L1 kết nối đến chân
P1.1, lập trình nhấp nháy Led L1 với chu kỳ 500ms sử dụng timer 0 chế độ 16 bit.
12.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối với
LCD. Cho số A=0 viết chương trình hiển thị số A lên LCD, tăng A một đơn vị sau
mỗi chu kỳ 500ms, khi A=20 thì hiện tên sinh viên lên LCD và reset A=0.
13. Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mơ phỏng trên Proteus, lập trình
hiển thị ký tự “PROTEUS” qua chuẩn truyền thông UART;
14.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ, viết chương trình tạo hiệu ứng nhấp
nháy 2 Led nối đến chân P1.1, P1.2 tuần tự với chu kỳ 800ms.
Bài làm
1.Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình
thực hiện các nhiệm vụ sau: a. Hiển thị số 8 lên LED 7 thanh được nối và cổng P3
(dùng LED 7 thanh anot chung); b. Hiển thị đếm tăng dần từ 0 đến 9 sau mỗi
800ms.
#include <regx52.h>
#define LED_PORT P3
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,
0xF8, 0x80, 0x90};
void main()

{
while(1)
{
LED_PORT = Code7Seg[8];
}
}
Bai1.b
#include <regx52.h>
#define LED_PORT P3
2


/* 0 1 2 3 4 5 6 7 8 9 */
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,
0xF8, 0x80, 0x90};
void Delay(int time);
void tangdan();
void main()
{
while(1)
{
tangdan();
}
}
void Delay(int time)
{
int i,j;
for(i=0; ifor(j=0; j<123; j++);
}

void tangdan(unsigned int i)
{
for (i=0; i<10; i++)
{
LED_PORT = Code7Seg[i];
Delay(800);
}
}
2.Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình
thực hiện các nhiệm vụ sau: a. Cấu hình ngắt ngồi INT1 ở chế độ ngắt sườn
xuống; b. Đếm số lần nút bấm nút được nối vào chân INT1, hiển thị kết quả lên
LED 7 thanh nối vào cổng P2 (nếu số lần bấm bằng 10 thì quay về 0).
#include <regx52.h>
#define LED_PORT P2
sbit button = P3^3;
void delay(int time) {
int i, j;
for (i = 0; i < time; i++)
3


for (j = 0; j < 123; j++);
}
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,
0xF8, 0x80, 0x90};
void main() {
EA = 1;
EX1 = 1;
IT1 = 1;
while (1) {

}
}
void externalInterruptHandler() interrupt 2 {
unsigned char k = 0;
while (1) {
if (button == 0) {
delay(100);
if (button == 0) {
k++;
delay(100);
if (k > 9) {
k = 0;
}
LED_PORT = Code7Seg[k];
}
}
}
}
3. Sử dụng vi điều khiển AT89C52, mô phỏng trên phần mềm Proteus và lập trình
thực hiện các nhiệm vụ sau: a. Hiển thị số 1 lên LED 7 thanh nối vào cổng P3; b.
Tăng số đếm sau mỗi 800ms, nếu số đếm bằng 5 thì dừng lại.
#include <regx52.h>
#define LED_PORT P3
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,
0xF8, 0x80, 0x90};
void main()
{
4



while(1)
{
LED_PORT = Code7Seg[1];
}
}
Bai3.b
#include <regx52.h>
#define LED_PORT P3
/* 0 1 2 3 4 5 6 7 8 9 */
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,
0xF8, 0x80, 0x90};
void Delay(int time);
void main() {
unsigned int i = 0;
while (1) {
if (i == 6) {
break;
//continue;
}
LED_PORT = Code7Seg[i];
Delay(800);
i++;
}
}
void Delay(int time) {
int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 123; j++);
}
4. Sử dụng vi điều khiển AT89C52, mơ phỏng trên phần mềm Proteus và lập trình

thực hiện các nhiệm vụ sau: a. Cấu hình ngắt ngồi INT0 ở chế độ ngắt sườn
xuống; b. Đếm số lần nút bấm nút nối vào chân INT0 được bấm, hiển thị kết quả
lên LED 7 thanh nối vào cổng P0 (nếu số lần bấm bằng 7 thì quay về 0).
#include <regx52.h>

5


#define LED_PORT P0
sbit button = P3^2;
void delay(int time) {
int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 123; j++);
}
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82,
0xF8, 0x80, 0x90};
void main() {
EA = 1;
// Cho phép các ngat toàn cuc
EX0 = 1;
// Cho phép ngat ngoài INT0 chan 3.2
IT0 = 1;
// Chon che do ngat suon xuong
while (1) {
}
}
void externalInterruptHandler() interrupt 0 {
unsigned char k = 0;
while (1) {

if (button == 0) {
delay(100);
if (button == 0) {
k++;
delay(100);
if (k > 6) {
k = 0;
}
LED_PORT = Code7Seg[k];
}
}
}
}

6


5. Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus cho 3 nút
bấm B1, B2, B3 lần lượt nối vào các chân P2.0, P2.1, P2.2. và 3 Led L1, L2, L3
lần lượt nối vào các chân P0.0, P0.1, P0.2. Lập trình chức năng sau: bấm B1 sẽ
đảo trạng thái Led L1, bấm B2 sẽ đảo trạng thái Led L2, bấm B3 sẽ đảo trạng
thái Led L3.
#include <regx52.h>
sbit B1 = P2^0;
sbit B2 = P2^1;
sbit B3 = P2^2;
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
void delay(int time) {

int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 123; j++);
}
void main() {
while (1) {
if (B1 == 0) {
delay(50);
if (B1 == 0) {
L1 = ~L1;
while (B1 == 0);
}
}
if (B2 == 0) {
delay(50);
if (B2 == 0) {
L2 = ~L2;
while (B2 == 0);
}
}
7


if (B3 == 0) {
delay(50);
if (B3 == 0) {
L3 = ~L3;
while (B3 == 0);
}
}

}
}
6.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối
với LCD. Sử dụng ngắt ngoài chân INT1 đếm số lần thay đổi trạng thái của một
nút bấm gắn vào nó. Hiển thị số lần bấm nút lên LCD, khi số lần bấm đạt 9 lần
thì hiển thị trên LCD “Return to 0” sau đó reset số lần đếm về 0 và lặp lại quá
trình trên.
#include <reg52.h> // Thu vien cho AT89C52
#define LCD_data P2 // Dinh nghia cong du lieu LCD la P2
sbit RS = P3^0; // Dinh nghia chan RS cua LCD
sbit RW = P3^1; // Dinh nghia chan RW cua LCD
sbit EN = P3^2; // Dinh nghia chan EN cua LCD
sbit BT = P3^3; // Dinh nghia chan INT1 cho nut nhan
unsigned char count = 0; // Bien dem so lan nhan nut
void delay(int time)
{
int i,j;
for(i=0; ifor(j=0; j<123; j++);
}
void LCD_cmd(unsigned char cmd) // Ham gui lenh den LCD
{
LCD_data = cmd; // Gan lenh vao cong du lieu LCD
RS = 0; // Che do gui lenh
RW = 0; // Che do ghi
EN = 1; // Bat dau gui lenh
delay(1);
8



EN = 0; // Ket thuc gui lenh
delay(1);
}
void LCD_init() // Ham khoi tao LCD
{
LCD_cmd(0x38); // Che do 8 bit, 2 dong, 5x7
LCD_cmd(0x0E); // Hien thi man hinh, con tro, khong nhap nhay
LCD_cmd(0x01); // Xoa man hinh
LCD_cmd(0x80); // Di chuyen con tro den vi tri ban dau
}
void LCD_char(unsigned char dataa) // Ham gui ky tu den LCD
{
LCD_data = dataa; // Gan ky tu vao cong du lieu LCD
RS = 1; // Che do gui du lieu
RW = 0; // Che do ghi
EN = 1; // Bat dau gui du lieu
delay(1);
EN = 0; // Ket thuc gui du lieu
delay(1);
}
void LCD_string(unsigned char *str) // Ham gui chuoi den LCD
{
while (*str) // Trong khi chuoi chua ket thuc
LCD_char(*str++); // Gui ky tu tiep theo
}
void BT_ISR() interrupt 2 // Trinh phuc vu ngat INT1
{
count++; // Tang bien dem
if (count > 9) // Neu so lan nhan nut dat 9
{

LCD_cmd(0x01); // Xoa man hinh
delay(1000);
LCD_string("Return to 0"); // Hien thi "Return to 0"
count = 0; // Dat lai bien dem
}
else // Neu so lan nhan nut chua dat 9
9


{
LCD_cmd(0x01); // Xoa man hinh
delay(1000);
if (count == 1) {
LCD_char('1'); // Hien thi so lan nhan nut
} else {
LCD_char(count + '0'); // Hien thi so lan nhan nut
}
}
}
void main()
{
LCD_init(); // Khoi tao LCD
IT1 = 1; // Cai dat ngat ngoai INT1 o che do ngat canh xuong
EX1 = 1; // Kich hoat ngat ngoai INT1
EA = 1; // Kich hoat ngat toan cuc
while (1); // Vong lap vo han
}
7.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ cho nút bấm B1 nối vào các P1.0
và 8 Led L1, L2, L3, L4, L5, L6, L7, L8 lần lượt nối vào các chân của PORT
P0. Vẽ sơ đồ mô phỏng trên Proteus và lập trình chức năng sau: bấm giữ B1 sẽ

sáng nhấp nháy các Led từ L1 đến L8 với khoảng thời gian 1 giây.
#include <reg52.h>
sbit Button = P1^0;
sbit LED = P0;
char so[] ={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
int i, j;
void Delay(time);
void main() {
while (1) {
if (Button == 0) {
if (Button == 0) {
for (i = 0; i < 8; i++) {
P0 = so[i];
Delay(1000);
10


if (Button == 1) {
P0 = 0xFF;
break;
}
}
}
}
}
}
void Delay(int time)
{
int i,j;
for(i=0; i

for(j=0; j<123; j++);
}
8. Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mơ phỏng trên Proteus sử dụng
ngắt ngồi chân INT0 đếm số lần thay đổi trạng thái của một nút bấm gắn vào
nó. Hiển thị số lần bấm nút lên UART, khi số lần bấm đạt 9 lần thì hiển thị trên
UART “Họ tên SV” sau đó reset số lần đếm về 0. 2
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P3^2; // Dinh nghia bien key la chan P3.2, la chan nut nhan
uchar count = 0; // Bien dem so lan nhan nut
void delay(int time);
void InitUART(void)
{
SCON = 0x50; // Cau hinh UART, che do 1
TMOD = 0x20; // Che do timer 1, tu dong nap lai
TH1 = 0xFD; // Toc do baud 9600
TL1 = 0xFD;
TR1 = 1;
// Khoi dong timer 1
11


}
void UART_send_byte(uchar dat)
{
SBUF = dat; // Gui du lieu
while (!TI); // Cho cho den khi gui xong
TI = 0;
// Reset lai co TI

}
void UART_send_string(uchar *s)
{
while (*s)
{
UART_send_byte(*s); // Gui tung ky tu cua chuoi
s++;
// Chuyen sang ky tu tiep theo
}
}
void main()
{
InitUART(); // Khoi tao UART
IT0 = 1;
// Cau hinh ngat ngoai INT0 voi canh xuong
EX0 = 1;
// Cho phep ngat ngoai INT0
EA = 1;
// Cho phep ngat toan cuc
while (1)
{
if (count == 9) // Neu so lan nhan dat 9 lan
{
UART_send_string(" PHAN CHI CONG "); // Hien thi "PHAN CHI
CONG" tren UART
count = 0; // Reset lai bien dem
}
// Them mot do tre nho de tranh vong lap chay qua nhanh
delay(100);
}

}
void INT0_Handler() interrupt 0 // Ham xu ly ngat ngoai INT0
12


{
delay(100); // Chong nhieu
if (!key) // Neu nut bam duoc nhan
{
count++; // Tang bien dem
UART_send_byte(count +'0'); // Hien thi so lan nhan nut len UART
}
}
void delay(int time)
{
int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 123; j++);
}
9.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus kết nối theo
thứ tự 8 Led L1 đến L8 vào 8 chân của PORT P0. Lập trình hiệu ứng các Led
sáng lần lượt từ L1 đến L8 với thời gian trễ cho mỗi hiệu ứng là 1s, sau đó tắt
tất cả các Led và lặp lại hiệu ứng sáng lần lượt.
#include <reg52.h>
sbit LED = P0;
char so[] ={0xff, 0xfe, 0xfc, 0xf8, 0xf0,0xe0,0xc0,0x80, 0x00};
int i;
void Delay(int time);
void main() {
while (1) {

for (i = 0; i < 9; i++) {
P0 = so[i];
Delay(100);
P0 = 0xFF;
}
}
}
13


void Delay(int time) {
int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 123; j++);
}
10.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối
với LCD theo chế độ 4bit, hiển thị họ tên, mã số sinh viên lên LCD.
#include <REGX52.H>
// Khai bao ham thu vien
// Khai bao chan giao tiep cho den nhap nhay khi su dung
#define LED_FLASH P1_0
// Khai bao chan giao tiep cho LCD
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_EN P2_2
#define LCD_D4 P2_4
#define LCD_D5 P2_5
#define LCD_D6 P2_6
#define LCD_D7 P2_7
void delay(unsigned int t) // Ham tao tre voi thoi gian lon

{
unsigned int i, j;
for (i = 0; i < t; i++)
{
for (j = 0; j < 125; j++)
{
}
}
}
// Cac ham dieu khien LCD
void LCD_Enable(void)
{
14


LCD_EN = 1;
delay(3);
LCD_EN = 0;
delay(50);
}
void LCD_Send4Bit(unsigned char Data) // Ham gui 4 Bit du lieu ra LCD
{
LCD_D4 = Data & 0x01;
LCD_D5 = (Data >> 1) & 1;
LCD_D6 = (Data >> 2) & 1;
LCD_D7 = (Data >> 3) & 1;
}
// Ham gui 1 lenh ra LCD
void LCD_SendCommand(unsigned char command)
{

LCD_Send4Bit(command >> 4); // Gui 4 bit cao
LCD_Enable();
LCD_Send4Bit(command); // Gui 4 bit thap
LCD_Enable();
}
void LCD_Clear() // Ham xoa man hinh LCD
{
LCD_SendCommand(0x01);
delay(10);
}
void LCD_Init() // Ham Khoi Tao LCD
{
LCD_Send4Bit(0x00);
delay(20);
LCD_RS = 0;
LCD_RW = 0;
LCD_Send4Bit(0x03);
LCD_Enable();
delay(5);
LCD_Enable();
delay(100);
15


LCD_Enable();
LCD_Send4Bit(0x02);
LCD_Enable();
LCD_SendCommand(0x28); // Giao thuc 4 bit, hien thi 2 hang, ki tu 5x8
LCD_SendCommand(0x0c); // Cho phep hien thi man hinh
LCD_SendCommand(0x06); // Tang ID, khong dich khung hinh

LCD_SendCommand(0x01); // Xoa toan bo khung hinh
}
void LCD_Gotoxy(unsigned char x, unsigned char y)
{
unsigned char address;
if (!y)
address = (0x80 + x);
else
address = (0xc0 + x);
delay(100);
LCD_SendCommand(address);
delay(50);
}
void LCD_PutChar(unsigned char Data) // Ham gui 1 ky tu
{
LCD_RS = 1;
LCD_SendCommand(Data);
LCD_RS = 0;
}
void LCD_Puts(char *s) // Ham gui 1 chuoi ky tu
{
while (*s)
{
LCD_PutChar(*s);
s++;
}
}
void main()
{
LCD_Init();


// Khoi tao LCD
16


delay(1000);
LCD_Gotoxy(3, 0); // Vi tri 3 hang tren
LCD_Puts("AAAAAAAAA"); // Hien thi ten
delay(100);
LCD_Gotoxy(1, 1); // Vi tri 5 hang duoi
LCD_Puts("111111111111111"); // Hien thi MSSV
while (1)
{}
}
11.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng Led L1 kết nối đến
chân P1.1, lập trình nhấp nháy Led L1 với chu kỳ 500ms sử dụng timer 0 chế
độ 16 bit.
#include<REGX52.h>
void Timer_init();
sbit LED1 = P1^1;
unsigned char dem=0;
int main()
{
EA = 1;
ET0 = 1;
Timer_init();
while(1)
{
if(dem==10)
{

LED1 = ~LED1;
dem=0;
}
}
}
void Timer_init()
{
TMOD = 0x01;
TH0 = 0x4B;
TL0 = 0xFD;
TR0 = 1;
}
17


void Timer0_ISR() interrupt 1
{
dem=dem+1;
TH0 = 0x4B;
TL0 = 0xFD;
}
12.Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus ghép nối
với LCD. Cho số A=0 viết chương trình hiển thị số A lên LCD, tăng A một đơn
vị sau mỗi chu kỳ 500ms, khi A=20 thì hiện tên sinh viên lên LCD và reset
A=0.
#include <reg52.h>
#define LCD_data P2
sbit RS = P3^0;
sbit RW = P3^1;
sbit EN = P3^2;

void delay_ms(unsigned int time)
{
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 123; j++);
}
void LCD_cmd(unsigned char cmd)
{
LCD_data = cmd;
RS = 0;
RW = 0;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
}
void LCD_init()
18


{
LCD_cmd(0x38);
LCD_cmd(0x0E);
LCD_cmd(0x01);
LCD_cmd(0x80);
}
void LCD_char(unsigned char dataa)
{
LCD_data = dataa;
RS = 1;

RW = 0;
EN = 1;
delay_ms(1);
EN = 0;
delay_ms(1);
}
void LCD_string(unsigned char *str)
{
while (*str)
LCD_char(*str++);
}
void main()
{
unsigned char a = 0;
unsigned char name[] = "Student Name";
unsigned char i;
LCD_init();
while (1)
{
LCD_cmd(0x80); // Di chuyen con tro ve dau dong 1
LCD_string("A=");
LCD_char(a / 10 + '0'); // Display the tens digit as a character
LCD_char(a % 10 + '0'); // Display the ones digit as a character
delay_ms(500); // Thay d?i delay thành 500ms
a++;
if (a == 21)
{
19



LCD_cmd(0x80); // Di chuyen con tro ve dau dong 1
LCD_string(name);
delay_ms(500); // Delay 2s
LCD_cmd(0x01);
delay_ms(500); // Delay 2s
a = 0;
}
}
}
13. Sử dụng vi điều khiển AT89C52, vẽ sơ đồ mô phỏng trên Proteus, lập trình
hiển thị ký tự “PROTEUS” qua chuẩn truyền thông UART;
#include <REGX51.H>
void delay(long time)
{
time = time * 25;
while(time--) {}
}
void Uart_Init()
{
// Khoi tao UART o mode 1, 9600 baud
SM0 = 0; SM1 = 1;
// Chon UART mode 1
TMOD = 0x20;
// 0010 xxxx - Timer1 hoat dong o che do 8bit
tu dong nap lai
TH1 = 0xFD;
// Toc do baud 9600
TR1 = 1;
// Timer1 bat dau chay
TI = 1;

// San sang gui du lieu
REN = 1;
// Cho phep nhan du lieu
}
void Uart_Write_Char(char c)
{
while(TI == 0);
TI = 0;
SBUF = c;
20



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×