|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
////////////////***********************此代码仅供参考有不对之处,欢迎您的宝贵意见!*********************/////////////////
#include "iodef.h"
#include "yejin display.h"
#include "12c5a_delay.h"
sfr CCON = 0xD8; //PCA control register
sbit CCF0 = CCON^0; //PCA module-0 interrupt flag
sbit CCF1 = CCON^1; //PCA module-1 interrupt flag
sbit CR = CCON^6; //PCA timer run control bit
sbit CF = CCON^7; //PCA timer overflow flag
sfr CMOD = 0xD9; //PCA mode register
sfr CL = 0xE9; //PCA base timer LOW
sfr CH = 0xF9; //PCA base timer HIGH
sfr CCAPM0 = 0xDA; //PCA module-0 mode register
sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW
sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH
sfr CCAPM1 = 0xDB; //PCA module-1 mode register
sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW
sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH
sfr PCAPWM0 = 0xf2;
sfr PCAPWM1 = 0xf3;
sbit echo_f = P2^1; //向前HC-SR04的echo口
sbit trig_f = P2^0; //向前HC-SR04的trig口
sbit shi_up = P3^4; //
sbit ge_up = P3^5; //
sbit shi_down = P3^6; //
sbit start = P3^7; //
//变量、常量定义
unsigned int time=0;
float PS_value=30; //????? 0~100
float sum = 0;
unsigned long juli,f_juli;
float set_juli=347-130;
uchar t=0;
unsigned int t1=0;
bit flag1=0,flag2=0,start_flag=0;
bit die_flag=0,pass_flag=0,over_flag=0;
/********************************************************/
void StartModule_f() //T1中断用来启动模块
{
trig_f=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig_f=0;
}
/*1MS为单位的延时程序*/
void delay_1msa(unsigned int x)
{
unsigned char j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
void set_pwm()
{
CCON = 0; //Initial PCA control register
//PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x00; //Set PCA timer clock source as Fosc/2
//Disable PCA timer overflow interrupt
CCAP0H = CCAP0L = (char)(255-0); //PWM0 port output 50% duty cycle square wave
CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode
//and no PCA interrupt
CR = 1; //PCA timer start run
}
void main()
{
unsigned char line1[]="Jessie";
unsigned char line2[]="Alvin";
unsigned int tmp=10;
set_pwm();
init_1602();
// wr_pos(2,1);
// dis_string(line2);
TMOD=0x11; //T1计数 T0定时 工作方式1
TH0=0x00;//T2赋重装计数初值
TL0=0x00;//T2赋重装计数初值
TH1=(65536-1000)/256;//T2赋重装计数初值
TL1=(65536-1000)%256;//T2赋重装计数初值
EA=1;
ET1=1;
TR1=0;
while (1)
{
if(shi_up==0)
{
while(shi_up==0);
tmp=tmp+10;
set_juli=347-tmp;
Lcd1602_number(1, 9,tmp); //显示数值
}
if(ge_up==0)
{
while(ge_up==0);
tmp=tmp+1;
set_juli=347-tmp;
Lcd1602_number(1, 9,tmp); //显示数值
}
if(shi_down==0)
{
while(shi_down==0);
tmp=tmp-10;
set_juli=347-tmp;
Lcd1602_number(1, 9,tmp); //显示数值
}
if(start==0)
{
while(start==0);
start_flag=~start_flag;
if(start_flag==1)TR1=1;
if(start_flag==0){TR1=0;CCAP0H = CCAP0L = (char)(255-0);}
}
if(start_flag==1)
{
// over_flag=0;
StartModule_f(); //启动向前的超声波
while(!echo_f);
TR0=1; //开启T0计数
while(echo_f); //当向前的超声波信号引脚echo_f为1时等待
TR0=0; //关闭T0计数
time=TH0*256+TL0;
// while((!echo_f)&&(pass_flag==0))die_flag=1;
// die_flag=0;
// pass_flag=0;
// if(over_flag==0)
// {
// TR0=1; //开启T0计数
// while(echo_f); //当向前的超声波信号引脚echo_f为1时等待
// TR0=0; //关闭T0计数
// time=TH0*256+TL0;
// }
TH0=0;
TL0=0;
juli=time*0.187;
Lcd1602_number(1, 1,(347-juli)); //显示数值
Lcd1602_number(2, 1,PS_value); //显示数值
if(PS_value>=150) PS_value=150;
if(PS_value<=0) PS_value=0;
// sum=sum+( juli-set_juli );
// PS_value=0.1*( juli-set_juli+300)+0.01*sum;
// PS_value=1.5*( juli-set_juli);
// if(PS_value>=150) PS_value=150;
// if(PS_value<=0) PS_value=0;
// f_juli=juli;
// CCAP0H = CCAP0L = (char)(255-PS_value);
//
// delay_1msa(100);
}
}
}
void timer1() interrupt 3
{
TH1=(65536-1000)/256;//T2赋重装计数初值
TL1=(65536-1000)%256;//T2赋重装计数初值
// if((die_flag==1))t1++;
// if(die_flag==0)t1=0;
// if((die_flag==1)&&(t1>1000)) {pass_flag=1;over_flag=1;t1=0;}
if(t>=5)
{
t=0;
// if(set_juli>232)set_juli=set_juli+20;
PS_value=0.04*( juli-set_juli+500); //0.1130-190)
if(( juli-set_juli )>0.0) sum=sum+0.01; //0.002
if(( juli-set_juli )<0.0) sum=sum-0.01; //0.002
// if(( juli-set_juli )>0.0)
// {
// if(flag2==1)
// {
// flag2=0;
// sum=0;
// sum=sum+0.002;//PS_value=PS_value+0.002;
// flag1=1;
// }
// else sum=sum+0.002;
// }
// if(( juli-set_juli )<0.0)
// {
// if(flag1==1)
// {
// flag1=0;
// sum=0;
// sum=sum-0.002;//PS_value=PS_value-0.0002;
// flag2=1;
// }
// else sum=sum-0.002;//PS_value=PS_value-0.0002;
// }
PS_value=PS_value+sum;
// sum=sum+( juli-set_juli )/100;
// PS_value=0.001*sum;
CCAP0H = CCAP0L = (char)(255-((int)PS_value));
}
t++;
} |
|