Hướng dẫn chi tiết bằng hình ảnh sử dụng Visual C để giao tiếp với vi điều khiển
Trang 1B1:Lập trình điều khiển đèn LED1 và LED2 qua các nút nhấn trên giao diện máy tính: Phương pháp:
trên PC: tạo giao diện có 2 nút nhấn led1, led2 khi ta nhấn nút led1 thì truyền ký tự ‘A’ xuống vđk
Khi nhấn nút led2 thì truyền kt ‘B’
Trên VĐK:
khi nhận kt ‘A’ => đk led1 sáng
khi nhận kt ‘B’ => đk led2 sáng
Ngôn ngữ lập trình:
Trên PC: VC++
Trên Vđk: keilc hoặc assembly
Các bước làm:
Trên PC:
B1: tạo giao diện ứng dụng MFC có 2 nút nhấn led1, led2
Chọn giao diện theo kiểu dialog
Chọn thư viện đính kèm
Thêm các nút nhấn vào giao diện
Trang 2Đặt tên cho nút nhấn:
B2: thêm MSCOMM(dùng để điều khiển cổng com) vào project/Add to project/components and control:
Xuất hiện dialog:
Chọn Microsoft communication
Click Ok
Trang 3Kéo biểu tượng điện thoại lên giao diện
B3:Khai báo biến
1 m_mscomm (thuộc lớp Cmscomm) dùng thiết lập cổng com Nhấn Ctrl +W
Trang 4Click vào IDC_MSCOMM1 và click vào Add Variable
Trang 52 m_trans (dùng để truyền dữ liệu) biến này thuộc lớp DLg click vào tab class bên trái(left bottom):
Right click on ClhvtDlg: click add member variable
Xuất hiện hộp thoại
Nhập kiểu dữ liệu(CString) và tên biến(m_trans)
B4: Viết hàm
1 hàm void Setting() dùng thiết lập cổng COM
Chèn tên hàm này vào hàm khởi tạo DLg(giao diện)
Trang 6Gõ kiểu hàm là void tên hàm là Setting()
Click ok=> ra được vị trí của hàm
Gõ lệnh vào(hoặc copy nội dung sau vào)
// if port is already opened then close port
if( m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(false);
m_mscomm.SetCommPort(1); // chon cong com
m_mscomm.SetHandshaking(0); // thiet lap che do bat tay CString strBitRate = "9600";
CString strParity = "None";
CString strDataBit = "8";
CString strStopBit = "1";
CString strSetting;
strSetting.Format("%s,%c,%s,
%s",strBitRate,strParity[1],strDataBit,strStopBit);
Trang 7m_mscomm.SetRThreshold(1); // chon nguong nhan biet co truyen du lieu
// set for input direction
m_mscomm.SetInputLen(1);
m_mscomm.SetInBufferSize(1024);
m_mscomm.SetInputMode(0); //chon che do kieu ma ASCII hay binary m_mscomm.SetOutBufferSize(1024);
m_mscomm.SetPortOpen(true); // mo cong com
Chèn hàm Setting() vào phần khởi tạo:
Double click vào hàm khởi tạo này:
BOOL CLhvtDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About " menu item to system menu
// IDM_ABOUTBOX must be in the system command range
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
Trang 8// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control }
=> gõ Setting() vào dưới dòng sau:
// TODO: Add extra initialization here
Setting();
B5: Viết lệnh cho các nút nhấn LED1 và LED2
Double click on LED1 button:
void CLhvtDlg::OnLed1()
{
m_trans='A';
m_mscomm.SetOutput((COleVariant)m_trans);
}
Double click on LED2 button:
=>
void CLhvtDlg::OnLed2()
{
m_trans='B';
m_mscomm.SetOutput((COleVariant)m_trans);
}
Đã xong=>chạy CT
Trang 9Trên Proteus:
Vẽ mạch VĐK kết nối 2 led Vẽ mạch VĐk kết nối cổng COM Trên keilc=>Viết CT:
Khởi động keilc :=> vào project/new
Chọn vđk
Viết file led.c
Click on file/ new
Gõ lệnh hoặc copy:
#include <REGX51.H>
#include <stdio.h>
//=========================
#define led1 P0_0
#define led2 P0_1
//=========================
unsigned char ch,abc;
//==========================
Trang 10void SetupSerial()
{
SCON = 0x52; /* Che do 1: 8-bit UART, cho phep truyen */ TMOD = 0x20; /* timer 1 che do 2: 8-Bit tu dong nap lai */ TH1 = 0xfd ; /* toc do 9600 baud */
TL1 = 0xfd ;
TI = 0; /* co ngat nha^n.=0*/
RI=0; /* co ngat' truye^n =0*/
TR1 = 1; /* timer 1 run */
ES =1; /* cho phep ngat noi tiep */
}
//===========================
void nhan(void) interrupt 4 //Chuong trinh con dung ngat noi tiep {
char ch;
if(RI)
{
RI=0;
ch=SBUF;
SBUF=ch;}}
//===========================
void delay(long time)
{ long n;
for(n=0;n<time;n++){;}
}
void main()
{
SetupSerial(); //Khoi tao cac thong so cho truyen thong noi tiep
EA = 1; //Cho phep ngat nhung chi có ngat noi tiep duoc dung // VIET CT:
while(1)
{
if (SBUF==65){ //65 la ma DEC cua chu A
led1=0;
led2=1;
}
if (SBUF==66){ //66 la ma DEC cua chu B
led1=1;
led2=0; }
}
}
Lưu lại:
Trang 11Thêm file dkleddon.c vào project
Trang 12Thiết lập thông số cho vđk:
chọn thạch anh 12 Mhz
chọn tab output; chọn tùy chọn tạo file hex
Click build để tạo file hex:
Kết thúc keil c
Trang 13THIẾT LẬP KẾT NỐI PC<-> PROTEUS DÙNG COM ẢO:
LƯU Ý: CHỌN CỔNG COM X KHÔNG CÓ TÊN SAU ĐÂY(TÙY THUỘC VÀO MỖI MÁY):
Giả sử chọn cổng COM1 (nếu chọn cổng COM khác thì phải vào VC++ chỉnh lại tên cổng com trong hàm Setting())
Chọn COM1 kết nối COM4
=>
Chạy PROTEUS:
Vẽ mạch
NẠP chương trình cho vđk:
Chọn file hex đã dịch trên keilc
Trang 14Chạy PROTEUS VÀ CT TRÊN VC++
Trang 15Viết CT nhấn nút chớp tắt(gửi ký tự C)=> LED1 và LED2 sẽ chớp tắt 500ms Nhấn nút stop (tương ứng ký tự S) thì 2 led tắt