Download presentation
Presentation is loading. Please wait.
1
마이크로소프트 박종호
2
서론 8051로 무엇을 할 것인가? 링카운터 존슨카운터 +@ 학번
3
순서 1.회로도 2. 실행프로그램 1 3. 실행프로그램 2 4. 학번 5. 프로그램 설명
4
1.회로도
5
2. 실행프로그램 1 1)링카운터(LEFT ▷ RIGHT) LED가 오른쪽으로 켜지면서 이동
2)링카운터(RIGHT ▷ LEFT) LED가 왼쪽으로 켜지면서 이동 3) (LEFT ▷ RIGHT) LED가 오른쪽으로 꺼지면서 이동 4 (RIGHT ▷ LEFT) LED가 왼쪽으로 꺼지면서 이동
6
2-1 링 카운터(LEFT ▷ RIGHT) 스위치 :■ □ □ □ (■ = on. □ = off)
7
2-2 링 카운터(RIGHT ▷ LEFT) 스위치 : ■ □ ■ □ (■ = on. □ = off)
8
2-3 +@(LEFT ▷ RIGHT) 스위치 : ■ □ ■ ■ (■ = on. □ = off)
9
2-4 +@(RIGHT ▷ LEFT) 스위치 : ■ □ □ ■ (■ = on. □ = off)
10
3. 실행프로그램 2 1)존슨 카운터 (LEFT ▷ RIGHT) 오른쪽으로 하나씩 LED 켜짐
2)존슨 카운터 (RIGHT ▷ LEFT) 왼쪽으로 하나씩 LED 켜짐 추가 (LEFT ▷ RIGHT) 오른쪽으로 하나씩 LED 꺼짐 추가 (RIGHT ▷ LEFT) 왼쪽으로 하나씩LED 꺼짐
11
3-1 존슨 카운터 (LEFT ▷ RIGHT) 스위치 :□ ■ □ □ (■ = on. □ = off)
12
3-2 존슨 카운터 (RIGHT ▷ LEFT ) 스위치 :□ ■ ■ □ (■ = on. □ = off)
13
3-3 ▷ RIGHT) 스위치 :□ ■ ■ ■ (■ = on. □ = off)
14
3-4 (RIGHT ▷ LEFT ) 스위치 :□ ■ □ ■ (■ = on. □ = off)
15
4. 학번 INT0 키(토글 스위치)를 누를 때마다 학번이 순서대로 찍힘.
‘2’ ‘0’ ‘0’ ‘2’ ‘1’ ‘7’ ‘5’ ‘3’ 순으로.
16
5.프로그램 설명 include "C:\mda\Sim51\C\INC\win51.h" #define SELECT (*(unsigned char*)(0x2fc48)) void L1(); //함수이름 2-1 프로그램 void L2(); //2-2 프로그램 void R1(); //2-3 프로그램 void R2(); //2-4 프로그램 void L3(); //3-1 프로그램 void L4(); //3-2 프로그램 void R3(); //3-3 프로그램 void R4(); //3-4 프로그램 void REQ(); //스위치 값 확인 프로그램 //p0는 앞부븐 세그먼트 뒷부분 스위치.p1는 led char led, sw, select, a, b, c, d, e, f, g, h ,i; char count = 0; //인터럽트 횟수를 저장. sbit sw1=P0^4; //포트를 비트단위로 sbit sw2=P0^5; sbit sw3=P0^6; sbit sw4=P0^7;
17
/* 스위치 구문을 사용해서 스위치 상태에 맞는 함수를 실행 시킨다*/
void delay(int del) { while(del--); //딜레이 함수 } void main(void) SELECT = 0x9c; IT0= 1; //인터럽트 0 EX0 =1; //외부인터럽트 set EA = 1; //모든 인터럽트 set PX0= 1; // 인터럽트0을 우선순위 REQ(); //스위치 값을 체크. while(1) P1 = 0xff; //LED에 초기값으로 점등 옆으로-> switch(select) //스위치 상태를 ‘select’로 저장 { case 1: L1(); break; case 2: L2(); break; case 3: R1(); break; case 4: R2(); break; case 5: L3(); break; case 6: L4(); break; case 7: R3(); break; case 8: R4(); break; } /* 스위치 구문을 사용해서 스위치 상태에 맞는 함수를 실행 시킨다*/
18
//링카운터 void L1() //왼쪽부터 점등이동 { do P1= led = 0x7f; //초기값 지정 delay(40000); //지연 for(i=0; i<8;i++) //조건 반복 REQ(); // 스위치 상태 읽음 if(a!=1) break; //스위치 값이 변경되면 빠져나감 delay(40000); led = (led>>1)| 0x80; P1 = led; } }while(a); //스위치 값이 바뀌면 while문을 빠져나감 옆으로-> //링카운터 void L2(void) //오른쪽부터 점등이동 { do P1 = led = 0xfe; delay(40000); for(i=0; i<8;i++) REQ(); if(b!=1) break; //스위치 값이 바뀌면 빠져나감 led = (led <<1)|0x01; P1= led; } }while(b); } //스위치값이 유지되면 b=1 무한반복 //스위치 갑이 바뀌면 b=0 종료
19
프로그램 void R1(void) //왼쪽부터 점등 꺼지며 이동 { do P1 = led = 0x80; delay(40000); for(i=0; i<8;i++) REQ(); if(c!=1) break; led = (led >>1); P1= led; } }while(c); 옆으로-> 프로그램 void R2(void) //오른쪽 부터 점등 꺼지며 이동 { do P1 = led = 0x01; delay(40000); for(i=0; i<8;i++) REQ(); if(d!=1) break; led = (led <<1); P1= led; } }while(d);
20
//존슨 프로그램 void L3(void) //왼쪽부터 점등 하나씩 증가 { do P1 = led = 0x7f; delay(40000); for(i=0; i<8;i++) REQ(); if(e!=1) break; led = (led >>1); P1= led; } }while(e); 옆으로-> //존슨 프로그램 void L4(void) //오른쪽 부터 점등 하나씩 증가 { do P1 = led = 0xfe; delay(40000); for(i=0; i<8;i++) REQ(); if(f!=1) break; led = (led <<1); P1= led; } }while(f);
21
프로그램 void R3(void)//왼쪽부터 하나씩 꺼짐 { do P1 = led = 0x80; delay(40000); for(i=0; i<8;i++) REQ(); if(g!=1) break; led = (led >>1)|0x80; P1= led; } }while(g); } 옆으로-> 프로그램 void R4(void)//오른쪽부터 하나씩 꺼짐 { do P1 = led = 0x01; delay(40000); for(i=0; i<8;i++) REQ(); if(h!=1) break; led = (led <<1)|0x01; P1= led; } }while(h);
22
//인터럽트 0 함수 void EX(void) interrupt 0 { char num; count++; //인터럽트가 걸릴 때마다 증가 switch(count) case 1: num = 0xf2; P0= num; break; //p0에 ‘2’를 찍음 case 2: num = 0xf0; P0= num; break; //p0에 ‘0’를 찍음 case 3: num = 0xf0; P0= num; break; //p0에 ‘0’를 찍음 case 4: num = 0xf2; P0= num; break; //p0에 ‘2’를 찍음 case 5: num = 0xf1; P0= num; break; //p0에 ‘1’를 찍음 case 6: num = 0xf7; P0= num; break; //p0에 ‘7’를 찍음 case 7: num = 0xf5; P0= num; break; //p0에 ‘5’를 찍음 case 8: num = 0xf3; P0= num; break; //p0에 ‘3’를 찍음 default : count = 0; P0= 0x0f; } /* 카운트 숫자가 증가함에 따라 학번을 찍어낸다, 8을 넘어가면 다시 초기화 */
23
//스위치 값 받는 함수 void REQ(void) { a=b=c=d=e=f=g=h=0; if((sw1==0)&&(sw2==1)) //스위치 1번으로 링을 돌리겠음 if((sw3==1)&&(sw4==1)) //링 카운터 왼 -> 오른쪽 a=1, select=1; else if((sw3==0)&&(sw4==1)) //링 카운터 오른쪽 -> 왼 b=1, select=2; else if((sw3==0)&&(sw4==0)) 왼 ->오른쪽 c=1, select=3; else if((sw3==1)&&(sw4==0)) 오른쪽 ->왼 d=1,select=4; } else if((sw1==1)&&(sw2==0)) // 스위치 2번으로 존슨 돌리겠음 if((sw3==1)&&(sw4==1)) // 존슨 카운터 왼->오른쪽 e=1, select=5; else if((sw3==0)&&(sw4==1)) //존슨 카운터 오른쪽 -> 왼 f=1, select=6; else if((sw3==0)&&(sw4==0)) 왼 -> 오른쪽 g=1, select=7; else if((sw3==1)&&(sw4==0)) 오른쪽 -> 왼 h=1, select=8; //영문 소문자로 값을 받아서 while 구문을 무한 반복시킴 // select 값으로 스위치 구문에서 해당 함수를 호출.
Similar presentations