|
一、注意点
程序已经上传;
有漏洞欢迎私聊指教,一起进步
二、主函数:
#include<STC15F2K60S2.H>
#include "intrins.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned int
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();}
sbit TX = P1^0; //发射引脚
sbit RX = P1^1; //接收引脚
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar yi,er,san,si,wu ,liu,qi,ba;
bit flag_S5,flag_S4,flag_led;
uchar zhuangtai,dianya,huowu_lei,flag_S6,S7_choose;
uint tt,aa;
uchar huowu_1,huowu_2,huowu_time1,huowu_time2;
unsigned int intr = 0;
bit s_flag;
unsigned int distance;
unsigned int t = 0;
void send_wave(void);
void Timer0Init(void) ;
void Timer1Init(void);
void flash_led();
void dianya_panduan();
void delayms(int ms);
void allinit();
void mode_1();
void mode_2();
void mode_3();
void chaosheng();
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void keyscan();
void tingzhi_led();
void main()
{
Timer0Init();
Timer1Init();
EA = 1;
ET0 = 1; //打开定时器0中断
allinit();
yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;
if(EEPROM_read(0x40)!=20)
{
EEPROM_write(0x40,20);
delayms(2);
EEPROM_write(0x55,2);
delayms(2);
EEPROM_write(0x56,4);
delayms(2);
}
huowu_1=EEPROM_read(0x55);
delayms(2);
huowu_2=EEPROM_read(0x56);
delayms(2);
huowu_time1=huowu_1;
huowu_time2=huowu_2;
while(1)
{
keyscan();
dianya=AD_read(0x03);
dianya_panduan();
//数据处理
chaosheng();
tingzhi_led();
mode_1();
mode_2();
mode_3();
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
EEPROM_write(0x55,huowu_1);
delayms(2);
EEPROM_write(0x56,huowu_2);
delayms(2);
}
}
void mode_3()
{
if((S7_choose==2)|(S7_choose==1))
{
yi=3;er=11;san=11;
si=huowu_1/10;wu=huowu_1%10;
liu=11;
qi=huowu_2/10;ba=huowu_2%10;}
else if(S7_choose==3){yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;S7_choose=0;}
}
void chaosheng()
{
if(s_flag) // 200毫秒更新一次数据
{
s_flag = 0;
send_wave(); //发送方波信号
TR1 = 1; //启动计时
while((RX == 1) && (TF1 == 0)) //等待收到脉冲
{
if((TH1==0x80)|(TH1==0xA0))
{
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
TR1 = 0; //关闭计时
if(TF1 == 1)//发生溢出
{
TF1 = 0;
distance = 99; //无返回
}
else
{
t = TH1;// 计算时间
t <<= 8;
t |= TL1;
distance = (unsigned int)(t*0.017); //计算距离
distance = distance/12;
//t*340 // t/1000000*340/2*100
}
TH1 = 0;
TL1 = 0;
}
if(distance<=30) huowu_lei=1;
else if(distance>30) huowu_lei=2;
}
void dianya_panduan()
{
if(zhuangtai==3) {flash_led();}
if((dianya>0)&&(dianya<51))
{if(S7_choose==0){P2=0x80;P0=0xfe;yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;}zhuangtai=1;}
else if((dianya>=51)&&(dianya<204))
{zhuangtai=2;
if(!flag_S5){P2=0x80;P0=0xfd;}}
else if(dianya==0)
{P2=0x80;P0=0xff;yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;zhuangtai=1;}
else if(dianya>=204)
{zhuangtai=3;}
}
void mode_1()
{
if(zhuangtai!=1)
{yi=1;er=11;san=11;si=distance/10;wu=distance%10;liu=11;qi=11;ba=huowu_lei;}
}
void mode_2()
{
if((zhuangtai==2)&&(flag_S4==1))
{
yi=2;er=11;san=11;si=11;wu=11;liu=11;
if(huowu_lei==1){qi=huowu_time1/10;ba=huowu_time1%10;}
else if(huowu_lei==2){qi=huowu_time2/10;ba=huowu_time2%10;}
}
}
void flash_led()
{
if(flag_led){P2=0x80;P0=0xfb;}
else if(!flag_led){P2=0x80;P0=0xff;}
}
void tingzhi_led()
{
if(flag_S5)
{
if(flag_led){P2=0x80;P0=0xf7;}
else if(!flag_led){P2=0x80;P0=0xff;}
}
}
void Timer0Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer1Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
}
//定时器0中断服务函数
void isr_timer_0(void) interrupt 1 //默认中断优先级 1
{
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
if(++intr == 100)
{
s_flag = 1;
intr = 0;
}
tt++;
if(tt==250)
{tt=0;flag_led=~flag_led;}
aa++;
if(aa==1000)
{aa=0;
if((flag_S4==1)&&(flag_S5==0))
{
P2=0xa0;P0=0x10;
if(huowu_lei==1){huowu_time1--;if(huowu_time1==0){huowu_time1=0;flag_S4=0; P2=0xa0;P0=0x00;}}
else if(huowu_lei==2){huowu_time2--;if(huowu_time2==0){huowu_time2=0;flag_S4=0; P2=0xa0;P0=0x00;}}
}
}
if(flag_S5){P2=0xa0;P0=0x00;}
}
//TX引脚发送40KHz方波信号驱动超声波发送探头
//使用软件延时注意RC振荡器频率
void send_wave(void)
{
unsigned char i = 8; //发送8个脉冲
do
{
TX = 1;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
TX = 0;
somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
}
while(i--);
}
void delayms(int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()
{
P2=0XA0;
P0=0X00;//关闭蜂鸣器,继电器
P2=0X80;
P0=0XFF;//关闭LED灯
P2=0XC0;
P0=0XFF;//选择所有数码管
P2=0XFF;
P0=0XFF;//关闭所有数码管
}
void display1(uchar yi,uchar er)
{
P2=0XC0;//打开位选573 U8
P0=0X01;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=tab[yi];
delayms(1);
P2=0XC0;//打开位选573 U8
P0=0X02;//选择第二个数码管
P2=0XFF;//打开段选573 U7
P0=tab[er];
delayms(1);
}
void display2(uchar san,uchar si)
{
P2=0XC0;//打开位选573 U8
P0=0X04;//选择第三个数码管
P2=0XFF;//打开段选573 U7
P0=tab[san];
delayms(1);
P2=0XC0;//打开位选573 U8
P0=0X08;//选择第四个数码管
P2=0XFF;//打开段选573 U7
P0=tab[si];
delayms(1);
}
void display3(uchar wu,uchar liu)
{
P2=0XC0;//打开位选573 U8
P0=0X10;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=tab[wu];
delayms(1);
P2=0XC0;//打开位选573 U8
P0=0X20;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=tab[liu];
delayms(1);
}
void display4(uchar qi,uchar ba)
{
P2=0XC0;//打开位选573 U8
P0=0X40;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=tab[qi];
delayms(1);
P2=0XC0;//打开位选573 U8
P0=0X80;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=tab[ba];
delayms(1);
}
void keyscan()
{
if(P30==0)
{
delayms(5);
if(!P30)
{
if(S7_choose==1)
{huowu_1++;if(huowu_1==11){huowu_1=0;}}
else if(S7_choose==2)
{huowu_2++;if(huowu_2==11){huowu_2=0;}}
}
while(!P30);
}
if(P31==0)
{
delayms(5);
if(!P31)
{
if(zhuangtai==1)
{
if(flag_S6==0){flag_S6=1;S7_choose=1;}
else if(flag_S6==1){flag_S6=2;S7_choose=2;}
else if(flag_S6==2){flag_S6=0;S7_choose=3;}
}
}
while(!P31);
}
if(P32==0)
{
delayms(5);
if(!P32)
{
if(flag_S4==1) flag_S5=~flag_S5;
}
while(!P32);
}
if(P33==0)
{
delayms(5);
if(!P33)
{
if(zhuangtai==2) {flag_S4=1;aa=990;huowu_time1=huowu_1;huowu_time2=huowu_2;}
else if((zhuangtai==1)|(zhuangtai==3)) flag_S4=0;
}
while(!P33);
}
}
|
|