目录
遇到的问题:
1.对于不能实时在DAC输出中对于L8闪烁
2.对于按键低阈值无论是在加减到4.0-4.5之间都会自动模式切换,不能像高阈值一样连贯的切换。
1.首先要将所有模块都测试的肯定是好用的,这样我们才可以开始进行程序的编写。
2.对于每一个模块来说都要进行封装成为一个函数,比如对于数码管显示,就用一个标志位来使用switch显示3中不同的显示界面,LED功能就单独封装一个函数,这样在我们测试或者是修改的时候会大大减轻我们的负担。
#include "smg.h"
#include "iic.h"
#include "KEY4.h"
#include "ultrasonic.h"
void Allinit(void)
{
P2=0x80,P0=0xff;
P2=0xa0,P0=0x00;
P2=0xc0,P0=0xff;
P2=0xe0,P0=0xff;
}
void Key_Port(void);
void SMG_DISPLAY(void);
void LED_PORT(void);
void DAC_Distance(void);
unsigned int ADCRead;
unsigned char Key_Value;
unsigned char Flag;//设置状态(3种切换)
bit Choose;//上下限参数的选择
unsigned int U_UP=45,U_DOWN=5,U_UP_TEMP=45,U_DOWN_TEMP=5;//高低电压参数的选择
unsigned int C_Distance;
void main()
{
Allinit();
Timer0Init();
Timer1Init();
zero=11,one=11,two=11,three=11,four=11,five=11,six=11,seven=11;
while(1)
{
C_Distance=get_distance();
LED_PORT();
SMG_DISPLAY();
Key_Port();
DAC_Distance();
DisPlay1(zero,one);
DisPlay2(two,three);
DisPlay3(four,five);
DisPlay4(six,seven);
}
}
void SMG_DISPLAY(void)
{
ADCRead=ADC_read(0x03);
ADCRead=(int)ADCRead*1.96;
switch(Flag)
{
case 0: zero=23,one=11,two=11,three=11,four=11,
five=ADCRead/100+12,six=ADCRead/10%10,seven=ADCRead%10;break;
case 1:
if(ADCRead>(U_DOWN_TEMP*10)&&ADCRead<(U_UP_TEMP*10))
{
zero=25,one=11,two=11,three=11,four=11;
if(C_Distance>100)
{
five=C_Distance/100,six=C_Distance/10%10,seven=C_Distance%10;
}
else if(C_Distance<100&&C_Distance>10)
{
five=11,six=C_Distance/10,seven=C_Distance%10;
}
else if(C_Distance<10)
{
five=11,six=11,seven=C_Distance;
}
}
if(ADCRead<=(U_DOWN_TEMP*10)||ADCRead>=(U_UP_TEMP*10))
{
zero=25,one=11,two=11,three=11,four=11,
five=24,six=24,seven=24;
}
break;
case 2:
zero=22,one=11,two=11,three=U_UP/10+12,four=U_UP%10,
five=11,six=U_DOWN/10+12,seven=U_DOWN%10;
break;
}
}
void LED_PORT(void)
{
if(ADCRead<=(U_DOWN_TEMP*10)||ADCRead>=(U_UP_TEMP*10))
{
LED_flag=0;
LED_flag_Change=0;
P2=0x80,P0|=0x80,P2=0;
}
if(ADCRead>(U_DOWN_TEMP*10)&&ADCRead<(U_UP_TEMP*10))
{
LED_flag=1;
}
switch(Flag)
{
case 0:P2=0x80,P0&=0xfe,P0|=0x06,P2=0;break;
case 1:P2=0x80,P0&=0xfd,P0|=0x05,P2=0;break;
case 2:P2=0x80,P0&=0xfb,P0|=0x03,P2=0;break;
}
if(LED_flag_Change==1)
{
P2=0x80,P0&=0x7f,P2=0;
}
else if(LED_flag_Change==0)
{
P2=0x80,P0|=0x80,P2=0;
}
}
void Key_Port(void)
{
Key_Value=Key4();
switch(Key_Value)
{
case 4:
if(++Flag==3){Flag=0;U_DOWN_TEMP=U_DOWN,U_UP_TEMP=U_UP;}
if(Flag==2){Choose=0;}
break;
case 5:
if(Flag==2)
{
Choose=~Choose;
}
break;
case 6:
if(Flag==2)
{
if(Choose==0)
{
U_UP+=5;if(U_UP>50){U_UP=5;}
}
else
{
U_DOWN+=5;if(U_DOWN>50){U_DOWN=5;}
}
}
break;
case 7:
if(Flag==2)
{
if(Choose==0)
{
U_UP-=5;if(U_UP<5){U_UP=50;}
}
else
{
U_DOWN-=5;if(U_DOWN<5){U_DOWN=50;}
}
}
break;
}
}
void DAC_Distance(void)
{
if(LED_flag==1)
{
if(C_Distance<20)
{
DAC_read(51);
}
else if(C_Distance>=20&&C_Distance<=80)
{
DAC_read((int)(C_Distance*3.4-17));
}
else if(C_Distance>80)
{
DAC_read(255);
}
}
if(LED_flag==0)
{
DAC_read(0);
}
}
Key.c
#include "KEY4.h"
unsigned char Key_time;
bit LED_flag,LED_flag_Change;//灯闪烁标志位
unsigned char LED_Time;
void Timer1Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x20; //设置定时初值
TH1 = 0xD1; //设置定时初值
TF1 = 0; //清除TF1标志
EA=1;
ET1=1;
TR1 = 1; //定时器1开始计时
}
unsigned char Key4(void)
{
static unsigned char xstep;
switch (xstep)
{
case 0:
if(P30==0||P31==0||P32==0||P33==0)
{
xstep=1;
Key_time=0;
}break;
case 1:if(Key_time>=20)xstep=2;break;
case 2:
if(P30==0) {xstep=3;return (7);}
else if(P31==0) {xstep=3;return (6);}
else if(P32==0) {xstep=3;return (5);}
else if(P33==0) {xstep=3;return (4);}
else if(P30==1&&P31==1&&P32==1&&P33==1)xstep=0;break;
case 3:
if(P30==1&&P31==1&&P32==1&&P33==1) xstep=0;break;
}
return 0;
}
void Timer1() interrupt 3
{
Key_time++;
if(LED_flag==1)
{
if(++LED_Time==100)
{
LED_flag_Change=~LED_flag_Change;
}
}
}
对于上面两个问题来说,第一个具体是逻辑上得问题,第二个是因为Key()不是都有返回值的。
大家不用紧张,一定要保证自己上交的工程是你真正写的最好的别交错误了。