#include<AT89x51.h>
#include<stdio.h>
#include"LCD.H"
int t_on, t_off, en_ent, lev_int;
char tim_cnt, level, m_onoff;
//외부 인터럽트 0서비스 루틴(모터 속도 증가)
void int0(void) interrupt 0 using 2
{
EA =0;
TR0 =0;
TR1 = 0;
if(level != 10){ //모터 속도 = 최고속도
//모터 속도 증가를 t_on시간 증가와 t_off시간 감소
//t_on = t_on + lev_int, t_off = t_off - lev_int
level++; // 모터 속도 레벨 1 증가
t_on + = lev_int;
t_off-=lev_int;
}
TR0 =1;
TR1 =1;
EA =1;
}
//타이머/카운터 0 인터럽트 서비스 루틴
//PWM 펄스 출력과 함께 1초 측정
void timer0(void) interrupt 1 using 2
{
EA = 0;
TR0 = 0;
RT1 = 0;
if(m_onoff == 0) { //현재 모터 상태, On 상태이면 Off 상태로
// 모터의 OFF 상태에서 ON tkdxofh
// (TH0, TL0) <-T_on;
tim_cnt++; //모터의 OFF상태에서 ON상태로
//바뀔때마다 +1한다.
//즉, 이 값이 50이면 1초가 된다.
TH0 = (char)((65536-t_on)>>8);
TL0 = (char)((65536-t_on)&0x00FF);
P1_0 = 1; //모터 ON
m_onoff = 1 //모터를 ON상태로
}
else {
//모터의 ON상태에서 OFF상태로
//(TH0,TL0)<-t_off;
TH0 = (char)((65536-t_off)>>8);
TL0 = (char)((65536-t_off)&0x00FF);
P1_0 = 0; //모터 OFF
m_onoff = 0;
}
TR0 = 1;
TR1 = 1;
EA = 1;
]
//외부 인터럽트 1 서비스 루틴 (모터 속도 감소)
//t_on = t_on - lev_int, t_off = t_off + lev_int
void int1(void) interrupt 2 using 2
{
EA = 0;
TR0 = 0;
TR1 = 0;
if(level != 0){
level--;
t_on -= lev_int;
t_off += lev_int;
}
TR0 = 1;
TR1 = 1;
EA = 1;
}
//타이머/카운터 1 인터럽트 서비스 루틴(모터 회전수 카운트)
//모터 1 회전마다 1개의 펄스가 T1ekswkfmf xhdgo dlqfurehlamfh
//펄스가 1개 입력될 때마다 회전수값을 +1한다.
void timer1(void) interrupt 3 using 2
{
EA = 0;
TR0 = 0;
RT1 = 0;
en_cnt++;
TR0 = 1;
RT1 = 1;
EA = 1;
}
void Display(int cnt)
{
char temp[10];
sprintf(temp, "%d", cnt);
LCD_String(temp);
}
void main(void)
{
LCD_Init(); //LCD 초기화
//타이머/카운터0 -> 타이머모드1(16비트), PWM출력, 1초 측정
//타이머/카운터1 -> 카운터모드2(오토), 모터의 회전수 카운트
TMOD = 0x61;
//20ms(50Hz)마다 1주기의 클럭 발생
//20ms동안 Higt되는 시간(t_on)과 Low 되는 시간 (t_off)을
//조절하여 모터 속도 제어
//20ms마다 인터럽트를 걸기 위한 시정수
//20ma / 1.085ua = 18433
level = 0; //모터 속도 레벨 0
//모터 ON시간 = OFF시간
t_on = 9216; // 18433/2
t_off= t_on;
//모터 속도 가감을 위한 타이머 증분치값 설정
lev_int = 921;
//t_on 시간을 위한 시정수 타이머 증분치값 설정
//(TH0, TL0)<-65536 - t_ON
TH0 = (char)((65536-t_on)>>8);
TL0 = (char)((65536-t_on)&0x00FF);
//모터의 회전수를 카운트하기 위한 설정
//모터가 1회전할 때마다 인터럽트가 걸릴
//필요가 있으므로 255값을 설정
TH1 = 255; //오토 리로드 값
Tl1 = 255; //초기값
m_onoff = 1;
tim_cnt = 0;
en_cnt = 0;
IT0 = 1;
IT1 = 1;
EX0 = 1;
EX1 = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
EA= 1;
P1_0 = 1;
while(1){
while(tim_cnt != 50);
EA = 0;
TR0 = 0;
TR1 = 0;
tim_cnt = 0;
Command(HOME);
Display(en_cnt);
en_cnt = 0;
TR0 = 1;
TR1 = 1;
EA = 1;
}
}
void int0(void) interrupt 0 using 2
(
EA = 0;
TR0 = 0;
if(mot_mod == 0)(
p1_1 = 1;
p1_2 = 1;
mot_mod = 1;
}
else if(mot_mod == 1){
P1_2 = 0;
P1_1 = 0;
mot_mod =2;
P1_2 = 1;
}
else {
P1_2 = 0;
mot_mod = 0;
}
TR0 = 1;
EA = 1;
}
void timer0(void) interrupt 1 using 2
{
EA = 0;
TR0 = 0;
if(m_onoff == 0){
TH0 = (char)((65536-t_on)>>8);
TL0 = (char)((65536-t_on)&0x00FF);
P1_0 = 1;
m_onoff = 1;
}
else{
TH0 = (char)((65536-t_off)>>8);
TL0 = (char)((65536-t_off)&0x00ff);
P1_0 = 0;
m_onoff = 0;
}
TR0 = 1;
EA = 1;
}
void main(void)
{
P1_2 = 0;
mot_mod = 0;
TMOD = 0x01;
t_on = 16590;
t_off = 1843;
TH0 = (char)((65536-t_on)>>8);
TL0 = (char)((65536-t_on)&0x00FF);
IT0 = 1;
EX0 = 1;
ET0 = 1;
TR0 = 1;
EA = 1;
while(1);
}
헤더 파일로 넘어가지 않는다는게 무슨뜻인지 이해가 안되네요... 보니깐 LCD로 출력하게 안된다는 건가요??? 프로젝트내 헤더파일 추가는 하신걸테고... 흠.. 저건만 봐서는 잘 모르겠네요..