我们有一个项目,我们完成了60%的计划,但我们遇到了2个问题 我们的第一个问题是让发动机冷却5秒钟然后再冷却 应该加热10秒然后它应该停止,因为它不能再次工作,除非我再次在开关上
这是我们的项目: -
开关0控制汽车的操作(0无操作)(1辆汽车正在运行) 我们完成了这部分
开关1用于安全带: 我们完成了这部分
开关2用于门: 我们完成了这部分
在这部分我们做到了,但问题应该只进行一次!! 但因为我们永远有一个while循环它不会停止!! 那么我们该怎么办?!
当汽车运转时,发动机需要15秒才能加热: 在开头 - > ' HH'将显示在LCD上,应用板上的加热器LED将打开并在 同时电机将在正向运行5秒钟以冷却它。 SO' HN'将显示在LCD上 之后,发动机将需要10秒才能加热。
这是我们无法做到的第二个问题!! 我们考虑在另一个循环中的循环内部进行循环,但它会 不工作也我们尝试通过计时器和内部另一个计时器! 我们应该通过计时器或中断我们不能使用延迟
我们将有4个LED代表燃料水平。 每10秒一个领导将关闭。 当最后一个led仍然存在时,将出现警告: (1)' FL''将显示在LCD上的第2行。 如果开关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);
}
答案 0 :(得分:1)
答案不是很好,但很难说评论。
你没有清楚说明你的两个问题。第一个问题没有代码,似乎是关于加热发动机的问题。关于第二个问题,你只是说“它不起作用”,不说什么。
我还想在你的作品中放一把扳手,并询问如果打开车门,或者在操作阶段释放安全带会发生什么。保持单个状态变量有时是一个好主意,每个值都有一个位字段,例如“门关闭”,“安全带固定”,“通电”等。
我注意到您使用了delay()
,尽管您说不能。在现实世界中,进程控制器成功使用delay()
函数的唯一方法是,如果有其他线程或中断例程,则负责处理I / O和调度事件。任何嵌入式控制器的一个基本功能是在中断时提供服务的计时器滴答,允许您在不阻塞其他进程的情况下进行延迟(同一个处理程序也可以轮询和去抖键盘和按钮输入)。假设您的常规定时器中断会增加一个名为unsigned ticks
的变量。作为一个例子(与你的任务含糊不清):
unsigned mark, elapsed;
int heating = 0;
while (1) { // main operational loop
if (buttonpress) { // pseudo code
heating = 1; // flag stage one of heater
mark = ticks; // start a delay
}
... // service the fuel usage
... // check the door
... // check the seat belt
if (heating) {
elapsed = ticks - mark; // don't directly compare...
if (elapsed >= 1000) { // ...because of counter wrap
... // heater jobs
heating = 0; // clear flag
}
}
} // repeat main loop
这可以扩展到加热器过程的几个阶段。