代码参考如下
#include <STC15F2K60S2.H>
#include "iic.h"
#include "onewire.h"
#include "intrins.h"
#define TSMG 500
sbit h1 = P3^2;
sbit h2 = P3^3;
sbit s1 = P4^4;
sbit s2 = P4^2;
sbit TX = P1^0;
sbit RX = P1^1;
void read_myDistance();
void DisplaySMG_Info();
code unsigned char Seg_Table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86,0x8e };
code unsigned char nodot[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
float temp_value = 0;//采集到的温度值
unsigned int distance = 0;//采集到的距离
unsigned int temp_smg;//数码管显示的温度值
unsigned char cm_m = 0;//0-cm 1-m
unsigned char UI = 0;//0-测距 1-参数 2-工厂模式
unsigned char UI_param = 0;//0-距离参数 1-温度参数
unsigned char param_temp = 30;//温度参数
unsigned char param_dis = 40;//距离参数
unsigned char GC_mode = 0;//0-校准值设置 1-介质设置 2-DAC输出设置
char value_JZ = 0;//校准值的大小
unsigned int speed = 340;//速度大小
unsigned char dac_down = 10;//dac下限
unsigned char stat_JL = 0;//记录的标志,为1开始记录
unsigned int count_6s = 0;//6s计时
unsigned int JL_dis[50];//6S内采集到的数据
unsigned char stat_old = 0;//采集的第一个数据标志
unsigned char old_value = 0;//上一个数据
unsigned char num = 0;//6s内采集的数据总数
unsigned char stat_over = 0;//数据以完成记录
unsigned char stat_out = 0;//dac输出标志
unsigned char adc_value = 0;
unsigned char count_200ms = 0;
unsigned char stat_double = 0;//双按键
unsigned char count_2s = 0;
unsigned char stat_Init = 0;
unsigned char stat_led = 0xff;//led灯初始状态
unsigned char count_01s = 0;
unsigned char stat_shan = 0;//led灯闪的标志
unsigned char stat_JDQ = 0x00;//继电器初始状态
void Init_timer2()
{
AUXR &= 0xfb;
T2L = 0xf0;
T2H = 0xd8;
AUXR |= 0x10;
EA = 1;
IE2 |= 0x04;
}
void Sevece_timer2() interrupt 12
{
DisplaySMG_Info();
if(UI == 2)
{
count_01s++;
if(count_01s == 10)
{
count_01s = 0;
if(stat_shan == 0)
{
stat_shan = 1;
}
else
{
stat_shan = 0;
}
}
}
}
void Init_timer0()
{
TMOD &= 0xf0;
TMOD |= 0x01;
TH0 = 0x3c;
TL0 = 0xb0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Sevice_timer0() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0;
count_200ms++;
if(stat_JL == 1)
{
count_6s++;
if(count_6s == 120)
{
stat_JL = 0;
stat_over = 1;
}
}
if(stat_double == 1)
{
count_2s++;
}
if(count_200ms == 4)
{
read_myDistance();
count_200ms = 0;
}
}
void Delay20ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 234;
k = 113;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay12us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void Init_mytemp()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
do{
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xBE);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
MSB = (MSB << 4) | (LSB >> 4);
}while(MSB == 85);
}
void read_mytemp()
{
unsigned char LSB,MSB;
unsigned int temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xBE);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
temp = MSB << 8;
temp = temp | LSB;
if((temp & 0xf800) == 0x0000)
{
temp_value = temp * 0.0625;
temp_smg = temp_value * 10;
}
}
void Init_Wave()
{
unsigned char i;
for(i = 0;i < 8;i++)
{
TX = 1;
Delay12us();
TX = 0;
Delay12us();
}
}
void read_myDistance()
{
unsigned int timer;
TMOD &= 0x0f;
TMOD |= 0x10;
TH1 = 0;
TL1 = 0;
TR1 = 0;
Init_Wave();
TR1 = 1;
while((RX == 1) && (TF1 == 0));
TR1 = 0;
if(TF1 == 0)
{
timer = (TH1 << 8) | TL1;
distance = ((float)speed/20000 * timer+ value_JZ);
}
else
{
TF1 = 0;
distance = 0;
}
}
void set_mydac(unsigned char value)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x40);
I2CWaitAck();
I2CSendByte(value);
I2CWaitAck();
I2CStop();
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
P2 = (P2 & 0x1f) | 0x00;
P0 = dat;
switch(channel)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
case 0:
P2 = (P2 & 0x1f) | 0x00;
break;
}
P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
SelectHC573(6,0x01 << pos);
SelectHC573(7,value);
DelaySMG(TSMG);
SelectHC573(6,0x01 << pos);
SelectHC573(7,0xff);
}
void DisplaySMG_All(unsigned char value)
{
SelectHC573(6,0xff);
SelectHC573(7,value);
}
void DisplaySMG_Info()
{
switch(UI)
{
case 0:
DisplaySMG_Bit(0,Seg_Table[temp_smg / 100]);
DisplaySMG_Bit(1,nodot[temp_smg / 10 % 10]);
DisplaySMG_Bit(2,Seg_Table[temp_smg % 10]);
DisplaySMG_Bit(3,0xbf);
if(cm_m == 0)
{
if(distance > 999)
DisplaySMG_Bit(4,Seg_Table[distance / 1000]);
if(distance > 99)
DisplaySMG_Bit(5,Seg_Table[distance / 100 % 10]);
if(distance > 9)
DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]);
DisplaySMG_Bit(7,Seg_Table[distance % 10]);
}
else if(cm_m == 1)
{
if(distance > 999)
DisplaySMG_Bit(4,Seg_Table[distance / 1000]);
DisplaySMG_Bit(5,nodot[distance / 100 % 10]);
DisplaySMG_Bit(6,Seg_Table[distance / 10 % 10]);
DisplaySMG_Bit(7,Seg_Table[distance % 10]);
}
break;
case 1:
if(UI_param == 0)
{
DisplaySMG_Bit(0,0x8c);
DisplaySMG_Bit(1,Seg_Table[1]);
DisplaySMG_Bit(6,Seg_Table[param_dis / 10]);
DisplaySMG_Bit(7,Seg_Table[param_dis % 10]);
// dp g f e d c b a
// 1 0 0 0 1 1 1 0
}
else if(UI_param == 1)
{
DisplaySMG_Bit(0,0x8c);
DisplaySMG_Bit(1,Seg_Table[2]);
DisplaySMG_Bit(6,Seg_Table[param_temp / 10]);
DisplaySMG_Bit(7,Seg_Table[param_temp % 10]);
}
break;
case 2:
if(GC_mode == 0)
{
DisplaySMG_Bit(0,0x8e);
DisplaySMG_Bit(1,Seg_Table[1]);
if(value_JZ >= 0)
{
if(value_JZ > 9)
DisplaySMG_Bit(6,Seg_Table[value_JZ / 10]);
DisplaySMG_Bit(7,Seg_Table[value_JZ % 10]);
}
if(value_JZ < 0)
{
if((value_JZ *(-1)) > 9)
{
DisplaySMG_Bit(5,0xbf);
DisplaySMG_Bit(6,Seg_Table[(value_JZ*(-1)) / 10]);
DisplaySMG_Bit(7,Seg_Table[(value_JZ*(-1)) % 10]);
}
else
{
DisplaySMG_Bit(6,0xbf);
DisplaySMG_Bit(7,Seg_Table[(value_JZ*(-1))]);
}
}
}
else if(GC_mode == 1)
{
DisplaySMG_Bit(0,0x8e);
DisplaySMG_Bit(1,Seg_Table[2]);
DisplaySMG_Bit(5,Seg_Table[speed / 100]);
DisplaySMG_Bit(6,Seg_Table[speed / 10 % 10]);
DisplaySMG_Bit(7,Seg_Table[speed % 10]);
}
else if(GC_mode == 2)
{
DisplaySMG_Bit(0,0x8e);
DisplaySMG_Bit(1,Seg_Table[3]);
DisplaySMG_Bit(6,nodot[dac_down / 10]);
DisplaySMG_Bit(7,Seg_Table[dac_down % 10]);
}
break;
}
}
void scan_key()
{
s1 = 0;
h1 = h2 = s2 = 1;
if(h1 == 0)//s5
{
Delay20ms();
if(h1 == 0)
{
if(UI == 0)
{
if(cm_m == 0)
{
cm_m = 1;
}
else
{
cm_m = 0;
}
}
else if(UI == 1)
{
if(UI_param == 0)
{
UI_param = 1;
}
else if(UI_param == 1)
{
UI_param = 0;
}
}
else if(UI == 2)
{
if(GC_mode == 0)
{
GC_mode = 1;
}
else if(GC_mode == 1)
{
GC_mode = 2;
}
else if(GC_mode == 2)
{
GC_mode = 0;
}
}
while(h1 == 0);
}
}
else if(h2 == 0)//s4
{
Delay20ms();
if(h2 == 0)
{
if(UI == 0)
{
UI_param = 0;
UI = 1;
}
else if(UI == 1)
{
GC_mode = 0;
UI = 2;
}
else if(UI == 2)
{
UI = 0;
cm_m = 0;
}
while(h2 == 0);
}
}
s2 = 0;
h1 = h2 = s1 = 1;
if((h1 == 0) && (h2 == 0))
{
Delay20ms();
if((h1 == 0) && (h2 == 0))
{
stat_double = 1;
while((h1 == 0) && (h2 == 0));
stat_double = 2;
}
}
if(h1 == 0 && h2 != 0)//s9
{
Delay20ms();
if(h1 == 0 && h2 != 0)
{
if((UI == 1) && (UI_param == 0))
{
if(param_dis == 10)
{
param_dis = 90;
}
else
{
param_dis -= 10;
}
}
else if((UI == 1) && (UI_param == 1))
{
if(param_temp == 0)
{
param_temp = 80;
}
else
{
param_temp -= 1;
}
}
else if((UI == 2) && (GC_mode == 0))
{
if(value_JZ == -90)
{
value_JZ = 90;
}
else
{
value_JZ -= 5;
}
}
else if((UI == 2) && (GC_mode == 1))
{
if(speed == 10)
{
speed = 9990;
}
else
{
speed -= 10;
}
}
else if((UI == 2) && (GC_mode == 2))
{
if(dac_down == 1)
{
dac_down = 20;
}
else
{
dac_down -= 1;
}
}
if((UI == 0) && (stat_over == 1))
{
stat_out = 1;
}
while(h1 == 0);
}
}
if(h2 == 0 && h1 != 0)//s8
{
Delay20ms();
if(h2 == 0 && h1 != 0)
{
if((UI == 1) && (UI_param == 0))
{
if(param_dis == 90)
{
param_dis = 10;
}
else
{
param_dis += 10;
}
}
else if((UI == 1) && (UI_param == 1))
{
if(param_temp == 80)
{
param_temp = 0;
}
else
{
param_temp += 1;
}
}
else if((UI == 2) && (GC_mode == 0))
{
if(value_JZ == 90)
{
value_JZ = -90;
}
else
{
value_JZ += 5;
}
}
else if((UI == 2) && (GC_mode == 1))
{
if(speed == 9990)
{
speed = 10;
}
else
{
speed += 10;
}
}
else if((UI == 2) && (GC_mode == 2))
{
if(dac_down == 20)
{
dac_down = 1;
}
else
{
dac_down += 1;
}
}
if(UI == 0)
{
stat_JL = 1;
}
while(h2 == 0);
}
}
}
void data_dac_deal()
{
unsigned char i;
if(stat_JL == 1)
{
if(stat_old == 0)
{
old_value = distance;
stat_old = 1;
JL_dis[num++] = stat_old;
}
if(distance != old_value)
{
JL_dis[num++] = stat_old;
}
old_value = distance;
}
if(stat_over == 1)
{
for(i = 0;i < num;i++)
{
if(JL_dis[i] < 10)
{
adc_value = (255.0 / 50) * dac_down;
set_mydac(adc_value);
}
else if(JL_dis[i] < 90)
{
adc_value = ((float)(5-(float)dac_down/10)/80*JL_dis[i] + (float)(0.9*dac_down-5)/8)/(5.0/255);
}
else
{
adc_value = 255;
set_mydac(adc_value);
}
}
}
if(stat_double == 2)
{
if(count_2s > 40)
{
count_2s = 0;
stat_double = 0;
UI = 0;
param_temp = 30;
param_dis = 40;
value_JZ = 0;
speed = 340;
dac_down = 10;
}
}
}
void led_control()
{
if(UI == 0)
{
stat_led = ~(distance);
SelectHC573(4,stat_led);
}
else if(UI == 1)
{
stat_led = 0x7f;
SelectHC573(4,stat_led);
}
else if(UI == 2)
{
if(stat_shan == 0)
{
stat_led = 0xfe;
SelectHC573(4,stat_led);
}
else
{
stat_led = 0xff;
SelectHC573(4,stat_led);
}
}
if((((param_dis - 5) <= distance) && ((param_dis + 5) >= distance)) && (temp_value <= param_temp))
{
stat_JDQ |= 0x10;
SelectHC573(5,stat_JDQ);
}
else
{
stat_JDQ &= 0xef;
SelectHC573(5,stat_JDQ);
}
}
void main()
{
Init_mytemp();
Init_Wave();
Init_timer0();
Init_timer2();
DisplaySMG_All(0xff);
SelectHC573(4,0xff);
SelectHC573(5,0x00);
while(1)
{
if(stat_JL == 0)
{
scan_key();
}
read_mytemp();
data_dac_deal();
led_control();
}
}