การทดลองที่ 3...
TRANSCRIPT
305381 Microcontroller Interface Lab 3 1
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
การทดลองท 3 การรบสงขอมลแบบขนานและอนกรม
วตถประสงค
1. เพอใหนสตสามารถเขยนโปรแกรมภาษา C อยางงายในการควบคมไมโครคอนโทรลเลอรได
2. เพอใหนสตเขาใจการท างานการรบสงขอมลแบบขนานและอนกรมเพอตดตอระหวางไมโครคอนโทรลเลอร
3. เพอใหนสตเขาใจการท างานการรบสงขอมลแบบขนานและอนกรมเพอตดตอกบ PC
อปกรณในการทดลอง
1. ชดทดลองไมโครคอนโทรลเลอร SILA-START-C51
2. เครองคอมพวเตอร PC พรอมโปรแกรมส าหรบการเขยนและคอมไพลภาษา C - โปรแกรม Keil51 v.xx
3. สายตอพอรตอนกรม
4. บอรดใชงาน MCS-51
วธการทดลอง
1. ใช IDE ส าหรบพฒนาชดค าสงของ MCS-51 ดวยภาษา C โดยใช Keil51เพอเขยนโปรแกรม Lab03_x.c
2. สรางโปรเจคใหมโดยเลอก New project ตงชอเปน Lab03 แลวกด ok
305381 Microcontroller Interface Lab 3 2
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
305381 Microcontroller Interface Lab 3 3
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
3. เลอก CPU : Philips P89C51RD2xx
4. จากนนคลกทป มวงกลมสแดง เพอสรางหนาตางส าหรบเขยนโปรแกรม( หนาตาง Text1 ) สรางไฟลใหม เขยนโปรแกรมและ save โดยใชชอ Lab03_x.c (x แทนหมายเลขการทดลอง )
305381 Microcontroller Interface Lab 3 4
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
5. คลกขวาท Source Group 1 แลวเลอก Add file to group ‘Source Group 1’ แลวเลอก File Lab03_x.c
305381 Microcontroller Interface Lab 3 5
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
6. เขยนโปรแกรมใหเสรจแลวคลกท วงกลมท 1 เพอท าการ compile ถาหากวาไมพบ Error โดยทถาเกด error ขนโปรแกรมจะแสดงวา error กท (ด windows output ดานลางของโปรแกรม ) คลกท วงกลมท 2 เพอให keil ตรวจสอบและท าการ debug พรอมทงตรวจสอบขนาดของโปรแกรมทเราสรางขนและพรอมส าหรบการทดสอบการท างานโปรแกรม
7. Build โปรแกรมทเขยน โดยกอนหนานน click ขวา ท Target1 เลอก Options for Target ‘Target1’ ท Tab Output เลอก create hex file โดยเลอกท check box ‘Create Hex file’ File ท ไดจะมชอเหมอนกบชอโปรเจค คอ Lab03.hex สามารถเปลยนแปลงชอไดโดยแกชอ output file ลงในชอง ‘Name of Executable’
305381 Microcontroller Interface Lab 3 6
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
8. เมอ Compile และ Build ผานโดยไมมขอผดพลาด (error) จะได HEX file เพอน าไปใชงานตามทก าหนดไวในแตละการทดลอง
9. บนทกผลการทดลอง และอธบายการท างานของโปรแกรม และท าออกมาในรปแบบรายงาน
10. ใหนสตท าการทดลองทเหลอ โดยเมอท าการทดลองใหมใหสรางไฟลใหม เขยนโปรแกรมและ save เปนชอใหม เชน สรางไฟลใหมชอ Lab03_2.c (2 แทนหมายเลขการทดลองท 2)
11. จากนน Click ท Source group แลว click ขวาท Lab03_1.c ซงอยใน Source group เลอก Remove file ’ Lab03_1.c’ เพอเอา file Lab03_1.c ออกจาก project
12. Click ขวาท Source group เลอก Add file to group แลวเลอก File Lab03_2.c
13. ท าเชนนจนครบทกการทดลอง ถาการทดลองใดมการบานหรอแบบฝกหดทายการทดลอง ใหตอบค าถามใหชดเจน และถาหากเปนการเขยนโปรแกรม ใหท าในรปแบบเชนเดยวกนกบการทดลอง และแนบมาในรายงานการทดลองพรอมกนดวย
305381 Microcontroller Interface Lab 3 7
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
วธการใช SILA-START-C51
ใหตอสายอนกรมจากพอรตอนกรมของเครองคอมพวเตอร PC (COM1) ไปยงพอรตอนกรมของ SILA-START-C51
a. ทเครอง PC พมพค าสงใน DOS เพอท าการก าหนดคาในตดตอทางพอรตอนกรมดงน
C:\> MODE COM1 9600 , n , 8 , 1 , p (ท าครงเดยวเมอเปด PC หรอ เครองมปญหา)
b. เสยบปลกชดทดลอง SILA-START-C51 แลวกดค าสงบนบอรดทดลองเพอรบขอมลจากเครอง PC ดงน
10.1 ท าการลบขอมลโปรแกรมทมอยกอนหนาน โดย
MON BK/ER 0 (เลอก bank ทตองการลบ)
10.2 ท าการรอรบขอมลโปรแกรมจากทาง PC โดย
MON DNLD FILLD
c. ทเครอง PC พมพค าสงเพอสงโปรแกรมทคอมไพลแลวผานทางพอรตอนกรมดงน
C:\> COPY LAB03.HEX COM1
d. กดป ม RUN และเลอก Address ทตองการ (โดยปรกตจะตงไวท 0000 H) ทชดทดลอง SILA-START-C51แลวรอดผล
วธการใชบอรด MCS-51
305381 Microcontroller Interface Lab 3 8
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
a. ตอสายจาก com1 ของ computer เขากบบอรดโดยระวงให connector ดานทเปน ground ตรงกบ
เครองหมาย - ท าการโหลดผานโปรแกรม Flash magic ดงน
b. เปดโปรแกรม Flash magic โดยท าการตงคาตางๆ ดงน เลอกท Options----> Advanced Options
c. คลกเลอก Use DTR to control RST ออก
305381 Microcontroller Interface Lab 3 9
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
d. ทหมายเลข 1 เลอกรนของ MCS-51 และ com port ใหตรงกบทเราใช ตงคาอนๆ ตามหมายเลข 2 และ 4 ตามรปพรอมทง Browse ไฟลทหมายเลข 3 เลอก Hex file จากนนคลกเลอก Start ทหมายเลข 5แลวโปรแกรมจะให Reset MCS-51 เพอโหลด Hex file ลงอปกรณ
e. กดป ม reset ทบอรดไมโครคอนโทรลเลอร
305381 Microcontroller Interface Lab 3 10
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
การทดลองท 3.1
1. ท าการทดลองโดยใชบอรด MCS-51 และ Program Flash magic
2. เมอload hex file ลงในบอรด MCS-51 แลว ท computer เลอก Accessories communications Hyper
terminal ตงชอ Lab3 เลอก com1 ใชคา bit/sec 9600 แลวสง run program
3. เมอตองการแกไข program และ load hex file ลงในบอรด microcontroller อกครง ตอง disconnect Hyper terminal
กอน เมอ load เสรจแลวจง connect Hyper terminal เพอ run program
การทดลองท 3.2 รบขอมลเขาดวย serial interrupt
ท าการทดลองเหมอนตอนท 3.3 ขอ
การทดลองท 3.3
1. สราง lab03s.hex จาก ไฟล lab03_3s.c และ load lab03s.hex ลงในบอรด MCS-51(1)
2. เอาสาย serial ออกแลว
3. สราง lab03r.hex จาก ไฟล lab03_3r1. c และ load lab03r.hex ลงในบอรด MCS-51(2)
4. ตอ P0 ของบอรด MCS-51(1) เขากบ P1 ของบอรด MCS-51(2)
5. ตอ port 1.0 ของบอรด MCS-51(1) เขากบ port 3.2 ของบอรด MCS-51(2)
6. กด reset ทบอรด MCS-51 คางไว เลอก run program บนบอรด MCS-51(2) แลวจงปลอยป ม reset ทบอรด
MCS-51(1)
7. ท าการทดลอง ซ าโดยเปลยนเปนไฟล lab03_3r2.c
305381 Microcontroller Interface Lab 3 11
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
**(P2 ไมท างาน ใช P1 แทน ไมมเวลาแกรป)
การทดลองท 3.1_________________________________________________________________________
/* Filename lab03_1.C
Description Test Sending message by RS232
Clock 11.0592 Mhz
Compiler Keil CA51 v2.20a
*/
#include <reg51.h>
#include <stdio.h>
void start232 (void);
void delay(unsigned int d);
void wait (void);
void main()
{
start232();
printf("Microcontroller and Microcomputer Interfacing \n\r");
SBUF = 'a';
wait();
SBUF = 'b';
wait();
SBUF = 13;
wait();
SBUF = 0x31;
305381 Microcontroller Interface Lab 3 12
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
while(1)
{
}// end while(1)
}// end main
//**************Functions*************
void start232 (void)
{
SCON = 0x52; //Setup serial port control register Mode 1:
//8-bit uart var baud rate REN: enable receiver
// TI: buffer empty
TMOD = 0x20; //Set M1 for 8-bit autoreload timer
PCON |= 0x80; //Set SMOD bit in PCON
//doubles the baud rate
TH1 = -6; //Set auto-reload value for timer1 19200 baud with 11.0592 MHz xtal
RI = 0;
TR1 = 1; // Start timer 1
}
void delay(unsigned int d)
{
unsigned int i,j;
for(i=0;i<=d;i++)
for(j=0;j<=1000;j++);
}
void wait (void)
{
while(TI==0);
delay(50);
TI=0;
}
การทดลองท 3.2_________________________________________________________________________
/* Filename lab03_2.C
Description Test serial interrupt
Clock 11.0592 Mhz
Compiler Keil CA51 v2.20a
*/
#include <reg51.h>
#include <stdio.h>
#include <absacc.h>
#include <stdlib.h>
305381 Microcontroller Interface Lab 1 13
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
#define SEG7LED P0
#define SEGCHNL P1
void dusec (unsigned int count);
void start232 (void);
void startinterupt(void);
void serial_ISR(void);
void serial_ISR_Job(void);
int i=0;
char dataSEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x40};
//--------------------------------------------------
void main()
{
start232();
startinterupt();
printf("Test Serial Interupt \n\r");
while(1)
{
for(i=0;i<8;i++)
{
SEG7LED = dataSEG[i];
SEGCHNL = i;
dusec(1);
}
}// end while(1)
}// end void main
/********** FUNCTIONS **********/
void dusec (unsigned int count) { // mSec Delay
unsigned int i; // Keil CA51 (x2)
while (count) {
i = 10; while (i>0) i--;
count--;
}
}
void start232 (void)
{
SCON = 0x52; // set RS232 parameter
TMOD |= 0x21; // Crystal = 11059200
TH1 = -6; PCON |= 0x80; // speed x 2=19200
// TH1 = -12; PCON |= 0x80; // speed x 2=9600
TR1 = 1;
}
305381 Microcontroller Interface Lab 1 14
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
void startinterupt(void)
{
EA = 1;
ES = 1;
}
void serial_ISR(void) interrupt 4
{
if(RI)
{
ES = 0;
serial_ISR_Job();
RI = 0;
ES = 1; }
}
void serial_ISR_Job(void)
{ int i;
char mm;
for(i=0;i<8;i++)
{
mm=SBUF;
SEG7LED = mm;
SEGCHNL = i;
dusec(5000);
}
dusec(1000);
}
การทดลองท 3.3_________________________________________________________________________
/* Filename lab03_3s.C
Description Send data
Clock 11.0592 Mhz
Compiler Keil CA51 v2.20a
*/
#include<reg51.h>
#include <intrins.h>
#include <absacc.h>
char send_data[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned int bytecounter; //Data counter
sbit strobe=P1^0;
/********** BASIC FUNCTION **********/
void delayms(unsigned int count2)
305381 Microcontroller Interface Lab 1 15
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
{
TMOD = (TMOD & 0xF0) | 0x01;
/* Set T/C0 Mode */
TR0=1;
while (count2)
{if (TF0==1)
{
TR0=0; /* Stop Timer 0*/
TF0=0;
count2--;
TH0 = 0xD8; /* Load Timer with FFFFH- 10000 */
TL0 = 0xEA;
TR0 = 1; /* Start Timer 0*/
}}}
/*******************************************/
void main()
{
strobe = 1; //set STB to high
delayms(300); //Wait subroutine
for(bytecounter=0;bytecounter<=10;bytecounter++)
{
strobe = 0; //set STB to low
P0 = send_data[bytecounter]; //Send the data
delayms(300); //Wait subroutine
strobe = 1; //set STB to high
delayms(300); //Wait subroutine
}
}// end of main()
_______________________________________________________________________________________________
/* Filename lab03_3r1.C
Description Receive data (Polling)
Clock 11.0592 Mhz
Compiler Keil CA51 v2.20a
*/
#include<reg51.h>
#include <intrins.h>
#include <absacc.h>
#define SEG7 XBYTE [0xD000]
#define DIGIT XBYTE [0xF000]
char rec_data[11];
unsigned int bytecounter,i; //Data counter
sbit strobe=P3^2;
/*******************************************/
void dusec (unsigned int count) { // mSec Delay
305381 Microcontroller Interface Lab 1 16
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
unsigned int j;
while (count) {
j = 10; while (j>0) j--;
count--;
}
}
/*******************************************/
void main()
{
bytecounter=0;
P1=0xff;
while(1)
{
if(strobe==0)// Wait until P3.2 = 0
{
if (bytecounter<=10)
{
rec_data[bytecounter] = P1; //receive the data
L1: if (strobe==0){goto L1;} // Wait for sender to finish sending old value
bytecounter++; // Next data address to be stored
}
}//end if
for(i=0;i<=5;i++)
{
SEG7 = rec_data[i];
DIGIT = i;
dusec(50);
}
}// end while
}// end of main()
_______________________________________________________________________________________________
/* Filename lab03_3r2.C
Description Receive data (Interrupt)
Clock 11.0592 Mhz
Compiler Keil CA51 v2.20a
*/
#include<reg51.h>
#include <intrins.h>
#include <absacc.h>
#define SEG7 XBYTE [0xD000]
#define DIGIT XBYTE [0xF000]
305381 Microcontroller Interface Lab 1 17
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
char rec_data[11];
unsigned int bytecounter,i; //Data counter
/*******************************************/
void int0_ISR (void) interrupt 0
{
rec_data[bytecounter] = P1; //receive the data
bytecounter++; // Next data address to be stored
}
/*******************************************/
void dusec (unsigned int count) { // uSec Delay
unsigned int j; // Keil CA51 (x2)
while (count) {
j = 10; while (j>0) j--;
count--;
}
}
/*******************************************/
void main()
{
P1=0xff;
bytecounter=0;
IT0=1; // use edged triggering interrupt
IE=0x81; // Enable interrupt for INT 0
while(1)
{
for(i=0;i<=5;i++)
{
SEG7 = rec_data[i];
DIGIT = i;
dusec(50);
}// Other Operations
}
}// end of main()
Reference
http://www.keil.com/support/man/docs/c166/c166_libref.htm
305381 Microcontroller Interface Lab 1 18
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร
การบาน
1. จากการทดลอง 3.2 เขยนโปรแกรม เพอสงขอมลจากบอรดไมโครคอนโทรลเลอรหนงไปยงบอรดไมโครคอนโทรลเลอรอก
บอรดหนงแบบอนกรมพรอมแสดงขอมลทสงบน 7 segment
305381 Microcontroller Interface Lab 1 19
ภาควชาวศวกรรมไฟฟาและคอมพวเตอร มหาวทยาลยนเรศวร