วันเสาร์ที่ 11 สิงหาคม พ.ศ. 2550

การเสนอผลงานครั้งที่2

1. SENSOR : Optical Encoder
โดยกลุ่มผม นำ Optical Encoder และ วงจรภายใน ของเมาส์ชนิดลูกกลิ้ง มาประกอบใช้ในการวัดความเร็วลม และเมื่อนำ Ossiloscope มาวัดหาสัญญาณพบว่าเมื่อ เฟืองของเมาส์ หมุนไป 1 เฟือง เกิดสัญญาณพัลส์มากว่าหนึ่งสัญญาณ และหมุนเฟืองไปเรื่อยๆ พบว่ามีการเปลี่ยนแปลงสัญญาณที่ไม่แน่นอน ซึ่งเป็นรหัสในการบอกตำแหน่งในการเลื่อนของเมาส์ จึงทำให้ต้องมีการดัดแปลงวงจรของเมาส์เพื่อให้เหมาะแก่การใช้งานในการที่จะวัดความเร็วลม โดยให้ 1 เฟือง เท่ากับ 1 พัลส์ ใน 1 รอบ จะมี 36 เฟือง เมื่อหมุนครบ 1 รอบจะเกิดพัลส์ 36 พัลส์ และนำค่าที่ได้มาเข้าไปทาง input ของ control board และนำไปเขียนโปรแกรมต่อไป




ภาพนี้แสดง การใช้ใบพัดในการวัดความเร็วลม โดยผ่าน Optical Encoder แล้วนำสัญญาณพัลส์ input ไปยัง control board




ภาพนี้แสดง การต่อใบพัดให้เข้ากับเฟือง


__________________________________________________________



2.ส่วนประกอบของ control board




ส่วนประกอบของ Control Board
1. MCS-51 #AT89S8252 Microcontroller
2. Input 9-12V DC or AC Power Supply
3. 72IOZ80 EXP 34 PIN Interface
4. EXP 20 PIN Emulate (AT89C1051, AT89C2051, AT89C4051) Interface
5. Reset Switch
6. On-Board Download (ET-PSPI) Interface
7. IC #75176 for RS422 / RS485 Communication
8. RS422/RS485 Communication Interface
9. RTC #DS1307
10. RS232 Communication Interface
11. EEPROM #24XX
12. 4 Bit LCD (Character) Interface
13. 12 Bit 2 Channel Analog to Digital Interface
14. ADC #LTC1298
15. Status LED สีเขียวแสดงสถานะของการดาวน์โหลด และสีแดงแสดงสถานะของไฟเลี้ยงบอร์ด




ในส่วนของผังวงจร แสดงได้ดังนี้

___________________________________________________________




3.การเขียนโปรแกรมเพื่อให้หน้าจอ LCD แสดงผล

การเขียนโปรแกรมเพื่อให้หน้าจอ LCD แสดงผล

  1. โปรแกรมที่ใช้คือ C51 v808a ของ KEIL uvision3

  2. เมื่อ เขียนโปรแกรมเสร็จแล้ว นำไป สร้างเป็น HEX.file

  3. แล้วนำไปโหลดลงตัว AT 89S8252(Control Board)


__________________________________________________

4.การเขียนคำสั่งในภาษาC



  • เขียนโปรแกรมให้จอ LCD แสดงผล เป็นตัวอักษรที่อยู่กับที่

#include
void lcd_command(unsigned char com);
void lcd_text(unsigned char text);
void delay_lcd(unsigned int time);
void lcd_init(void);
void clrs(void);
sbit e = P1^2;
sbit rs = P1^3;
void main(void)
{delay_lcd(500);
lcd_init();
lcd_text('S');
lcd_text('A');
lcd_text('M');
lcd_text('R');
lcd_text('A');
lcd_text('E');
lcd_text('N');
lcd_text('G');
lcd_text(' ');
lcd_text(' ');
lcd_text('T');
lcd_text('E');
lcd_text('M');
lcd_text('R');
lcd_text('A');
lcd_text('M');

while(1)
{
}
}
void lcd_command(unsigned char com)
{
unsigned char buff;
buff = com & 0xf0;
rs = 0;
e = 1;
P1 = (P1 & 0x0f)buff;
delay_lcd(1);
e = 0;
delay_lcd(1);
buff = (com & 0xff)<<4;
rs = 0;
e = 1;
P1 = (P1 & 0x0f)buff;
delay_lcd(1);
e = 0;
delay_lcd(1);
}
void lcd_text(unsigned char text)
{
unsigned char buff;
buff = text & 0xf0;
rs = 1;
e = 1;
P1 = (P1 & 0x0f)buff;
delay_lcd(1);
e = 0;
delay_lcd(1);
buff = (text & 0x0f)<<4;
rs = 1;
e = 1;
P1 = (P1 & 0x0f)buff;
delay_lcd(1);
e = 0;
delay_lcd(1);
}void lcd_init()
{
delay_lcd(50);
lcd_command(0x33);
delay_lcd(50);
lcd_command(0x32);
delay_lcd(50);
lcd_command(0x28);
delay_lcd(50);
lcd_command(0x0C);
}
void delay_lcd(unsigned int time)
{
unsigned int x;
for(x=0;x < time;x++);
}

  • เขียนโปรแกรมให้จอ LCD แสดงผล เป็นการแสดงผลการเปลี่ยนไปของตัวเลข 0001-1500 วน loop ไปเรื่อยๆ

#include
sbit e = P1^2;
sbit rs = P1^3;
unsigned int value;
code unsigned char number[]={'0','1','2','3','4','5','6','7','8','9'};
void lcd_command(unsigned char com);
void lcd_text(unsigned char text);
void delay_lcd(unsigned int time);
void lcd_init(void);
void lcd_clr(void);
void clrs(void);
void get_bcd(unsigned int k);
unsigned char a,b,c,d;
void main(void)
{
delay_lcd(500);
lcd_init();
lcd_text('S');
lcd_text('A');
lcd_text('M');
lcd_text('R');
lcd_text('A');
lcd_text('E');
lcd_text('N');
lcd_text('G');
delay_lcd(5000);
lcd_clr();
lcd_command(0x80);
delay_lcd(50);
value=0;
while(1)
{
while(value<=1500)
{
get_bcd(value);
lcd_command(0x80);
delay_lcd(50);
lcd_text(number[a]);
lcd_text(number[b]);
lcd_text(number[c]);
lcd_text(number[d]);
delay_lcd(5000);
++value;
}
value=0;
}
}
void lcd_command(unsigned char com)
{
unsigned char buff;
buff = com & 0xf0;
rs = 0;
e = 1;
P1 = (P1 & 0x0f)buff;
delay_lcd(1);
e = 0;
delay_lcd(1);
buff = (com & 0xff)<<4;
rs = 0;
e = 1;
P1 = (P1 & 0x0f)buff;
delay_lcd(1);
e = 0;
delay_lcd(1);
}
void lcd_text(unsigned char text)
{
unsigned char buff;
buff = text & 0xf0;
rs = 1;
e = 1;
P1 = (P1 & 0x0f)buff;
delay_lcd(1);
e = 0;
delay_lcd(1);
buff = (text & 0x0f)<<4;
rs = 1;
e = 1;
P1 = (P1 & 0x0f)buff;
delay_lcd(1);
e = 0;
delay_lcd(1);
}void lcd_init()
{
delay_lcd(50);
lcd_command(0x33);
delay_lcd(50);
lcd_command(0x32);
delay_lcd(50);
lcd_command(0x28);
delay_lcd(50);
lcd_command(0x0C);
}
void delay_lcd(unsigned int time)
{
unsigned int x;
for(x=0;x < time;x++);
}
void lcd_clr(void)
{
lcd_command(0x01);
delay_lcd(50);
}
void get_bcd(unsigned int k)
{a=b=c=d=0;
a=k/1000;
k%=1000;
b=k/100;
k%=100;
c=k/10;
k%=10;
d=k;
}

____________________________________________________