MỤC LỤC
PHẦN I: LÝ LUẬN CHUNG . 14
CHƯƠNG I: MỞ ĐẦU . 14
1.1 Yêu cầu của đề tài . 14
1.2 Mục đích nghiên cứu . 14
1.3 Lý do chọn đề tài . 14
1.4 Chọn phương án thiết kế . 14
1.5 Ý nghĩa khoa học và ý nghĩa thực tiễn 14
CHƯƠNG II: LÝ THUYẾT LIÊN QUAN . 16
2.1 Môi trường truyền dữ liệu . 16
2.1.1 Các khái niệm cơ bản 16
2.1.2 Sự suy giảm và biến dạng tín hiệu 16
2.1.3 Môi trường truyền dẫn hữu tuyến . 17
2.2 Các chế độ thông tin 24
2.3 Chế độ truyền 24
2.3.1 Chế độ truyền bất đồng bộ 25
2.3.2 Chế độ truyền đồng bộ 26
2.4 Xử lý số liệu truyền . 27
2.4.1 Phương pháp kiểm tra bit chẵn lẻ 28
2.4.2 Phương pháp kiểm tra tổng BSC . 29
2.4.3 Phương pháp kiểm tra CRC 34
2.5 Điều khiển luồng . 31
2.6 Giao thức điều khiển liên kết dữ liệu thiên hướng bit 32
CHƯƠNG III: LINH KIỆN ỨNG DỤNG 37
3.1 Bộ vi điều khiển 8 bits PIC16F877A 37
3.1.1 Giới thiệu bộ vi điều khiển 8 bits 37
3.1.2 Kiến trúc PIC 38
3.1.3 RISC và CISC . 38
3.1.4 Các dòng PIC và cách lựa chọn vi điều khiển PIC . 38
3.1.5 Ngôn ngữ lập trình cho PIC 39
3.1.6 Mạch nạp PIC 39
3.1.7 Sơ đồ chân vi điều khiển PIC . 40
3.1.8 Một vài thông số vi điều khiển PIC 16f877A . 41
3.1.9 Sơ đồ khối vi điều khiển PIC 42
3.1.10 Tổ chức bộ nhớ 43
3.1.11 Bộ chuyển đổi tương tự sang số ADC . 44
3.1.12 Giao tiếp nối tiếp I2C 46
3.2 IC chuyển đổi số sang tương tự DAC0808 . 47
3.2.1 Cấu tạo . 47
3.2.2 Sơ đồ khối và sơ đồ kết nối 47
3.2.3 Đặc điểm 49
3.2.4 Nguyên tắc chuyển đổi và các tham số . 49
3.3 Keypad 3x4 . 51
3.4 Màn hình tinh thể lỏng LCD . 54
3.5. IC khuếch đại thuật toán LF351 . 57
PHẦN II: THIẾT KẾ VÀ CHẾ TẠO . 59
CHƯƠNG I: SƠ ĐỒ KHỐI TỔNG QUÁT 59
1.1 Sơ đồ khối tổng quát . 59
1.2 Hoạt động của các khối . 60
CHƯƠNG II: THIẾT KẾ CHI TIẾT . 61
2.1 Khối Pre_Amplifier . 61
2.2 Khối xử lý bên phát . 58
2.3 Khối xử lý bên thu . 60
2.4 Khối DAC . 61
2.5 Khối nguồn 66
CHƯƠNG III: LƯU ĐỒ THUẬT TOÁN . 67
3.1 Master . 67
3.2 Slave 68
3.3 Keypad 69
3.4 Send packet . 70
CHƯƠNG IV: MÔ HÌNH SẢN PHẨM VÀ HƯỚNG DẪN SỬ DỤNG 69
4.1.MODUL mã hóa dữ liệu và tạo CRC 69
4.1.1Mô hình 69
4.1.2. Hướng dẫn sử dụng 69
4.2.MODUL giải mã dữ liệu và phát hiện lỗi . 70
4.2.1.Mô hình . 70
4.2.2.Hướng dẫn sử dụng . 71
PHẦN III: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI . 74
3.1 Kết luận . 74
3.1.1 Ưu nhược điểm 74
3.1.2 Mở rộng . 75
3.2 Các đề xuất và kiến nghị 75
PHỤ LỤC CÁC BÀI THÍ NGHIỆM . 74
TÀI LIỆU THAM KHẢO: . 83
21 trang |
Chia sẻ: banmai | Lượt xem: 2091 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Thiết kế và chế tạo bộ thí nghiệm mã hóa và giải mã dữ liệu, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1. MASTER
#include
#include
#device *16adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include
#include
#define SLAVE_ADDRESS 0xa0
#use i2c(master, sda=PIN_C4, scl=PIN_C3, force_hw)
#DEFINE SELECT RA2
#DEFINE ROW1 RB4
#DEFINE ROW2 RB5
#DEFINE ROW3 RB6
#DEFINE ROW4 RB7
INT16 VALUE,VALUE1,DEM,DATA1,DATA2,DATA3,CRC;
INT8 PACKET[50];
INT8 SEND,TRUYEN,DATA,TRAM,CHUC,DONVI,I,J,DICH,PHIM,NUMBER,ERROR;
INT8 CONST QUET_COT[4]={0B11111110,0B11111101,0B011111011,0B11110111};
#BIT BIT00=VALUE.0
#BIT BIT10=VALUE.1
#BIT BIT20=VALUE.2
#BIT BIT30=VALUE.3
#BIT BIT40=VALUE.4
#BIT BIT50=VALUE.5
#BIT BIT60=VALUE.6
#BIT BIT70=VALUE.7
// CHUONG TRINH TINH TOAN DE HIEN THI GIA TRI CAM BIEN LEN LCD
// ************* $$$$$$$$$$$$$$$$$$$$$ *******************
VOID TINH_TOAN_VA_HIEN_THI(int8 x) // thuc hien tach so va dua ra hien thi luon
{
INT8 J;
TRAM = X / 100 + 0X30 ; // TACH LAY SO HANG TRAM
X = X % 100 ; // CHIA LAY PHAN DU
CHUC = X/10 + 0X30 ; // TACH LAY PHAN CHUC
DONVI = X % 10 + 0X30 ; // PHAN DON VI
FOR(J=1;J<7;J++)
{
IF(NUMBER<10){IF(DEM==J)LCD_GOTOXY(7+J,2);}
ELSE{IF(DEM==J)LCD_GOTOXY(8+J,2);} }
LCD_PUTC(DONVI); // CHI HIEN THI GIA TRI DON VI VI MOI PHIM DC NHAP CO GT<=9 .OK
}
/////////////// CHUONG TRINH HIEN THI SO NHI PHAN ///////////////////
VOID D_B()
{LCD_PUTC(BIT70+0X30);
LCD_PUTC(BIT60+0X30);
LCD_PUTC(BIT50+0X30);
LCD_PUTC(BIT40+0X30);
LCD_PUTC(BIT30+0X30);
LCD_PUTC(BIT20+0X30);
LCD_PUTC(BIT10+0X30);
LCD_PUTC(BIT00+0X30);}
////////////// CHUONG TRINH GUI KHUNG DU LIEU BANG I2C////////////////
void send_packet(int* packet_ptr, int16 packet_length)
{
int *ptr; int16 CRC,i;
ptr = packet_ptr; // set pointer
CRC = generate_16bit_crc(ptr, packet_length, CRC_CCITT);
i2c_start();
i2c_write(SLAVE_ADDRESS); // send address of slave
delay_ms(100);
i2c_write(0b01111110); // send flag mo
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"OPEN_FL:01111110 "); // IN CO MO LEN LCD
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"OPEN_FL:%u ",126); // IN CO MO LEN LCD
delay_ms(3000);
LCD_SEND_BYTE(0,0X01);
RB0=1; RB1=0; RB2=1;RB3=1; // QUET PHIM 0
for(i=0; i<packet_length; i++) // send packet
{
ERROR =0;
IF(RB7==0)
{
ERROR =5;
WHILE(!RB7){};
}
ELSE
i2c_write(packet_ptr[i] + ERROR);
VALUE=packet_ptr[i] + ERROR;
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "BIN[%LU]:",I);
LCD_GOTOXY(9,1);
D_B();
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"DEC[%lu]: %u ",i,packet_ptr[i] + ERROR);
delay_ms(1500);
FOR(DICH=9;DICH<18;DICH++)
{
LCD_GOTOXY(9,1);
PRINTF( LCD_PUTC, " ");
LCD_GOTOXY(DICH,1);
D_B();
DELAY_MS(300);
}
DELAY_MS(500);
}
RB0=1; RB1=1; RB2=1;RB3=1; // KO QUET PHIM 0
i2c_write((int)(CRC>>8));// send CRC
VALUE=(CRC>>8);
LCD_SEND_BYTE(0,0X01);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"T_CRC1: ");
LCD_GOTOXY(9,1);
D_B();
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"T_CRC1: %U ",(int)(CRC>>8));
delay_ms(1500);
VALUE=(CRC>>8);
FOR(DICH=9;DICH<18;DICH++)
{
LCD_GOTOXY(9,1);
PRINTF( LCD_PUTC, " ");
LCD_GOTOXY(DICH,1);
D_B();
DELAY_MS(300);
}
DELAY_MS(500);
i2c_write((int)(CRC));
VALUE=(int)(CRC);
LCD_SEND_BYTE(0,0X01);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"T_CRC2: ");
LCD_GOTOXY(9,1);
D_B();
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"T_CRC2: %U ",(int)(CRC));
delay_ms(1500);
VALUE=(int)(CRC);
FOR(DICH=9;DICH<18;DICH++)
{
LCD_GOTOXY(9,1);
PRINTF( LCD_PUTC, " ");
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "T_CRC2: ");
LCD_GOTOXY(DICH,1);
D_B();
DELAY_MS(300);
}
DELAY_MS(500);
i2c_write(0b01111110); // send flag dong
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"CL0S_FL:01111110 "); // IN CO DONG LEN LCD
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"CLOS_FL:%u ",126); // IN CO DONG LEN LCD
delay_ms(3000);
i2c_stop();
}
/////// CHUONG TRINH THAO TAC VOI BAN PHIM //////////
VOID QUET_PHIM()
{
PHIM=100;
WHILE(PHIM==100)
{
FOR(I=0;I<4;I++)
{
PORTB=QUET_COT[I];
IF (!ROW1){PHIM=I+1;BREAK;}
ELSE IF(!ROW2){PHIM=I+4;BREAK;}
ELSE IF(!ROW3){PHIM=I+7;BREAK;}
ELSE IF(!ROW4){IF(I==1){PHIM=0;}ELSE{PHIM=I+10;};BREAK;}
ELSE IF(!SELECT){PHIM=0;BREAK;}
}
}
WHILE((!ROW1)||(!ROW2)||(!ROW3)||(!ROW4)){}
IF((PHIM==10)||(PHIM==12))GOTO LOOP;
DEM++;
IF(DEM==1)DATA1=PHIM;
ELSE IF(DEM==2)DATA2=PHIM;
ELSE IF(DEM==3)DATA3=PHIM;
IF((DEM<7)&&(SEND==0))TINH_TOAN_VA_HIEN_THI(PHIM);
LOOP:
IF(PHIM==10) // XAC NHAN DU LIEU VA TRUYEN DU LIEU
{
IF(send!=1)
{
IF( (DEM>0)&&(DEM<4) ) // LUU GIA TRI CO NGHIA NHAP TU PHIM
{
IF(DEM==1)
PACKET[NUMBER]=DATA1;
ELSE IF(DEM==2)
PACKET[NUMBER]=10*DATA1 + DATA2;
ELSE IF(DEM==3) // CO THE SO NHAP VAO LON HON 255
{
VALUE = 100*DATA1 + 10*DATA2 + DATA3;
IF(VALUE > 255){
NUMBER--;
LCD_GOTOXY(1,1);PRINTF( LCD_PUTC, "ERR>>ENTER AGAINT ");
DELAY_MS(2000);}
ELSE
PACKET[NUMBER]=100*DATA1 + 10*DATA2 + DATA3;
}
VALUE=PACKET[NUMBER];
J=NUMBER;
}
ELSE {
NUMBER--;
LCD_GOTOXY(1,1);PRINTF( LCD_PUTC, "ERR>>ENTER AGAINT ");
DELAY_MS(2000);
}
DATA1=0; DATA2=0; DATA3=0; DEM=0; NUMBER++;PHIM=0;
LCD_SEND_BYTE(0,0X01);
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "BIN[%U]:",J);
D_B();
}
ELSE // TRUYEN VA TAO LOI KHI TRUYEN
{
IF(NUMBER==0) // THONG BAO KHI CHUA CO DU LIEU MA DA TRUYEN
{
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "Not Data in frame ");
LCD_GOTOXY(1,2);
PRINTF( LCD_PUTC, "Enter Data again ");
SEND=0;
DELAY_MS(2000);
LCD_SEND_BYTE(0,0X01);
}
ELSE IF(NUMBER!=0)
{
LOOP1:
LCD_SEND_BYTE(0,0X01);
LCD_GOTOXY(1,1);
IF(RE0==1)
PRINTF( LCD_PUTC, "Data frame transmit ");
ELSE
{
PRINTF( LCD_PUTC, "Mistke data ");
LCD_GOTOXY(1,2);
PRINTF( LCD_PUTC, "Transmit agian ");
}
DELAY_MS(3000);
send_packet(packet,number);
IF(RE0==0)GOTO LOOP1;
SEND=0;
NUMBER=0;
DEM=0;
LCD_SEND_BYTE(0,0X01);
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "ENTER DATA :");
}
}
}
IF(PHIM==12)
{
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "<-:Data transmit ");
LCD_GOTOXY(1,2);
PRINTF( LCD_PUTC, " 0:Creats errors ");
send=1; DEM=0;
}
}
#INT_TIMER1
VOID LAYMAU_ADC()
{
IF(I<=50)
{
packet[I]=read_adc();
set_timer1(64911); //tao tan so lay mau 8KHz
I++;
TRUYEN=0;
}
IF(I>50) I=0;TRUYEN=1;
}
VOID MAIN()
{
TRISB = 0B11110000;
PORTB = 0B11111111;
TRISE = 0B111; TRISA2=1;
DEM=0; NUMBER=0; VALUE=0; SEND=0;
I=0; J=0;
LCD_INIT();
///////////KHOI TAO ADC ///////////
setup_adc(adc_clock_internal);
setup_adc_ports(AN0 );
SET_ADC_channel(0);
LOOP:
/////////// CHUONG TRINH TES TAY VOI BAN PHIM 3X4///////////
IF(SELECT==1)
{
LCD_SEND_BYTE(0,0X01);
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "ENTER DATA :");
LCD_GOTOXY(1,2);
PRINTF( LCD_PUTC, "DEC[%U]:",NUMBER);
WHILE(SELECT)
{
LCD_GOTOXY(1,2);
IF(SEND==0)PRINTF( LCD_PUTC, "DEC[%U]:",NUMBER);
QUET_PHIM();
}
}
////////// CHUONG TRINH TEST TU DONG >> TIN HIEU TU ADC//////////////
IF(SELECT==0)
{
//////////// KHAI BAO NGAT TIMER1//////////////
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
setup_timer_1 ( T1_INTERNAL );
set_timer1(64911);
LCD_SEND_BYTE(0,0X01);
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "Automatic Test");
LCD_GOTOXY(1,2);
PRINTF( LCD_PUTC, "Pleas ! you sing ");
WHILE(!SELECT)
{
WHILE(!TRUYEN){};
////// CAM NGAT //////////
disable_interrupts(GLOBAL); // all interrupts OFF
send_packet(packet,number);
}
GOTO LOOP;
}
2. SLAVE
#include
#include
#device *16adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(Clock=20000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0, force_hw)
#include
#include
int16 CRC,CRC1;
int8 i,j,k,value,dem,data,dich,packet_ptr[80],packet_buffer_data[50];
#BIT BIT00=VALUE.0
#BIT BIT10=VALUE.1
#BIT BIT20=VALUE.2
#BIT BIT30=VALUE.3
#BIT BIT40=VALUE.4
#BIT BIT50=VALUE.5
#BIT BIT60=VALUE.6
#BIT BIT70=VALUE.7
#DEFINE ACK1 RA2
#DEFINE ACK2 RA3
VOID D_B()
{
LCD_PUTC(BIT70+0X30);
LCD_PUTC(BIT60+0X30);
LCD_PUTC(BIT50+0X30);
LCD_PUTC(BIT40+0X30);
LCD_PUTC(BIT30+0X30);
LCD_PUTC(BIT20+0X30);
LCD_PUTC(BIT10+0X30);
LCD_PUTC(BIT00+0X30);
}
#INT_SSP
void i2c_isr()
{
i = i2c_isr_state();
if( i>= 0x80)i2c_write(data);
ELSE if( 0<i ){packet_ptr[i]= i2c_read();}
}
void main()
{
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
//LCD_INIT();
TRISB=0X00;
TRISA2=0;//ACK1
TRISA3=1;//ACK2T
ACK1=1;
DELAY_MS(1500);
LOOP_MAIN:
WHILE(ACK2)
{
i=0; j=0;
loop:
if(ACK2==1)GOTO LOOP_MAIN;
if( (packet_ptr[i]!=0b01111110) )goto loop;
j=i;
loop1:
if(i==j)goto loop1;
J=2;
while((packet_ptr[i]!=0b01111110))
{
WHILE(J!=I){};
k=i-2;
VALUE=packet_ptr[i];
J++;
}
dem=i;
CRC = (int16)(packet_ptr[ dem - 2])<<8;
CRC += packet_ptr[dem - 1];
for(i=2;i<=dem-3;i++){
packet_buffer_data[i-2]=packet_ptr[i];
PORTB =packet_buffer_data[i-2];
}
CRC1=generate_16bit_crc(packet_buffer_data, dem - 4, CRC_CCITT);
if(CRC != generate_16bit_crc(packet_buffer_data, dem - 4, CRC_CCITT))
}
LCD_INIT();
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"WAITING DATA ");
i=0; j=0;
loop:
if(ACK2==1)GOTO LOOP_MAIN;
if( (packet_ptr[i]!=0b01111110) )goto loop;
j=i;
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"OPEN_FL:01111110 "); // IN CO MO LEN LCD
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"OPEN_FL:%u "packet_ptr[i]);
loop1:
if(i==j)goto loop1;
lcd_send_byte(0,1);
J=2;
while((packet_ptr[i]!=0b01111110))
{
WHILE(J!=I){};
k=i-2;
VALUE=packet_ptr[i];
LCD_GOTOXY(1,2);
IF(K<10)PRINTF(LCD_PUTC,"DEC[%d]: %u ",k,packet_ptr[i]);
ELSE PRINTF(LCD_PUTC,"DEC[%d]:%u ",k,packet_ptr[i]);
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, "BIN[%U]: ",k);
DELAY_MS(1500);
FOR(DICH=2;DICH<10;DICH++)
{
LCD_GOTOXY(1,1);
PRINTF( LCD_PUTC, " ");
LCD_GOTOXY(DICH,1);
D_B();
LCD_GOTOXY(1,1);
IF(K<10) PRINTF( LCD_PUTC, "BIN[%U]: ",k);
ELSE PRINTF( LCD_PUTC, "BIN[%U]:",k);
DELAY_MS(400);
}
J++;
}
dem=i;
ACK1=1;
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"CL_FL=01111110 "); // IN CO DONG LEN LCD
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"CLOSE FLAG=%u "packet_ptr[i]);
DELAY_MS(800);
CRC = (int16)(packet_ptr[ dem - 2])<<8;
CRC += packet_ptr[dem - 1];
for(i=2;i<=dem-3;i++)packet_buffer_data[i-2]=packet_ptr[i];
CRC1=generate_16bit_crc(packet_buffer_data, dem - 4, CRC_CCITT);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"T_CRC1':%U ",(int)(CRC1>>8));
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"T_CRC2':%U ",(int)(CRC1));
DELAY_MS(2000);
if(CRC != generate_16bit_crc(packet_buffer_data, dem - 4, CRC_CCITT))
{
lcd_gotoxy(1,1);
printf(lcd_putc,"RECEIVERED AGAINT " );
lcd_gotoxy(1,2);
printf(lcd_putc,"I2c_Data Errors " );
ACK1=0;
}
else
{
lcd_gotoxy(1,1);
printf(lcd_putc,"HAS RECEIVERED " );
lcd_gotoxy(1,2);
printf(lcd_putc,"I2c_Data Seccess " );
ACK1=1;
}
DELAY_MS(3000);
LCD_SEND_BYTE(0,0X01);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"WAITING DATA ");
IF(ACK2==1)GOTO LOOP_MAIN;
ELSE goto loop;
}