You are on page 1of 54

MỤC LỤC

ĐỀ 1 ............................................................................................................................................................... 2
Cách 1 ........................................................................................................................................................ 2
Cách 2 ........................................................................................................................................................ 4
ĐỀ 2 ............................................................................................................................................................... 6
ĐỀ 3 ............................................................................................................................................................. 11
ĐỀ 4 ............................................................................................................................................................. 15
ĐỀ 5 ............................................................................................................................................................. 18
ĐỀ 6 ............................................................................................................................................................. 22
ĐỀ 7 ............................................................................................................................................................. 26
ĐỀ 8 ............................................................................................................................................................. 31
ĐỀ 9 ............................................................................................................................................................. 33
ĐỀ 10 ........................................................................................................................................................... 39
ĐỀ 11 ........................................................................................................................................................... 41
Cách 1 ...................................................................................................................................................... 41
Cách 2 ...................................................................................................................................................... 43
ĐỀ 12 ........................................................................................................................................................... 46
LÝ THUYẾT ................................................................................................................................................... 50
Đề 1: ........................................................................................................................................................ 50
Vài trò của xung nhịp đồng hồ cấp cho VXL ? ..................................................................................... 50
Đề 2: ........................................................................................................................................................ 50
Bus địa chỉ, bus dữ liệu và bus điều khiển giống và khác nhau ở chỗ nào ?....................................... 50
Đề 3 ......................................................................................................................................................... 50
Thế nào là bộ nhớ dữ liệu, bộ nhớ chương trình, thanh ghi ?............................................................ 50
Đề 4: ........................................................................................................................................................ 51
Khối thực hiện lệnh tác động vào các khối chức năng nào trong VXL ? ............................................. 51
Đề 5: ........................................................................................................................................................ 51
Ngắt là gì ? Nguyên tắc gọi và hoạt động của hàm ngắt ? .................................................................. 51
Đề 6 ......................................................................................................................................................... 51
Bộ đệm dữ liệu 1 chiều và 2 chiều có chức năng gì ? ......................................................................... 51
Đề 7 ......................................................................................................................................................... 51

1
Ngăn xếp là gì ? Ngăn xếp hoạt động như thế nào ? .......................................................................... 51
Đề 8 ......................................................................................................................................................... 52
Một chương trình trong VXL được thực hiện như thế nào, vài trò của bộ đếm chương trình ? ....... 52
Đề 9: ........................................................................................................................................................ 52
Mô tả sự hoạt động của 1 chương trình có sử dụng gọi chương trình con ? Vai trò của con trỏ ngăn
xếp và bộ nhớ ngăn xếp ? ................................................................................................................... 52
Đề 10: ...................................................................................................................................................... 53
Phân loại và mô tả vai trò, nhiệm vụ của từng loại BUS trong VXL ? Với vi xử lý loại 8 bit sẽ có BUS
dữ liệu 8 bit và BUS địa chỉ 16 bit có được không, tại sao ? ............................................................... 53
Đề 11: Giống đề 9.................................................................................................................................... 53
Đề 12: Giống đề 10.................................................................................................................................. 53

ĐỀ 1
*** Thiết kế sơ đồ phần cứng ghép nối 4 LED đơn với vi điều khiển. Viết chương trình thực hiện
đồng thời việc sau
- Nháy sáng lần lượt các led với tần số 0,5HZ, hết 1 vòng 4 LED nháy theo chiều ngược lại
- Tạo 1 xung vuông 10kHZ tại chân RC0 (50%)
Cách 1
#include <16f877a.h>
#use delay (clock = 20M)

2
#int_timer0
void XungKhz()
{
set_timer0(194); output_toggle(pin_C0);
}
void battat ()
{
output_high(PIN_B0); delay_ms(1000); output_low(PIN_B0);
output_high(PIN_B1); delay_ms(1000); output_low(PIN_B1);
output_high(PIN_B2); delay_ms(1000); output_low(PIN_B2);
output_high(PIN_B3); delay_ms(1000); output_low(PIN_B3);
output_high(PIN_B3); delay_ms(1000); output_low(PIN_B3);
output_high(PIN_B2); delay_ms(1000); output_low(PIN_B2);
output_high(PIN_B1); delay_ms(1000); output_low(PIN_B1);
output_high(PIN_B0); delay_ms(1000); output_low(PIN_B0);
}
Void main()
{
Set_tris_b(0x00);
Setup_timer_0(T0_INTERNAL|T0_DIV_4);
Enable_interrupts(int_timer0);
Enable_interrupts(global);
While(true)
{
battat();
}}

3
Cách 2
#include <pic.h>
#include <pic16f877a.h>
#define _XTAL_FREQ 20000000
unsigned int count = 0,i ,j ;
void init_time2()
{
TMR2=230;
T2CON=0B00000100;
TMR2IE=1; //bat co ngat tu TMR2 den PR2
TMR2IF=0;
GIE=1; //ngat toan cuc
PEIE=1; //ngat cuc bo ON
}
void __interrupt() count_up(void)
{

4
if(TMR2IF)
{
TMR2IF=0;
j++;
if(j>20)
j=0;
if(j>=0&&j<=10)
RC0=1;
else if(j>=10&&j<=20)
RC0=0;
}
}
void thuanghich()
{
PORTD=0x00;
for(i=0;i<4;i++){
PORTD = 0X01<<i;
__delay_ms(100);
}
PORTD=0x00;
for(i=0;i<4;i++){
PORTD = 0X08>>i;
__delay_ms(100);
}
}
void main()
{

5
init_time2();
TRISC=0X00;
TRISD=0X00;
PORTD=0X00;
unsigned char d;
while(1)
{
thuanghich();
}
}

ĐỀ 2
***Thiết kế sơ đồ phần cứng ghép nối 16 led đơn với vi điều khiển được ghép thành 1 hàng.
Viết chương trình thực hiện đồng thời các việc sau

6
- Bật sáng lần lượt các led từ 2 đầu hàng tiến vào giữa cách nhau 0.5s, sau đso các led tắt
lần lượt từ trái qua phải, cách nhau 1s. Lặp lại quá trình trên vô hạn
- Tạo một xung vuông với tần số 20Khz tại chân RD3 sử dụng ngắt timer ( thời gian tồn tại
xung là 50%)

#include <pic.h>
#define _XTAL_FREQ 20000000
void delay_timer0_5ms(unsigned int time)
{
while (time--) //l?p l?i time l?n 5ms.
{
OPTION_REGbits.T0CS = 0; //Dùng xung n?i
OPTION_REGbits.PSA = 0; //Dùng b? chia timer0
//chon bo chia 1:128
OPTION_REGbits.PS2 = 1;
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS0 = 0; //Ch?n b? chia 1:128
TMR0 = 60; //??t giá tr? cho TMR0
while(!INTCONbits.TMR0IF); //??i c? tràn
INTCONbits.TMR0IF = 0; //Xóa c? tràn
}
}
void show1()
{
char i;
PORTC=0X00;
PORTD=0X00;
for(i=0;i<8;i++){

7
PORTC =0X01<<i;
PORTD =0X80>>i;
delay_timer0_5ms(5);
}
}
void show2()
{
char i;
for(i=0;i<8;i++)
{
PORTC=0X01<<i;
delay_timer0_5ms(10);
}
}
void show3()
{
char i;
for(i=0;i<8;i++)
{
PORTD=0X01<<i;
delay_timer0_5ms(10);
}
}
unsigned int count=0;
void __interrupt() timer2 (void)
{
if(TMR2IF)

8
{
TMR2IF=0;
count++;
if(count<=5)
{
RB0 = 1;
}
else if(count>5&&count<=10)
{
RB0 = 0;
}
if(count > 10){
count = 0;
}
}
TMR2IE=1;//bat co ngat
TMR2IF=0;
TMR2=230;
// PR2=230;
}
void timer2_init(){
TMR2=230;
T2CON=0B00000100;
TMR2IE=1; //bat co ngat tu TMR2 den PR2
TMR2IF=0;
GIE=1; //ngat toan cuc
PEIE=1;

9
}
void main(void) {
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
PORTD=0X00;
PORTC=0X00;
PORTB=0X00;
timer2_init();
while(1)
{
show1();
PORTC=0X00;
PORTD=0X00;
show2();
PORTC=0X00;
PORTD=0X00;
show3();
PORTC=0X00;
PORTD=0X00;
}
}

10
ĐỀ 3
*** Sơ đồ phần cứng ghép nối 4 LED 7 thanh và 1 phím bấm với vi điều khiển
- Khi phím được bấm thì hiển thị đếm tăng dần 0 đến 9999 với khoảng cách 1 giây.
Khi phím không bấm thì số hiển thị không tăng
- Tạo một xung vuông tần số 10KHz tại chân RC7 sử dụng ngắt timer

#include <pic.h>

#define _XTAL_FREQ 20000000

#define SW RC2

unsigned int count = 0;

#define Xung RC7

void __interrupt() timer2 (void)

if(TMR2IF)

TMR2IE=0;

11
count++;

if(count<=5)

Xung = 1;

else if(count>5&&count<=10)

Xung = 0;

if(count == 11){

count = 0;

}}

TMR2IE=1;//bat co ngat

TMR2IF=0;

TMR2=230;

// PR2=250;

void delay_timer0_5ms(unsigned int time)

while (time--) //l?p l?i time l?n 5ms.

OPTION_REGbits.T0CS = 0; //Dùng xung n?i

OPTION_REGbits.PSA = 0; //Dùng b? chia timer0

//chon bo chia 1:128

12
OPTION_REGbits.PS2 = 1;

OPTION_REGbits.PS1 = 1;

OPTION_REGbits.PS0 = 0; //Ch?n b? chia 1:128

TMR0 = 60; //??t giá tr? cho TMR0

while(!INTCONbits.TMR0IF); //??i c? tràn

INTCONbits.TMR0IF = 0; //Xóa c? tràn

}}

void hienthi(unsigned int s)

unsigned int s1,s2,a,b,c,d;

const unsigned char MALED[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,0x92, 0x82,0xF8, 0x80, 0x90};

a=(s/1000);

b=(s%1000)/100;

c=(s%100)/10;

d=s%10;

for(int i=0;i<20;i++)

PORTDbits.RD0=0; PORTB = MALED[a];

delay_timer0_5ms(2); PORTDbits.RD0=1;

PORTDbits.RD1=0; PORTB = MALED[b];

delay_timer0_5ms(1); PORTDbits.RD1=1;

PORTDbits.RD2=0; PORTB = MALED[c];

delay_timer0_5ms(2); PORTDbits.RD2=1;

PORTDbits.RD3=0; PORTB = MALED[d];

13
delay_timer0_5ms(1); PORTDbits.RD3=1;

}}

void timer2_init(){

INTCONbits.GIE=1;// ngat toan cuc

INTCONbits.PEIE=1;//cho phep ngat hoat dong

T2CON=0B00000100;//1:8

PIE1bits.TMR2IE=1;//bat co ngat tu TMR2-PR2

PIR1bits.TMR2IF=0;//co bao ngat

TMR2=230;}

void main(void) {

timer2_init();

TRISB = 0x00;

TRISD = 0x00;

TRISCbits.TRISC2 = 1;

TRISCbits.TRISC7 = 0;

PORTB = 0x00;

PORTD = 0x00;

unsigned int d = 0;

while(1)

if(SW == 0){

d++;

if(d>9999)

14
{ d=0; }

hienthi(d);

} }

ĐỀ 4
***Thiết kế phần cứng ghép nối UART với vi điều khiển. Viết chương trình thực hiện đồng thời
việc sau
- Tạo xung vuông có chu kì 3ms và thời gian tồn tại xung 1ms tại RA0 sử dụng ngắt timer
- Gửi chuỗi ký tự “ reading” qua cổng UART với chu kì 2s, tốc độ baudrete là 1920 b/s
#include <xc.h>
#define _XTAL_FREQ 20000000
#define SBIT_PS2 2
#define Xung RA0
unsigned int count = 0,count1 = 0;
void timer0_init(){
OPTION_REG = (1<<SBIT_PS2);
TMR0=100; TMR0IE=1; GIE=1; PEIE=1;

15
}
char UART_Init(const long int tocdo)
{
unsigned int x;
x = (_XTAL_FREQ - tocdo*64)/(tocdo*64);
if(x>255)
{
x = (_XTAL_FREQ - tocdo*16)/(tocdo*16);
BRGH = 1;
}
if(x<256)
{
SPBRG = x;
SYNC = 0; //chon che do khong dong bo
SPEN = 1; // cho phep truyen thong
TRISC7 = 1; TRISC6 = 1;
CREN = 1; //cho phep nhan bit lien tuc
TXEN = 1; //cho phep truyen
PIR1bits.RCIF = 1; //Ngat tran nhan du lieu
PIR1bits.TXIF = 1; //Ngat tran truyen du lieuu
INTCONbits.PEIE = 1; //cho phep ngat ngoai vi
INTCONbits.GIE = 1; //cho phep ngat toan cuc.
return 1;
}
return 0;
}
void truyen_kt(char kt)

16
{
while(!TRMT);
TXREG = kt;
}
//viet mot chuoi
void truyen_chuoi(char *txt)
{
int i;
for(i=0;txt[i]!='\0';i++)
truyen_kt(txt[i]);
}
//Tao ngat voi do tre la 1ms
void __interrupt() timer0(){
if(TMR0IF == 1)
{
TMR0 = 101; TMR0IF = 0;
count++;
count1++;
if(count <= 1)
{ Xung = 0;}
else if(count >1 && count < 4)
{Xung = 1;}
if(count == 4)
{count = 0;}
if(count1 == 2000){
//Gui chuoi voi chu ki 2s = 1ms * 2000 = 2000ms
truyen_chuoi("Reading");

17
count1 = 0;
}}}
void main(void) {
TRISD = 0x00; TRISB = 0x00; TRISA=0x00;
TRISCbits.TRISC6 = 0;//output(TX)
TRISCbits.TRISC7 = 1;//input(RX)
PORTD = 0x00; PORTB = 0x00;
timer0_init(); UART_Init(19200);
while(1){
}}

ĐỀ 5
*** - 2 led 7 thanh sáng từ 0 đến 99 vs nhịp 0,3s, giảm về 0 với nhịp 1s rồi lặp lại
- Điều khiển led đơn bằng nút ấn với cơ chế khi ấn nút thì led sáng, nhả thì tắt
#include <xc.h>
#define _XTAL_FREQ 20000000
#define SBIT_T2CKPS1 1

18
#define sw RC0
#define LED RC1
unsigned int count = 0,count1 = 0, dem = 0;
unsigned int a,b;
unsigned int checktang = 1,checkgiam = 0,check = 0;
const unsigned char MALED[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,0x92, 0x82,0xF8, 0x80, 0x90};
void timer2_init(){
T2CON = (1<<SBIT_T2CKPS1);
TMR2=225; //Khoi tao gia tri bat dau de tao tre 100us
TMR2IE=1;
GIE=1;
PEIE=1;
TMR2ON = 1;
}
//tao ham ngat timer2 100us = 0.1ms
void __interrupt() timer2(){
if(TMR2IF == 1){
TMR2 = 226;
TMR2IF = 0;
count++;
count1++;
if(sw == 0){
if(count1 >= 5000){
LED = 1;
count1 = 0;
check = 1;
}

19
}
if(sw == 1 && check == 1){
LED = 0;
check = 0;
}
}
}
void demtang(unsigned int dem){
unsigned int a,b,c;
a = (dem/100);
b = (dem%100)/10;
}
void main(void) {
TRISB = 0x00;
TRISD = 0x00;
TRISCbits.TRISC0 = 1;
TRISCbits.TRISC1 = 0;
LED = 0;
PORTD = 0x00;
PORTB = 0x00;
timer2_init();
while(1)
{
a=dem/10;
b=dem%10;
PORTDbits.RD0=0; PORTB = MALED[a];
__delay_ms(5); PORTDbits.RD0=1;

20
PORTDbits.RD1=0; PORTB = MALED[b];
__delay_ms(5); PORTDbits.RD1=1;
if(count >= 3000&&checktang == 1){ //3000*100us = 300ms = 0.3s
dem++;
if(dem == 99){
checktang = 0;
checkgiam = 1;
}
count = 0;
}
if(count >= 10000 && checkgiam == 1){ //10000 * 100us = 1s
dem--;
if(dem == 0){
checktang = 1;
checkgiam = 0;
}
count = 0;
}}}

21
ĐỀ 6
*** xây dựng sơ đồ và lập trình vi xử lý thực hiện các nhiệm vụ
- Khi 01 ấn phím đầu vào thì lập tức truyền dữ liệu UART
0x66 0x01 0x03 0x11 0x67
- Nhận và lưu vào mảng 5 byte dữ liệu từ vi xử lí khác qua cổng UART.

#include <pic.h>
#define sw RB0
#define _XTAL_FREQ 20000000
unsigned char b[] = {0x66,0x01,0x03,0x11,0x67};
char UART_Init(const long int baudrate)
{
unsigned int x;
x = (_XTAL_FREQ - baudrate*64)/(baudrate*64);
if(x>255)

22
{
x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
BRGH = 1;
}
if(x<256)
{
SPBRG = x;
SYNC = 0; //chon che do khong dong bo
SPEN = 1; // cho phep truyen thong
TRISC7 = 1;
TRISC6 = 1;
CREN = 1; //cho phep nhan bit lien tuc
TXEN = 1; //cho phep truyen
return 1;
}
return 0;
}
// kiem tra du lieu truyen(tra ve 1 neu du lieu da co con tra ve 0 neu rong)
char UART_TX_Empty()
{
return TRMT;
}
//Kiem tra du lieu nhan duoc hay khogn
char UART_Data_Ready()
{
return RCIF;
}

23
//Doc mot ki tu,doi den khi nhan du 8 bit tu ben gui
char UART_Read()
{
while(!RCIF);
return RCREG;
}
//Doc mot chuoi
void UART_Read_Text(char *Output, unsigned int length)
{
int i;
for(int i=0;i<length;i++)
Output[i] = UART_Read();
}
//viet mot ki tu
void UART_Write(char data)
{
while(!TRMT);
TXREG = data;
}
//viet mot chuoi
void UART_Write_Text(char *text)
{
int i;
for(i=0;text[i]!='\0';i++)
UART_Write(text[i]);
}
void truyen_mang(){

24
for(int i = 0;i<5;i++){
UART_Write(b[i]);
__delay_ms(100);
}}
void nhan_mang(){
for(int i = 0;i<5;i++){
if(UART_Data_Ready()){
b[i] = UART_Read();
__delay_ms(100);
}}}
void main(void) {
TRISB = 0xff;
TRISCbits.TRISC6 = 0;//output(TX)
TRISCbits.TRISC7 = 1;//input(RX)
UART_Init(19200);
while(1){
if(sw == 0){
__delay_ms(15);
if(sw == 1){
truyen_mang();
}}}}

25
ĐỀ 7
*** Xây dựng sơ đồ và lập trình vi điều khiển thực hiện đồng thời nhiệm vụ
- Sáng lần lượt các led từ 1 đến 3 với chu kì 0,1s , sau đó nhấp nháy 3 lần cả 3 led vs chu kì
0,5s. Lặp lại quá trình trên
- Cứ 0,8s truyền ký tự “Blink LED” qua cổng UART vs tốc độ 4800 b/s

#include <xc.h>
#define _XTAL_FREQ 20000000
unsigned char dem = 0;
unsigned int count = 0,count1 = 0;
unsigned char LED[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
char UART_Init(const long int tocdo)
{
unsigned int x;

26
x = (_XTAL_FREQ - tocdo*64)/(tocdo*64);
if(x>255)
{
x = (_XTAL_FREQ - tocdo*16)/(tocdo*16);
BRGH = 1;
}
if(x<256)
{
SPBRG = x;
SYNC = 0; //chon che do khong dong bo
SPEN = 1; // cho phep truyen thong
TRISC7 = 1;
TRISC6 = 1;
CREN = 1; //cho phep nhan bit lien tuc
TXEN = 1; //cho phep truyen
PIR1bits.RCIF = 1; //Ngat tran nhan du lieu
PIR1bits.TXIF = 1; //Ngat tran truyen du lieuu
INTCONbits.PEIE = 1; //cho phep ngat ngoai vi
INTCONbits.GIE = 1; //cho phep ngat toan cuc.
return 1;
}
return 0;
}

void truyen_kt(char kt)


{
while(!TRMT);

27
TXREG = kt;
}

//viet mot chuoi


void truyen_chuoi(char *txt)
{
int i;
for(i=0;txt[i]!='\0';i++)
truyen_kt(txt[i]);
}

void timer0_init(){
INTCONbits.GIE = 1;//kich hoat ngat toan cuc
INTCONbits.PEIE = 1;//Kich hoat ngat ngoai vi
INTCONbits.TMR0IE = 1;//kich hoat ngat dong tran TMR0
INTCONbits.TMR0IF = 0;//co ngat tran TMR0
OPTION_REGbits.T0CS = 0;//Chon chu ki lenh noi bo(CLKO)
OPTION_REGbits.T0SE = 0;//
OPTION_REGbits.PSA = 0;//Presale duoc gan cho modul timer0
//Chon bo chia 1:256
OPTION_REGbits.PS0 = 1;
OPTION_REGbits.PS1 = 1;
OPTION_REGbits.PS2 = 1;

}
void __interrupt() timer0(){
if(TMR0IF){

28
TMR0 = 101;
TMR0IF = 0;
count1++;
count++;
if(count == 50 && dem != 6){
PORTD = LED[dem];
dem++;
count = 0;
}
if(dem == 6){
if(count <= 250 ){
PORTD = 0x00;
}
else if(count >= 500 && count <= 750){
PORTD = 0x00;
}
else if(count >= 1000 && count <= 1250){
PORTD = 0x00;
}
else if(count == 1500){
count = 0;
dem = 0;
}
else{
PORTD = 0xff;
}
}

29
if(count1 == 600){
truyen_chuoi("Blink LED");
count1 = 0;
}
}
}
void main(void) {
TRISD = 0x00;
TRISCbits.TRISC6 = 0;//output(TX)
TRISCbits.TRISC7 = 1;//input(RX)
PORTD = 0xff;
timer0_init();
UART_Init(4800);
while(1){

}
}

30
ĐỀ 8
*** Xây dựng sơ đồ và lập trình vi điều khiển thực hiện đồng thời các việc sau
- Nhận và lưu 1 bit dữ liệu từ 1 vxl khác, khi ấn 1 phím sẽ truyền bít dữ liệu đã lưu. Quá
trình nhận và truyền sử dụng cổng UART với tốc độ 2400b/s
- Liên tục tạo xung vuông tần số 1khz thời gian tồn tại xung là 0,2ms trên 1 cổng ra của
VXL
T=1/f =1 / 1*10^3= 1 ms
1 1
Có (period +1)*𝑓𝑜𝑐𝑠 *4*prescale=𝑓 𝑥𝑢𝑛𝑔
1 1
(period +1)* 8∗10^6*4*16=1∗10^3

 Period = 124
𝑣𝑎𝑙𝑢𝑒
Có =0.2 / 1 = 1/ 5
𝑝𝑒𝑟𝑖𝑜𝑑+1

31
 Value =25
Code 1
#include<16f877a.h>
#use delay(clock=8M)
#use rs232(baud=2400,xmit=Pin_C6,rcv=Pin_C7)
void main()
{
setup_timer_2(T2_DIV_BY_16,124,1);
setup_ccp1(ccp_pwm);
set_pwm1_duty(25);
while(1)
{
if(!input (Pin_b0))
{
delay_ms(3);
if(input(Pin_b0))
puts("A");
}}}
Code 2
#include<16f877a.h>
#use delay(clock=8M)
#use rs232(baud=2400,xmit=Pin_C6,rcv=Pin_C7)
char c;
void main()
{
while(1)
{ if(kbhit())

32
{
c=getchar();
}}}

ĐỀ 9
***Xây dựng sơ đồ ghép nối gồm 1 led 7 thanh và 1 ma trận phím 2x2 thực hiện đồng thời việc
sau
- Hiển thị thứ tự các phím trên led 7 thanh khi bấm phím tương ứng
- Truyền thông qua cổng UART tốc độ truyền 4800 b/s ký tự có mã tương ứng
#include <pic.h>
#define _XTAL_FREQ 20000000
#define r1 RB0
#define r2 RB1
#define c1 RB4
#define c2 RB5
unsigned char LED7[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
char quet(void);
char UART_Init(const long int baudrate)

33
{
unsigned int x;
x = (_XTAL_FREQ - baudrate*64)/(baudrate*64);
if(x>255)
{
x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
BRGH = 1;
}
if(x<256)
{
SPBRG = x;
SYNC = 0; //chon che do khong dong bo
SPEN = 1; // cho phep truyen thong
TRISC7 = 1;
TRISC6 = 1;
CREN = 1; //cho phep nhan bit lien tuc
TXEN = 1; //cho phep truyen
return 1;
}
return 0;
}

// kiem tra du lieu truyen(tra ve 1 neu du lieu da co con tra ve 0 neu rong)
char UART_TX_Empty()
{
return TRMT;
}

34
//Kiem tra du lieu nhan duoc hay khogn
char UART_Data_Ready()
{
return RCIF;
}
//Doc mot ki tu,doi den khi nhan du 8 bit tu ben gui
char UART_Read()
{
while(!RCIF);
return RCREG;
}
//Doc mot chuoi
void UART_Read_Text(char *Output, unsigned int length)
{
int i;
for(int i=0;i<length;i++)
Output[i] = UART_Read();
}
//viet mot ki tu
void UART_Write(char data)
{
while(!TRMT);
TXREG = data;
}
//viet mot chuoi
void UART_Write_Text(char *text)
{

35
int i;
for(i=0;text[i]!='\0';i++)
UART_Write(text[i]);
}
void keypad_init(){
PORTB = 0x00;
TRISB = 0xf0;
OPTION_REG &= 0x7F; //Bat che do keo len tren portb
}
char key(){
char k = 'n';
while(k == 'n')
k = quet();
return k;
}
char quet(){
r1 = 0; r2 = 1;
if(c1 == 0){
__delay_ms(100);
while(c1 == 0);
return '1';
}
if(c2 == 0){
__delay_ms(100);
while(c2 == 0);
return '2';
}

36
r1 = 1; r2 = 0;
if(c1 == 0){
__delay_ms(100);
while(c1 == 0);
return '3';
}
if(c2 == 0){
__delay_ms(100);
while(c2 == 0);
return '4';
}
return 'n';
}
void main(void) {
TRISD = 0x00;
PORTD = 0x00;
PORTD = LED7[0];
UART_Init(4800);
keypad_init();
char k = 'n';
while(1){
k = key();
switch(k){
case '1':
PORTD = LED7[1];
UART_Write(1+0x30);
break;

37
case '2':
PORTD = LED7[2];
UART_Write(2+0x30);
break;
case '3':
PORTD = LED7[3];
UART_Write(3+0x30);
break;
case '4':
PORTD = LED7[4];
UART_Write(4+0x30);
break;
}
}
}

38
ĐỀ 10
- *** Khi nhấn phím led sáng ngay, khi nhả phím sau 2s led tắt
- Tạo xung vs f=2khz, xung lên 0.1ms

#include<pic.h>
#define _XTAL_FREQ 20000000
unsigned int count = 0,i ,j ;
void init_time2()
{
TMR2=230;// TMR2 de ho tro????
T2CON=0B00000100;
TMR2IE=1; //bat co ngat tu TMR2 den PR2
TMR2IF=0;
GIE=1; //ngat toan cuc
PEIE=1; //ngat cuc bo ON
}
void __interrupt() count_up(void)
{
if(TMR2IF)
{
TMR2IF=0;
j++;
if(j>100)
j=0;
if(j>=0&&j<=20)
RB1=1;
else if(j>=20&&j<=100)
RB1=0;

39
}
}
void main()
{
TRISB1=0;
TRISB0=1;
TRISD=0x00;
init_time2();
RD0 = 0;
while(1)
{
if(RB0 == 0){
while(1){
RD0 = 1;
if(RB0 == 1)
break;
}
__delay_ms(2000);
RD0 = 0;
}
}
}

40
ĐỀ 11
*** Xây dựng sơ đồ và lập trình vi điều khiển thực hiện đồng thời các việc sau
- Hiển thị đếm 3 LED 7 thanh, số đếm tăng từ 0 đến 999 với nhịp tăng 0,1s, khi đến 999
thì đếm ngược lại về 0 với nhịp 2s. lặp lại vô hạn quá trình trên
- Liên tục tạo xung vuông tần số 2khz thời gian tồn tại xung là 0,1ms trên 1 cổng ra của
VXL
Cách 1
#include <16f877a.h>
#FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP
#USE DELAY(CLOCK=20M)
const unsigned char led[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x80,0x10};
signed int16 i;
void hienthi1()
{
int tr, c, dv, k; tr= i/100; k= i - tr*100; c= k/10; dv=k%10;
for (int j=0;j<100;j++)
{
41
output_b(led[tr]); output_low(pin_d0); delay_ms(5); output_high(pin_d0);
output_b(led[c]); output_low(pin_d1); delay_ms(5); output_high(pin_d1);
output_b(led[dv]); output_low(pin_d2); delay_ms(10); output_high(pin_d2);
}}
void hienthi2()
{
int tr, c, dv, k; tr= i/100; k= i - tr*100; c= k/10; dv=k%10;
for (int j=0;j<100;j++)
{
output_b(led[tr]); output_low(pin_d0); delay_ms(5); output_high(pin_d0);
output_b(led[c]); output_low(pin_d1); delay_ms(5); output_high(pin_d1);
output_b(led[dv]); output_low(pin_d2); delay_ms(10); output_high(pin_d2);
}}
void main()
{
setup_timer_2(T2_DIV_BY_16,155,1); setup_CCP1(ccp_pwm);
set_pwm1_duty(31); set_tris_b(0x00);
while(true)
{ for (i=0;i<=999;i++)
hienthi1();
if (i==999)
{
for (i=999; i>=0;i--)
hienthi2();
}}}

42
Cách 2
#include <xc.h>
#define _XTAL_FREQ 20000000
#define SBIT_T2CKPS1 1
#define Xung RD7
unsigned int count = 0,count1 = 0, dem = 0;
unsigned int a,b,c;
unsigned int checktang = 1,checkgiam = 0;
const unsigned char MALED[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,0x92, 0x82,0xF8, 0x80, 0x90};
void timer2_init(){
T2CON = (1<<SBIT_T2CKPS1);
TMR2=225;
TMR2IE=1;
GIE=1;

43
PEIE=1;
TMR2ON = 1;
}
//tao ham ngat timer2 100us
void __interrupt() timer2(){
if(TMR2IF == 1){
TMR2 = 226;
TMR2IF = 0;
count++;
count1++;
if(count1 <= 1){
Xung = 1;
}
else if(count1 > 1 && count1 <= 4){
Xung = 0;
}
if(count1 == 5){
count1 = 0;
}
}
}
void demtang(unsigned int dem){
unsigned int a,b,c;
a = (dem/100);
b = (dem%100)/10;
c = dem % 10;
}

44
void main(void) {

TRISB = 0x00;
TRISD = 0x00;
PORTD = 0x00;
PORTB = 0x00;
timer2_init();
while(1)
{
a=(dem/100);
b=(dem%100)/10;
c=dem%10;
PORTDbits.RD0=0; PORTB = MALED[a];
__delay_ms(5); PORTDbits.RD0=1;
PORTDbits.RD1=0; PORTB = MALED[b];
__delay_ms(5); PORTDbits.RD1=1;
PORTDbits.RD2=0; PORTB = MALED[c];
__delay_ms(5); PORTDbits.RD2=1;
if(count >= 1000&&checktang == 1){ //200*500us = 100ms = 0.1s
dem++;
if(dem == 999){
checktang = 0;
checkgiam = 1;
}
count = 0;
}
if(count >= 20000 && checkgiam == 1){

45
dem--;
if(dem == 0){
checktang = 1;
checkgiam = 0;
}
count = 0;
} }}

ĐỀ 12
*** Xây dựng sơ đồ và lập trình vi điều khiển thực hiện đồng thời nhiệm vụ sau
- Điều khiển một led đơn sáng theo thuật toán : khi ấn phím led sáng ngay, khi nhả phím
2s sau led tắt
- Tạo xung vuông tại cổng đầu ra 1 chu kì 10ms và thời gian tồn tại xung là 3ms sử dụng
ngắt timer

46
#include <xc.h>
#define _XTAl_FREQ 20000000
#define SBIT_PS2 2
#define Xung RD7
#define LED RD0
#define sw RB0
unsigned int count = 0,count1 = 0,check = 0;
void timer0_init(){
OPTION_REG = (1<<SBIT_PS2);
TMR0=100; // Gia tri bat dau tao tre 1ms
TMR0IE=1;
GIE=1;
PEIE=1;
}
void __interrupt() timer0(){
if(TMR0IF == 1){
TMR0 = 101;
TMR0IF = 0;
count1++;
if(count1 <= 3){
Xung = 1;
}
else if(count1 > 3 && count1 < 10){
Xung = 0;
}
if(count1 == 10){
count1 = 0;

47
}
if(sw == 0){
LED = 1;
check = 1;
}
if(sw == 1 && check == 1){
count++;
if(count == 2000){ //2s = 1ms * 2000
LED = 0;
count = 0;
check = 0;
}}}}
void main(void) {
timer0_init();
TRISB = 0xff;
TRISD = 0x00;
PORTD = 0x00;
while(1){
}}

48
T=1/f =1 / 2*10^3= 0,5 ms
1 1
Có (period +1)*𝑓𝑜𝑐𝑠 *4*prescale=𝑓 𝑥𝑢𝑛𝑔
1 1
(period +1)* 20∗10^6*4*16=2∗10^3

 Period = 155
𝑣𝑎𝑙𝑢𝑒
Có =0.1 / 0.5 = 1/ 5
𝑝𝑒𝑟𝑖𝑜𝑑+1

 Value = 31

49
LÝ THUYẾT
Đề 1:
Vài trò của xung nhịp đồng hồ cấp cho VXL ?
Xung nhịp đồng hồ được nối tiếp với bộ đếm chương trình và làm đầu ra của bộ đếm
này thay đổi. Đầu ra của bộ đếm chương trình nối với đầu vào của bộ giải mã, ứng với mỗi giá
trị đầu ra của bộ đếm thì một chân đầu ra của bộ giải mã đuộc tích cực nhờ đó mà dữ liệu trong
thanh ghi được nối với chân đầu ra của bộ giải mã được đưa lên bus chung nhằm thực hiện mọi
hoạt động của VXL
Vì thế xung nhịp đồng hộ có vai trò vận hành sự hoạt động của VXL: đồng bộ dao động (dao
động thạch anh), kích khơi, khóa, chốt data,…
Đề 2:
Bus địa chỉ, bus dữ liệu và bus điều khiển giống và khác nhau ở chỗ nào ?
Bus địa chỉ Bus dữ liệu Bus điều khiển
Giống nhau Đều sử dụng để truyền thông tin giữa VXL với bộ nhớ (memory),
đầu vào (Input) và đầu ra (output) và các thiết bị ngoại vi.

Đều là Bus 1 chiều


Khác nhau Dùng để truyền giá Dùng để truyền tải Dùng để truyền tải
trị logic (địa chỉ) để thông tin dữ liệu để thông tin theo hai
tham chiếu đến các điều khiển hoạt chiều giữa CPU và
khu vực bộ nhớ để động của hệ thống bộ nhớ, các thiết bị
chỉ ra dữ liệu được gồm tín hiệu chu kỳ ngoại vi vào ra. Nó
lưu chữ ở đâu trong để đồng bộ các nhịp được CPU điều
bộ nhớ. chuyển động và khiển để đọc hoặc
hoạt động của hệ biết dữ liệu hoặc mã
thống. lệnh trong qua trình
hoạt động của CPU.

Đề 3
Thế nào là bộ nhớ dữ liệu, bộ nhớ chương trình, thanh ghi ?
Bộ nhớ dữ liệu (RAM) tồn tại độc lập so với bộ nhớ chương trình. Với những vi điều
khiển không tích hợp ROM trên chip thì vẫn có RAM trên chip là 128byte. Khi sử dụng RAM
ngoài, CPU đọc và ghi dữ liệu bên ngoài thì buộc pahir kết hợp chân RD và WR. Khi sử dụng cả
bộ nhớ chương trình và bộ nhớ dữ liệu bên ngoài thì buộc phải kết hợp chân RD và PSEN bởi
cổng logic AND để phân biệt tín hiệu truy xuất dữ liệu trên ROM hay RAM ngoài
Bộ nhớ chương trình (ROM,EPROM) là bộ nhớ chỉ đọc, có thể mở rộng tối đa 64kbyte.
Với các vi điều khiển không tích hợp sẵn bộ nhớ chương trình trên chip, buộc phải thiết kế bộ
nhớ chương trình bên ngoài. Ví dụ sử dụng EPROM 2764 (64Kbyte), khi đó chân PSEN phải ở
mức tích cực (5V)

50
Thanh ghi là một bộ nhớ dung lượng nhỏ và rất nhanh, được sử dụng để tăng tốc độ xử
lý của các chương trình máy tính bằng cách cung cấp các truy cập trực tiếp đến các giá trị cần
dùng
Đề 4:
Khối thực hiện lệnh tác động vào các khối chức năng nào trong VXL ?
Khối thực hiện lệnh tác động vào khối thanh ghi, khối điều khiển, ALU bên trong VXL và
bus chung.
Đề 5:
Ngắt là gì ? Nguyên tắc gọi và hoạt động của hàm ngắt ?
Ngắt (Interrupt) - là một số sự kiện khẩn cấp bên trong hoặc bên ngoài bộ vi điều khiển
xảy ra, buộc vi điều khiển tạm dừng thực hiện chương trình hiện tại, phục vụ ngay lập tức
nhiệm vụ mà ngắt yêu cầu – nhiệm vụ này gọi là trình phục vụ ngắt (ISR: Interrupt Service
Routine).
Nguyên tắc và hoạt động
Tín hiệu tác động vào VXL ➔ gọi hàm ngắt
Tạo ra một tín hiệu tác động vào VXL thông qua cơ cấu đặc biệt của VXL đấy tác động vào
chương trình
➔ Tạm dựng chương trình đó và gọi một hàm là hàm ngắt
Sau khi thực hiện xong quay lại chương trình cũ
Đề 6
Bộ đệm dữ liệu 1 chiều và 2 chiều có chức năng gì ?
Bộ đệm dữ liêu 1 chiều có chức năng lưu trữ các giá trị thông tin về địa chỉ từ bộ chốt
địa chỉ và truyền di các giá trị này.
Bộ đếm dữ liệu 2 chiều có chức năng lưu trữ các giá trị thông tin về địa chỉ từ bộ chốt địa chỉ,
lưu trữ và trao đổi dữ liệu với bus dữ liệu và truyền đi các giá trị được lưu trữ ra ngoài
Đề 7
Ngăn xếp là gì ? Ngăn xếp hoạt động như thế nào ?
Khi một chương trình con được gọi, vi xử lý cần lưu trữ vị trí của chương trinh (giá trị bộ
đếm chương trình) trước khi gọi chương trình con để sau khi thực hiện xong cần thực hiện lệnh
tiếp trong chương trình chính. Vị trí này được gọi là địa chỉ trả về và được lưu trữ trong một
vùng nhớ đặc biệt gọi là ngăn xếp. Trước khi trao quyền điều khiển cho chương trình con, địa
chi trả về cần được cất giữ vào trong ngăn xếp. Sau khi thực hiện xong chương trinh con, địa chi
trả về được lấy ra từ trong ngăn xếp và nạp vào bộ đếm chương trình. Hoạt động: Khi đưa dữ
liệu mới vào sẽ đẩy dữ liệu cũ xuống dưới đáy, khi lấy ra ta sẽ lấy được dữ liệu mới đầy vào.
Như vậy hoạt động theo nguyên tắc: vào cuối cùng thì ra đầu tiên: LIFO

51
Đề 8
Một chương trình trong VXL được thực hiện như thế nào, vài trò của bộ đếm chương trình ?
Chương trình trong VXL được thực hiện bằng 3 pha
Nạp lệnh: giai đoạn này VXL đặt giá trị của bộ đếm chương trình vào bus địa chỉ và lấy mã lệnh
đã được địa chỉ hóa và ghi mã lệnh lên thanh ghi (I)
Giải mã: Thông qua bộ giải mã lệnh để sinh ra các tín hiệu điều khiển phù hợp nhằm thực hiện
các lệnh.
Thực hiện lệnh: thực hiện lệnh để đưa ra kết quả
Bộ đếm chương trình có vai trò đưa giá trị lên bus địa chỉ để đưa mã lệnh trong thanh ghi đã
được địa chỉ hóa vào thanh ghi lệnh I để thực hiện các chương trình của VXL.
Đề 9:
Mô tả sự hoạt động của 1 chương trình có sử dụng gọi chương trình con ? Vai trò của con trỏ
ngăn xếp và bộ nhớ ngăn xếp ?

Một chương trình chính khi gặp gặp lệnh gọi chương trình con thì cất giữ giá trị trong bộ đếm
chương trình vào bộ nhớ ngăn xếp rồi chuyển ra nạp giá trị của chương trình con vào bộ đếm
chương trình để thực hiện chương trình con. Thực hiện hết chương trình con sẽ lấy giá trị trong

52
bộ nhớ ngăn xếp để trở về lệnh trước khi thục hiện chương trình con để thực hiện tiếp chương
trình chính.
Vai trò của:
Con trỏ ngăn xếp: trỏ đến địa chỉ đỉnh của stack để lấy dữ liệu từ địa chỉ đỉnh của ngăn xếp.
Bộ nhớ ngăn xếp: Lưu các địa chỉ lệnh trả về trước khi gọi chương trình con.

Đề 10:
Phân loại và mô tả vai trò, nhiệm vụ của từng loại BUS trong VXL ? Với vi xử lý loại 8 bit sẽ có
BUS dữ liệu 8 bit và BUS địa chỉ 16 bit có được không, tại sao ?
BUS dữ liệu: dùng để truyền tải thông tin dữ liệu theo 2 chiều giữa CPU với bộ nhớ, các
thiết bị ngoại vi vào ra. Nó được CPU điều khiển để viết hoặc đọc dữ liệu hoặc mã lệnh trong
quá trình hoạt động của CPU.
BUS địa chỉ: Dùng để truyền giá trị địa chỉ để tham chiếu đến các khu vực bộ nhớ nhằm chỉ ra
dữ liệu được lưu trữ ở đâu trong bộ nhớ
BUS điều khiển: dùng để truyền tải thông tin dữ liệu để điều khiển hoạt động của hệ thống.
Với vi xử lý loại 8 bit sẽ có Bus dữ liệu 8 bit và Bus địa chỉ 16bit được không? Tại sao? Có được,
vì với vi xử lý 8 bit có thể đánh địa chỉ được 206 khu vực tức là 256byte

Đề 11: Giống đề 9


Đề 12: Giống đề 10

0 1 2 3 4 5 6 7
0000 0001 0010 0011 0100 0101 0110 0111
8 9 A B C D E F
1000 1001 1010 1011 1100 1101 1110 1111

Bộ giải mã Mạch điều khiển


000 Mov A,C ( chuyển dữ liệu thanh ghi C -> A)
001 Mov B,C ( chuyển dữ liệu thanh ghi C -> B)
010 ADD ( phép +)
011 SUB ( phép - )

53
100 AND ( phép *)
101 OR
110 Load A ( đưa dữ liệu vào thanh ghi A)
111 Load B ( đưa dữ liệu vào thanh ghi B)

54

You might also like