main.c
#include "stc15f2k60s2.h"
#include "intrins.h"
#include "stdio.h"
#include "ds1302.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
//超声波定义
sbit TX=P1^0;
sbit RX=P1^1;
extern uchar shizhong[7];
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,\
0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,\
0XBF,0XFF,0xc7,0x8e,0xc6,0x89,0xfe,0xf7,0x8c};// - 灭 L F C H 上— _ P
uchar Digbuf[8]={0,1,2,3,4,5,6,7};
uchar Digcom=0;
//LED 开关设置
uchar led_bit=0xff;
#define led_on(n){led_bit&=_crol_(0xfe,n-1);P0=led_bit;P2|=0x80;P2&=0x9f;P2&=0x1f;}
#define led_off(n){led_bit|=_crol_(0x01,n-1);P0=led_bit;P2|=0x80;P2&=0x9f;P2&=0x1f;}
uchar caiji[5]={2,3,5,7,9};//采集时间设置 k
void Allinit();
void delayms(uint ms);
void Timer2Init(void);
void DIG_Show();
void keyscan16();
void DAC_Show();
//void Measure_mode();
void LED_Show();
//超声波
void Delay14us();
void Wave_Send();
void Wave_Measure();
void Timer0Init(void);
bit wave_flag=0;
uchar trie=0;
uint Distance=0;
uint Distance_max=0;
uint Distance_min=0;
uint Distance_av=0;
uchar inter_face1=0;//数据,参数
uchar inter_face2=0;//数据子界面
uchar inter_face3=0;//参数子界面
uchar inter_face4=0;//数据子界面距离检测模式选择
uchar inter_face5=0;//数据子界面记录数据界面子界面
uchar k=0; //采集数据时间设置选择 0--->2S 1--->3S 2--->5S 3--->7S 4--->9S
uchar ju_can=10;
uint voltage=0; //0-500
bit flag=0;//光敏电阻亮暗标志位
bit mode=0; //触发模式
uchar Distance_last=0;
long Distance_num=0;
uint time=0;
bit cishu=0;
uint Distance1,Distance2,Distance3;
void main(void)
{
Allinit();
Timer2Init();
Timer0Init();
DS_init();
while(1)
{
DS_Get();
voltage=AD_Read(0x01);
//Measure_mode();
DAC_Show();
LED_Show();
keyscan16();
DIG_Show();
}
}
//5) L5: 在定时模式下,“连续”测量到的 3 次距离数据在距离参数“附近”(±
//5cm), L5 点亮, 否则熄灭。
void LED_Show()
{
if((inter_face1==0)&&(inter_face2==0)){led_on(1);led_off(2);led_off(3);led_off(4);}
else if((inter_face1==0)&&(inter_face2==1)&&(inter_face4==0)){led_off(1);led_on(2);led_off(3);led_on(4);}
// else if((inter_face1==0)&&(inter_face2==1)&&(inter_face4==1)){led_off(1);led_on(2);led_off(3);led_off(4);led_on(5);} //定时三次测量在参数范围内
else if((inter_face1==0)&&(inter_face2==1)&&(inter_face4==1)){led_off(1);led_on(2);led_off(3);led_off(4);}
else if((inter_face1==0)&&(inter_face2==2)){led_off(1);led_off(2);led_on(3);led_off(4);}
if(voltage>=50){led_on(6);}
else {led_off(6);}
}
//void Measure_mode()
//{
// if(inter_face4==1) //定时模式 秒 值可以整除采集时间参数,触发一次距离数据采集和刷新
// {
// if(shizhong[0]/caiji[k]==0){Wave_Measure();}
// }
// else if(inter_face4==0)//触发模式 光敏电阻 “亮”----->“暗”(遮挡光敏电阻),触发一次距离数据采集和刷新。
// {
// if(voltage>=50) {flag=1;}//亮
// else{flag=0;}
//
// if((flag==1)&&(voltage<50))//“亮”----->“暗”
// {
// Wave_Measure();
// }
// }
//}
void DAC_Show()
{
if(Distance>=80){AD_Write(255);}
else if((Distance>10)&&(Distance<80)) {AD_Write(2.914*Distance+21.857);}
else if(Distance<=10){AD_Write(51);}
}
void DIG_Show()
{
if(inter_face1==0)//数据显示界面
{
if(inter_face2==0)//时间数据显示界面
{
Digbuf[0]=shizhong[2]/10;Digbuf[1]=shizhong[2]%10;Digbuf[2]=20;
Digbuf[3]=shizhong[1]/10;Digbuf[4]=shizhong[1]%10;Digbuf[5]=20;
Digbuf[6]=shizhong[0]/10;Digbuf[7]=shizhong[0]%10;
}
else if(inter_face2==1)//距离数据显示界面
{
if(inter_face4==0)//触发模式 满足触发条件后,测量,刷新数据一次
{
mode=0;
Digbuf[0]=22;Digbuf[1]=24;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
if(Distance>=100){Digbuf[5]=Distance/100;Digbuf[6]=Distance%100/10;Digbuf[7]=Distance%10;}
else if(Distance>=10){Digbuf[5]=21;Digbuf[6]=Distance/10;Digbuf[7]=Distance%10;}
else if(Distance>=0){Digbuf[5]=21;Digbuf[6]=21;Digbuf[7]=Distance;}
}
else if(inter_face4==1)//定时模式 满足定时条件后,测量,刷新数据一次
{
mode=1;
Digbuf[0]=22;Digbuf[1]=23;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
if(Distance>=100){Digbuf[5]=Distance/100;Digbuf[6]=Distance%100/10;Digbuf[7]=Distance%10;}
else if(Distance>=10){Digbuf[5]=21;Digbuf[6]=Distance/10;Digbuf[7]=Distance%10;}
else if(Distance>=0){Digbuf[5]=21;Digbuf[6]=21;Digbuf[7]=Distance;}
}
}
else if(inter_face2==2)//数据记录显示界面
{
if(inter_face5==0)//H 数据最大值 包含上电后 触发,定时模式所有的采集结果
{
Digbuf[0]=25;Digbuf[1]=26;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
if(Distance_max>=100){Digbuf[5]=Distance_max/100;Digbuf[6]=Distance_max%100/10;Digbuf[7]=Distance_max%10;}
else if(Distance_max>=10){Digbuf[5]=21;Digbuf[6]=Distance_max/10;Digbuf[7]=Distance_max%10;}
else if(Distance_max>=0){Digbuf[5]=21;Digbuf[6]=21;Digbuf[7]=Distance_max;}
}
else if(inter_face5==1) //数据平均值 保留一位小数(扩大10倍) 包含上电后 触发,定时模式所有的采集结果
{
Digbuf[0]=25;Digbuf[1]=20;Digbuf[2]=21;Digbuf[3]=21;
if(Distance_av>=1000){Digbuf[4]=Distance_av/1000;Digbuf[5]=Distance_av%1000/100;Digbuf[6]=Distance_av%100/10+10;Digbuf[7]=Distance_av%10;}
else if(Distance_av>=100){Digbuf[4]=21;Digbuf[5]=Distance_av/100;Digbuf[6]=Distance_av%100/10+10;Digbuf[7]=Distance_av%10;}
else if(Distance_av>=10){Digbuf[4]=21;Digbuf[5]=21;Digbuf[6]=Distance_av/10+10;Digbuf[7]=Distance_av%10;}
else if(Distance_av>=0){Digbuf[4]=21;Digbuf[5]=21;Digbuf[6]=10;Digbuf[7]=Distance_av;}
}
else if(inter_face5==2) //数据最小值 包含上电后 触发,定时模式所有的采集结果
{
Digbuf[0]=25;Digbuf[1]=27;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
if(Distance_min>=100){Digbuf[5]=Distance_min/100;Digbuf[6]=Distance_min%100/10;Digbuf[7]=Distance_min%10;}
else if(Distance_min>=10){Digbuf[5]=21;Digbuf[6]=Distance_min/10;Digbuf[7]=Distance_min%10;}
else if(Distance_min>=0){Digbuf[5]=21;Digbuf[6]=21;Digbuf[7]=Distance_min;}
}
}
}
else if(inter_face1==1)//参数设置界面
{
if(inter_face3==0)//采集时间设置界面
{
Digbuf[0]=28;Digbuf[1]=1;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;
Digbuf[6]=caiji[k]/10;Digbuf[7]=caiji[k]%10;
}
else if(inter_face3==1)//距离参数设置界面 10-80 在定时模式下,“连续” 测量到的 3 次距离数据在距离参数“附近”(±5cm),则触发报警效果。
{
Digbuf[0]=28;Digbuf[1]=2;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;
Digbuf[6]=ju_can/10;Digbuf[7]=ju_can%10;
}
}
}
void keyscan16()
{
P44=0;P42=1;
if(P32==0)//s5 子界面切换
{
delayms(5);
if(P32==0)
{
if(inter_face1==0) //数据界面下
{
if(inter_face2==0){inter_face2=1;}
else if(inter_face2==1){inter_face2=2;inter_face5=0;}
else if(inter_face2==2){inter_face2=0;}
}
else if(inter_face1==1) //参数界面下
{
if(inter_face3==0){inter_face3=1;}
else if(inter_face3==1){inter_face3=0;}
}
}
while(!P32);
}
else if(P33==0)//s4 数据,参数切换界面
{
delayms(5);
if(P33==0)
{
if(inter_face1==0){inter_face1=1;inter_face3=0;}
else if(inter_face1==1){inter_face1=0;inter_face2=0;}
}
while(!P33);
}
P44=1;P42=0;
if(P32==0)//s9 参数“调整”
{
delayms(5);
if(P32==0)
{
if((inter_face1==1)&&(inter_face3==0))//采集时间设置界面
{
if(k==0){k=1;}
else if(k==1){k=2;}
else if(k==2){k=3;}
else if(k==3){k=4;}
else if(k==4){k=0;}
}
else if((inter_face1==1)&&(inter_face3==1))//距离参数设置界面 10-80
{
ju_can=ju_can+10;
if(ju_can>=90)ju_can=10;
}
}
while(!P32);
}
else if(P33==0)//s8 在测距数据显示界面下,切换触发和定时模式。在数据记录显示界面下,最大值0、最小值2、平均值1切换
{
delayms(5);
if(P33==0)
{
if((inter_face1==0)&&(inter_face2==1))//距离数据显示界面
{
if(inter_face4==0){inter_face4=1;}
else if(inter_face4==1){inter_face4=0;}
}
else if((inter_face1==0)&&(inter_face2==2))//数据记录显示界面
{
if(inter_face5==0){inter_face5=2;}
else if(inter_face5==2){inter_face5=1;}
else if(inter_face5==1){inter_face5=0;}
}
}
while(!P33);
}
}
void Wave_Send()
{
uchar i;
for(i=0;i<8;i++)
{
TX=1;
Delay14us();
TX=0;
Delay14us();
}
}
void Wave_Measure()
{
if(wave_flag==1)
{
wave_flag=0;
TR0=1;
Wave_Send();
while((RX==1)&&(TF0==0));
TR0=0;
if(TF0==1)
{
TF0=0;
Distance=999;
}
else
{
Distance=((TH0<<8)|TL0)*0.017;
Distance=Distance/12;
}
TH0=TL0=0;
}
}
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
}
void Timer2Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x20; //设置定时初值
T2H = 0xD1; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2|=0X04;
EA=1;
}
void timer2() interrupt 12
{
P0=0XFF;
P2|=0XC0;P2&=0XDF;P2&=0X1F;
P0=0XFF;
P2|=0XE0;P2&=0XFF;P2&=0X1F;
P0=(1<<Digcom);
P2|=0XC0;P2&=0XDF;P2&=0X1F;
P0=tab[Digbuf[Digcom]];
P2|=0XE0;P2&=0XFF;P2&=0X1F;
if(++Digcom==8)Digcom=0;
trie++; //超声波定时
if(trie==200)
{
trie=0;
wave_flag=1;
}
if(inter_face4==1) //定时模式 秒 值可以整除采集时间参数,触发一次距离数据采集和刷新
{
if((shizhong[0]%caiji[k])==0) //求余
{
if(time==0)
{
Wave_Measure();time=1;
Distance_max=Distance;
Distance_min=Distance;
Distance_av=Distance*10;
Distance_num=Distance;
Distance3=Distance2;
Distance2=Distance1;
Distance1=Distance;
}
else
{
Distance_last=Distance; //上一次数据
Wave_Measure();
Distance_num=Distance_num+Distance;//求和
time++;
Distance3=Distance2;
Distance2=Distance1;
Distance1=Distance;
//求max.min,average
if(Distance>=Distance_max){Distance_max=Distance;}//Distance_min=Distance_last;Distance_av=((Distance_num/time)*10+Distance_num%time);}
if(Distance<=Distance_min){Distance_min=Distance;}
Distance_av=((Distance_num/time)*10+Distance_num%time);
}
}
}
else if(inter_face4==0)//触发模式 光敏电阻 “亮”----->“暗”(遮挡光敏电阻),触发一次距离数据采集和刷新。
{
if(voltage>=50) {flag=1;}//亮
if((flag==1)&&(voltage<50))//“亮”----->“暗”
{
flag=0;
if(time==0)
{
Wave_Measure();time=1;
Distance_max=Distance;
Distance_min=Distance;
Distance_av=Distance*10;
Distance_num=Distance;
Distance3=Distance2;
Distance2=Distance1;
Distance1=Distance;
}
else
{
Distance_last=Distance; //上一次数据
Wave_Measure();
Distance_num=Distance_num+Distance;//求和
time++;
Distance3=Distance2;
Distance2=Distance1;
Distance1=Distance;
//求max.min,average
if(Distance>=Distance_max){Distance_max=Distance;}//Distance_min=Distance_last;Distance_av=((Distance_num/time)*10+Distance_num%time);}
if(Distance<=Distance_min){Distance_min=Distance;}
Distance_av=((Distance_num/time)*10+Distance_num%time);
}
}
}
if(((Distance1>=ju_can-5)&&(Distance1<=ju_can+5))&&((Distance2>=ju_can-5)&&(Distance2<=ju_can+5))&&((Distance3>=ju_can-5)&&(Distance3<=ju_can+5)))
{led_on(5);}
else led_off(5);
// if((cishu==1)&&(Distance>=ju_can-5)&&(Distance<=ju_can+5)){cishu=2;}
// else if((cishu==1)&&((Distance<ju_can-5)||(Distance>ju_can+5))){cishu=0;}
// if((cishu==2)&&(Distance>=ju_can-5)&&(Distance<=ju_can+5)){cishu=3;}
// else if((cishu==2)&&((Distance<ju_can-5)||(Distance>ju_can+5))){cishu=0;}
}
void Allinit()
{
P0=0x00;P2|=0XA0;P2&=0XBF;P2&=0X1F;
P0=0XFF;P2|=0X80;P2&=0X9F;P2&=0X1F;
P0=0XFF;P2|=0XC0;P2&=0XDF;P2&=0X1F;
P0=0XFF;P2|=0XE0;P2&=0XFF;P2&=0X1F;
}
void delayms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
void Delay14us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 39;
while (--i);
}