บอกใบ้เยอะแล้วน่ะ...
การทำงานด้านไมโคร ต้องเข้าใจโครงสร้างทั้งอุปกรณ์ วงจร และโปรแกรม เพราะฉะนั้นสิ่งแรกที่ต้องออกแบบมาให้ได้เช่น
- คุมมอเตอร์ไปหน้าไปหลัง ใช้สายควบคุมกี่เส้น เข้าพอร์ทไหน ควบคุมด้วย 0 หรือ1
เช่น 00 คือหยุด 01 คือไปหน้า ,10 กลับหลัง
- คุมมอเตอร์เลี้ยวซ้ายขวา ใช้มอเตอร์แบบไหน สเต็บมอเตอร์คุมองศาได้จริง แบบดีซี ต้องมีการอ่านค่ากลับมาว่าองศาได้จริงไหม เซอร์โวมอเตอร์ก็ดี แล้วขาสัญญาณนั้น ควบคุมกี่เส้น เข้าพอร์ทไหน
- LCD คุมแบบ 4 บิท หรือ 8 บิท กี่บรรทัด
ตัวแปรพวกนี้จะใช้ในการกำหนดพอร์ทต่างๆ ควรทำความเข้าใจก่อนเขียนโปรแกรมควบคุม
หากต้องการให้ช่วย ให้วาดวงจรมาโดยละเอียด (ช่วยได้เฉพาะ MCS-51) การเชื่อมต่อพอร์ท ขาสัญญาณที่ใช้
และสิ่งแรกที่ต้องทำเองให้ได้ก่อน คือการแสดงผลที่หน้าจอ LCD /*
ภาษาซี ( keil ) สำหรับ 8051
*/
#include<reg51.h>
/* กำหนดขาติดต่อของสวิทช์ */
sbit k1= P1^0; //// กำหนดการต่อปุ่มกด
/* สมมุติว่าใช้ พอร์ท 1.0 ต่อ R pull up ไว้ ปกติค่าจะเป็น 1 กดจะเป็น 0 */
sbit k2= P1^1; //// กำหนดการต่อปุ่มกด
sbit k3= P1^2; //// กำหนดการต่อปุ่มกด
sbit k4= P1^3; //// กำหนดการต่อปุ่มกด
/* ตัวแปรสำหรับการกดคีย์ และเลือกค่า */
unsigned char menu=1; ///// menu เก็บค่าฟังชั่นการทำงาน
unsigned char timerDelay=1; ///// timerDelay เก็บค่าฟังชั่นการทำงาน
unsigned char Degree=1; ///// Degree เก็บค่าฟังชั่นการทำงาน
void delay1sec(); /// ฟังชั่นหน่วงเวลา 1 วิ
{
........
}
voide ControlDelay(unsigned char d)
{
unsigned char i;
for(i=0;i<d;i++) //// วนลูปตามเวลาที่กำหนด ค่า d
{
delay1sec(); /// เรียกใช้ฟังชั่นหน่วงเวลา 1 วิ
}
}
/* ฟังชั่นควบคุมการหมุน */
voide ControlDegree(unsigned char dg)
{
/*
สั่งให้มอเตอร์ตัวที่ 2 ตัวคุมคุมการหมุนล้อให้หมุนตามค่า dg
dg= 1 ให้หมุน 15 องศา
dg= 2 ให้หมุน 30 องศา
dg= 3 ให้หมุน 45 องศา
*/
}
/* ฟังชั่นการกดปุ่ม*/
/////////////// key1()
void key1()
{
menu++; //// เพิ่มค่า menu
if(menu==5) //// หากค่า menu เกิน 4 ให้กลับไปเริ่มต้นที่ 1
{
menu=1;
}
if(menu==1) { แสดงผล F }
else if(menu==2) { แสดงผล U }
else if(menu==3) { แสดงผล R }
else if(menu==4) { แสดงผล L }
}
/////////////// key2()
void key2()
{
timerDelay++; //// เพิ่มค่า Delay
if(timerDelay==20) //// หากค่า Delay เกิน 20 ให้กลับไปเริ่มต้นที่ 1
{
timerDelay=1;
}
}
/////////////// key3()
void key3()
{
Degree++;
if(Degree==3)
/* หากค่า Degree เกิน 3 ให้กลับไปเริ่มต้นที่ 1 (15*3 = 45 องศา ) */
{
Degree=1;
}
}
/////////////// key4()
void key4()
{
if(menu==1)
{
/* คุมมอเตอร์ให้ทำงานไฟหน้า*/
.....มอเตอร์หมุนไปหน้า
ControlDelay(timerDelay); /// หน่วงเวลา
.....มอเตอร์หยุดหมุน
}
else if(menu==2)
{
/* คุมมอเตอร์ให้ทำงานถอยหลัง */
.....มอเตอร์หมุนไปหลัง
ControlDelay(timerDelay); /// หน่วงเวลา
.....มอเตอร์หยุดหมุน
}
else if(menu==3)
{
/* คุมมอเตอร์ให้ทำงานเลี้ยวซ้าย */
.....มอเตอร์หมุนไปซ้าย
ControlDegree(Degree);
.....มอเตอร์หยุดหมุน
}
else if(menu==4)
{
/* คุมมอเตอร์ให้ทำงานเลี้ยวขวา*/
.....มอเตอร์หมุนไปขวา
ControlDegree(Degree);
.....มอเตอร์หยุดหมุน
}
}
void Delay() ///// หน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์
{
.
.
.
}
void scankey() ///// ฟังชั่นอ่านค่าการกดปุ่ม
{
if( k1 ==0) /// เมื่อปุ่ม key 1 โดนกด
{
Delay(); ///// ควรหน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์
key1(); /// เรียกใช้ฟังชั่น key1()
}
if( k2 ==0) /// เมื่อปุ่ม key 2 โดนกด
{
Delay(); ///// ควรหน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์
key2(); /// เรียกใช้ฟังชั่น key2()
}
if( k3 ==0) /// เมื่อปุ่ม key 3 โดนกด
{
Delay(); ///// ควรหน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์
key3(); /// เรียกใช้ฟังชั่น key3())
}
if( k4 ==0) /// เมื่อปุ่ม key 4 โดนกด
{
Delay(); ///// ควรหน่วงเวลาเล็กน้อยแก้ปัญหาดีเบาส์ของสวิทช์
key4(); /// เรียกใช้ฟังชั่น key4()
}
}
void LCD_Init() // เซ็ทค่าติดต่อ LCD
{
.
.
.
}
void LCDDisplay() //// แสดงผลที่จอ
{
.
.
.
.
}
void main()
{
k1=1; //// กำหนดพอร์มเชื่อมต่อ key 1 เป็น Hi รองรับการกดปุ่ม เพื่ออ่านค่าเมื่อเป็น LOW ( 0 )
k2=1; //// กำหนดพอร์มเชื่อมต่อ key 2 เป็น Hi รองรับการกดปุ่ม เพื่ออ่านค่าเมื่อเป็น LOW ( 0 )
k3=1; //// กำหนดพอร์มเชื่อมต่อ key 3 เป็น Hi รองรับการกดปุ่ม เพื่ออ่านค่าเมื่อเป็น LOW ( 0 )
k4=1; //// กำหนดพอร์มเชื่อมต่อ key 4 เป็น Hi รองรับการกดปุ่ม เพื่ออ่านค่าเมื่อเป็น LOW ( 0 )
LCD_Init(); // เซ็ทค่าติดต่อ LCD
while(1) /// วนลูบไม่รู้จบ
{
scankey(); /// อ่านค่าการกดปุ่ม
LCDDisplay(); //// แสดงผลที่จอ
}
}