우리는 프로그램의 60 %를 완료했지만 2 가지 문제가 발생했습니다 첫 번째 문제는 엔진을 5 초 동안 냉각해야한다는 것입니다. 은 10 초 동안 가열해야합니다. 이 스위치에서 내가하지 않으면 다시 작동하지 같은 중지해야 할 것은 다시microC 임베디드 시스템의 일부 오류
이 우리의 프로젝트입니다 : -
스위치 0 컨트롤 자동차의 작업 (0 무 조작을) (1 차 작동하는 경우) 우리가 이 부분과 함께 완료
스위치 1은 안전 벨트 용입니다 : 우리는
스위치 2 도어입니다이 부분 완료 : 우리는이 부분을 우리가 만드는에서이 부분
으로 수행하는 것이하지만 문제는이 1 시간 만 수행해야합니다! 하지만 우리는 while 루프를 영원히 가지고 있기 때문에 멈추지 않을 것입니다 !! 그래서 우리가해야 할 일?! 차량이 작동하는 동안
, 엔진이 가열 될 15 초를 취할 것입니다 : 를 시작 부분에 -> 'HH하는 것은'LCD에 표시됩니다, 히터가 켜집니다 응용 프로그램 보드 주도하고 동시에 모터에서 5 초 동안 정방향으로 작동하여 냉각시킵니다. 그러면 LCD에 'HN'이 표시됩니다. 그 후 엔진은 가열되기까지 10 초가 소요됩니다.
이것은 우리가 할 수없는 두 번째 문제입니다! 우리는 루프 내부의 루프를 다른 루프 내부의 루프로 만드는 것에 대해 생각하지만 도 작동하지 않습니다. 또한 타이머로 내부에서 다른 타이머를 시도합니다! 우리는 타이머 또는 인터럽트를 사용해야합니다. 사용 지연은 없습니다.
연료 레벨을 나타내는 데 4 개의 LED가 있습니다. 10 초마다 하나의 LED가 꺼집니다. 마지막으로 LED가 켜지면 경고가 나타납니다. (1) LCD의 2 번 줄에 'FL'이 표시됩니다. 스위치 3이 켜지면 자동차가 완전히 꺼집니다. 그렇지 않으면 자동차가 꺼집니다.
이것은 코드입니다!
sbit LCD_RS at RA1_bit;
sbit LCD_RW at RA2_bit;
sbit LCD_EN at RA3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISA1_bit;
sbit LCD_RW_Direction at TRISA2_bit;
sbit LCD_EN_Direction at TRISA3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
int i;
sbit LED0 at RC0_bit;
sbit LED1 at RC1_bit;
sbit LED2 at RC2_bit;
sbit LED4 at RC4_bit;
sbit LED5 at RC5_bit;
sbit LED6 at RC6_bit;
sbit LED7 at RC7_bit;
sbit Switch0 at RB0_bit;
sbit Switch1 at RB1_bit;
sbit Switch2 at RB2_bit;
sbit Switch3 at RB3_bit;
int Num;
void Move_Delay() { // Function used for text moving
Delay_ms(1000); // You can change the moving speed here
}
void main() {
ADCON1 = 0X06; //a port as ordinary i/o.
TRISA=0X00; //a port as output.
TRISD=0X00; //d port as output.
TRISC=0X00;
TRISB=0X0F;
PORTC = 0b00000000;
OPTION_REG = 0xD2;
Num = 0; //clear the number of overflows
OPTION_REG = 0x82; //Timer, Internal cycle clock (Fosc/4)
//Prescaler is assigned to the TMR0 timer/counter
//Prescaler (1:128) is assigned to the timer TMR0
TMR0 = 56; //Timer T0 counts from 39 to 255
INTCON.T0IF=0;
Lcd_Init(); // Initialize LCD
Delay_ms(200);
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);
LED0 = 0;
LED1= 0;
do {
if (Switch0)
{
Delay_ms(200); // pause 20 mS
if(INTCON.T0IF) //check for TMR0 register overflow
{
Num ++; // overflow causes Num to be incremented by 1
TMR0 = 56; // TMR0 returns to its initial value
INTCON.T0IF = 0 ; // Bit T0IF is cleared
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,2,"cooling");
}
if(Num ==108)
{
Lcd_Cmd(_LCD_CLEAR);
LED0=~LED0;
Lcd_Out(1,2,"heater ");
Delay_ms(1000);
}
}
else
Lcd_Cmd(_LCD_CLEAR);
if (switch1)
{
Delay_ms(20); // pause 20 mS
Lcd_Out(2,1,"BO");
LED1=0;
}
else
{
if(INTCON.T0IF) //check for TMR0 register overflow
{
Num ++; // overflow causes Num to be incremented by 1
TMR0 = 39; // TMR0 returns to its initial value
INTCON.T0IF = 0 ; // Bit T0IF is cleared
/*Lcd_Cmd(_LCD_CLEAR);*/
Lcd_Out(2,1,"BF ");
LED1=~LED1;
}
if(Num == 108)
{ //after 108 overflows
Num = 0;
}
}
if (switch2)
{
Lcd_Out(2,5,"DO");
LED2=0;
}
else
{
if(INTCON.T0IF) //check for TMR0 register overflow
{
Num ++; // overflow causes Num to be incremented by 1
TMR0 = 39; // TMR0 returns to its initial value
INTCON.T0IF = 0 ; // Bit T0IF is cleared
/*Lcd_Cmd(_LCD_CLEAR);*/
Lcd_Out(2,5,"DF");
LED2=~LED2;
}
if(Num == 108)
{ //after 108 overflows
Num = 0;
}
}
는 //이 잘못
if(switch3)
{
Delay_ms(500); // Clear display
//Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1," FFFFFFFFFF"); // Write text in first row
Delay_ms(500);
for(i=0; i<15; i++) { // Move text to the right 7 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
if(i==14)
{
Lcd_Cmd(_LCD_CLEAR); // Cursor off
Lcd_Out(1,1," warning !! ");
Delay_ms(1000);
}
}
}
} while(1);
}
죄송합니다. 너무 많이 설명하지 않아서 죄송합니다.하지만 질문의 같은 부분에서 우리 프로젝트의 문제를 설명했습니다. 나는 질문을하고 각 부분 위에 나는 우리의 문제를 설명한다. 나는 첫 번째 문제를 다시 설명했으며이 문제의 코드는 타이머 인 루프 이후의 코드에서 첫 번째 부분이며 가열 및 냉각 과정을 포함합니다. 두 번째 부분은 내가 어떻게 그렇게 많은 시간을 시도하고 이것이 우리의 시도 중 하나인지 몰라 설명했다. 그래서 나는 그 아이디어가 무엇인지 알 필요가있다. – student
을 사용할 수는 있지만 주요 부분은 사용할 수 없습니다. 예를 들어 10을 위해 LED를 켜야 할 경우 타이머가 아닌 지연을 사용해야합니다. 우리는 귀하의 작업에 감사하지만 귀하의 코드는 작동하지 않습니다. 고맙습니다 . – student
코드가 작동하지 않아야합니다. 이것은 메인 루프가 연속적으로가 아니라 모든 프로세스를 동시에 처리 할 수있는 방법을 보여주는 예입니다. –