📄 dpj.txt
字号:
}
if(xjqkq==0x03) {jpt=0;ztsds=ytsds=40;} //不偏
}
*/
{ if(((xjqk==4)|(xjqk==6))&(jpt!=1)) //尾巴左偏
{ ztsds=49;ytsds=5;
// if(ztsds>49) ztsds=49;
jpt=1;
}
if(((xjqk==1)|(xjqk==3))&(jpt!=2)) //尾巴右偏
{ ztsds=5;ytsds=49;
// if(ytsds>49) ytsds=49;
jpt=2;
}
if(xjqk==5) {ztsds=ytsds=40;jpt=0;} //不偏
}
break;
}
case 13:{ //垂直前进
if((xjqk==0)&(!kk))
{ kk=1;ll++; }
else
{ if(xjqk==7) kk=0;}
if(ll==2) //已寻到下一条线,应倒退9个计数
{ zen=0;yen=0;zin=0;yin=0;zjsn=yjsn=9; //准备临时倒退
delay(100);
zen=yen=1;lszt=1;ll=3; //启动临时倒退
}
if((ll==3)&(!lszt))
{ zen=0;yen=0;zin=1;yin=0; //准备右转
delay(100);
zjs=yjs=0;ztsds=ytsds=40;zen=yen=1;xczt=4;l++; //右转
}
break;
}
case 14:{ //垂直后退
if((xjqk==0)&(!kk))
{ kk=1;l--; }
else
{ if(xjqk==7) kk=0;
}
if((l==1)&(!lszt)) //已退到初始线,应右转向后停车,完成任务
{
zen=0;yen=0;zin=0;yin=0;zjsn=yjsn=9; //准备临时倒退
delay(100);
zen=yen=1;lszt=1;lll=1;l=0; //启动临时倒退
}
if((lll)&(!lszt))
{
zjs=yjs=0;zen=1;yen=1;zin=1;yin=0;xczt=4;zxrwtt=1; //右转后即完成任务
}
break;
}
case 5: { //左转向完成后暂停
if(l==lm) //应垂直后退
{ zin=0;yin=0;zen=1;yen=1;
ztsds=40;ytsds=40;
xczt=14;kk=0;lszt=0;
}
else //应垂直前进
{ zin=1;yin=1;zen=yen=1;
ztsds=40;ytsds=40;
xczt=13;kk=0;ll=0;
}
break;
}
case 6: { //右转向完成后暂停
if(l==1) //应停车任务完成
{ zin=1;yin=1;zen=0;yen=0;
xczt=0;zxrwt=0;
}
else //应寻线前进
{ zin=1;yin=1;zen=1;yen=1;
zjsn=yjsn=0;
ztsds=40;ytsds=40;
xczt=11;jpt=0;wtjct=0; //执行寻线前进 物体检验状态置0
}
break;
}
default:{ break; } //
}
}
/*************************************************/
uchar xjqkfx(void)
{ //TL1543模拟通道3,4,5分别为光敏电阻的右寻迹3,左寻迹4,中寻迹5
uchar b=0xff,c=0,d=0,e;
if(adsjc[4]>z0) c=1; //左寻迹4
c<<=1;
if(adsjc[5]>zh0) c++; //中寻迹5
c<<=1;
if(adsjc[3]>y0) c++; //右寻迹3
ccc=c;
if(adsjc[2]>qz0) d++; //前左寻迹1
d<<=1;
if(adsjc[0]>qy0) d++; //前右寻迹2
e=(d<<3)|c;
xjqkq=d;
if(e==xjqk0)
{ xjqkn++;
if(xjqkn>2)
{ b=c;
xjqkn=3;
}
}
else
{ xjqk0=e;xjqkn=1;
}
return(b);
}
/*************************************************/
uchar ezhs(uint sj) //二进制转换为十进制
{ uchar b,c;
uint xs;
float x;
c=(sj>>10); //取整数部分
xs=(sj&0x03ff); //小数部分
x=(float)(xs*9.76563e-4); //最低位对应的十进制值9.76563e-4
b=x*10; //取十分位数字
c=c*10+b;
return(c);
}
/*************************************************/
void tq2(void) //TQ-2气体传感器
{
if((adsjc[7]>tq20)&(!fmqzt))
{ FMQ=1;fmqzt=1;fmqxys=8; //启动蜂鸣器发声5秒
}
}
/*************************************************/
void tq5(void) //TQ-5气体传感器
{
if((adsjc[8]>tq50)&(!fmqzt))
{ FMQ=1;fmqzt=1;fmqxys=4; //启动蜂鸣器发声5秒
}
}
/************************************************/
void fw18b20(void) //18b20复位
{ uchar tt=1;
while(tt)
{ while(tt)
{ D18b20=1;_nop_();_nop_();
D18b20=0; //发复位负脉冲480us—960us
delay2(50); //550us
D18b20=1; //释放总线等待18b20的存在负脉冲
delay2(6); //66us
tt=D18b20; //读总线
}
delay2(45); //500us
tt=~D18b20;
}
D18b20=1;
}
/*************************************************/
void write18b20_byte(uchar val) //写18b20一字节
{ uchar i;
for(i=8;i>0;i--)
{ D18b20=1;_nop_();_nop_();
D18b20=0;_nop_();_nop_();_nop_();_nop_();_nop_();
D18b20=val&0x01;
delay2(6);
val=val/2;
}
D18b20=1;
delay2(1);
}
/************************************************/
void dwd(void)
{ fw18b20(); //总线复位
write18b20_byte(0xcc); //发Skip ROM 命令
write18b20_byte(0xbe); //发读命令
wendu[0]=read18b20_byte(); //温度低8位
wendu[1]=read18b20_byte(); //高8位
fw18b20(); //
write18b20_byte(0xcc); //发Skip ROM 命令
write18b20_byte(0x44); //启动下次温度转换
wdsjcl(); //去处理温度数据
}
/************************************************/
uchar read18b20_byte(void) //写18b20一字节
{ uchar i,val=0;
for(i=8;i>0;i--)
{ D18b20=1;_nop_();_nop_();
val>>=1;
D18b20=0;_nop_();_nop_();_nop_();_nop_();
D18b20=1;_nop_();_nop_();_nop_();_nop_();
if(D18b20) val|=0x80;
delay2(6);
}
D18b20=1;
return(val);
}
/*************************************************/
void wdsjcl(void) //温度数据处理
{ uchar w;
wenduc[4]=0; //符号位,正温度
if(wendu[1]>127) //负温度,求补码
{ wendu[1]=256-wendu[1];
wendu[0]=256-wendu[0];
wenduc[4]=1; //符号位,负温度
}
w=wendu[0]&0x0f;
wenduc[0]=wdxs[w]; //温度小数部分查表
w=((wendu[0]&0xf0)>>4)|((wendu[1]&0x0f)<<4); //温度整数部分
wenduc[3]=w/100; //百位数字 //
wenduc[1]=w%100;
wenduc[2]=wenduc[1]/10; //十位数字
wenduc[1]=wenduc[1]%10; //个位数字
wenduf=(float)w+(float)wenduc[0]/10;
if(wenduc[4]==1) wenduf=-wenduf;
}
/*************************************************/
void main(void)
{
uchar i;
xtcsh();
init_Max7219();
while(1)
{
for(i=0;i<9;i++) //A/D转换的十个通道
{ adsj[i]=adzh(i);
adsjc[i]=ezhs(adsj[i]);
}
if((!dwdjz)&(xsfs==8)) { dwd();dwdjz=1; } //显示温度时,每秒测一次温度
if(zxrwt) zxrw();
jz=dhwk();
zxml(jz);
sxxs(xsfs);
tq2();
tq5();
switch(xczt)
{
case 11: { LED1=0;LED2=1;LED3=1;LED4=1;break; } //任务1寻线前进11
case 12: { LED1=1;LED2=0;LED3=1;LED4=1;break; } //任务2寻线后退12
case 13: { LED1=1;LED2=1;LED3=0;LED4=1;break; } //任务3垂直前进13
case 14: { LED1=1;LED2=1;LED3=1;LED4=0;break; } //任务4垂直后退14
case 21: { LED1=0;LED2=1;LED3=1;LED4=0;break; } //TQ-2检测到气体
case 22: { LED1=1;LED2=0;LED3=1;LED4=0;break; } //TQ-3检测到气体
default: { LED1=1;LED2=1;LED3=1;LED4=1;break; } //
}
}
}
/*************************************************/
void t0zd(void) interrupt 1
{
TH0=0xfb;TL0=0xc3; //载入初始值
}
/*************************************************/
void t2zd(void) interrupt 5
{ TF2=0;
if(hwkjz)
{ hwkjzys--;
if(hwkjzys==0) hwkjz=0;
}
sxjzys--;
if(sxjzys==0) {sxjzys=200;sxjz=!sxjz;}
n500++;
if(n500==500)
{ n500=0;
if(fmqzt) { fmqxys--;FMQ=!FMQ; //蜂鸣器正在发声状态则延时减1
if(fmqxys==0) { FMQ=0;fmqzt=0;} //延时终,蜂鸣器静
}
}
n1000++; //一秒计数
if(n1000==1000)
{
n1000=0;
dwdjz=!dwdjz;
ss++; //秒递加
if(ss==60)
{ ss=0;mm++; //分
if(mm==60)
{ mm=0;hh++;
if(hh==24) hh=0;
}
}
if((hh==gzhh)&(mm==gzmm)&(!zxrwt))
{ zxrwt=1;zxrwtt=0;xczt=11;l=1;xjqk=xjqk0=0xff;xjqkn=0;jpt=0; //定时自动启动场地扫描任务
zjsn=yjsn=0;zen=yen=1;
sss=0;mmm=0;
}
if(zxrwt)
{ sss++;
if(sss==60)
{ sss=0;mmm++; //分
}
}
}
tsjs++;
if(tsjs==50) tsjs=0;
if(tsjs<ztsds) ztsk=1;//左电机调速端口
else ztsk=0;
if(tsjs<ytsds) ytsk=1;//右电机调速端口
else ytsk=0;
}
/*************************************************/
uchar dhwsj(void)
{
uchar i,b;
b=0;
for(i=1;i<9;i++)
{
TH1=0;TL1=0;
while(!HWK)
{;}
TR1=1;
while(HWK)
{;}
TR1=0;
b>>=1;
if(TH1>=0x04)
{
b|=0x80;
}
}
return(b);
}
/*************************************************/
uchar dhwk(void) //读红外口
{
uchar b;
uchar c=0xff;
HWK=1;
if((!HWK)&(hwkjz!=1))
{
TH1=0;TL1=0;TR1=1;
while(!HWK)
{;}
TR1=0;
if(TH1>0x11) //大于8ms的低电平
{
EA=0;
while(HWK) //等待4ms高电平结束
{;}
b=dhwsj(); //读识别码
// hmsm[3]=b;
if(b==0x02) //识别码正确
{
while(!HWK)
{;}
while(HWK)
{;}
b=dhwsj(); //读键值
c=b;
// hmsm[3]=b;
hwkjz=1;hwkjzys=200;
}
EA=1;
}
// EX0=1;
// EA=1;
}
return(c);
}
/*****************************************************/
void zxml(uchar jz)
{
switch(jz)
{
case 0x09: { zen=0;yen=0;xczt=0;zxrwt=0;break; } //停机,并取消任务/消音键MUTE
case 0x0c: { if(zanting) //暂时停机或取消暂时停机(奇偶开关)/定时关机键OFF TIMER
{ zen=1;yen=1;zanting=0; }
else
{ zen=0;yen=0;zanting=1; }
break;
}
case 0x0e: { zxrwt=1;zxrwtt=0;xczt=11;l=1;xjqk=xjqk0=0xff;xjqkn=0;jpt=0; //开始执行场地扫描任务/开关键STANDBY
zjsn=yjsn=0;zen=yen=1;
sss=0;mmm=0;
break;
}
case 0x06: { zin=1;yin=1;zen=1;yen=1;xczt=1;break; } //前进/亮度+BRIGHT+
case 0x05: { zin=0;yin=0;zen=1;yen=1;xczt=2;break; } //后退/亮度-BRIGHT-
case 0x08: { zin=0;yin=1;zen=1;yen=1;zjs=0;yjs=0;xczt=3;break; } //左转/色度+COLOUR+
case 0x07: { zin=1;yin=0;zen=1;yen=1;zjs=0;yjs=0;xczt=4;break; } //右转/色度-COLOUR-
case 0x03: { ztsds++; //左加速1档/音量+VOL+
if(ztsds>48) ztsds=48;
break;
}
case 0x04: { ztsds--; //左减速1档/音量-VOL-
if(ztsds<10) ztsds=10;
break;
}
case 0x01: { ytsds++; //右加速1档/节目+PROG+
if(ytsds>48) ytsds=48;
break;
}
case 0x02: { ytsds--; //右减速1档/节目-PROG-
if(ytsds<10) ytsds=10;
break;
}
case 0x10: { xsfs=0;break; } //显示实时时间/1
case 0x11: { xsfs=1;break; } //显示左右轮转动脉冲计数/2
case 0x12: { xsfs=2;break; } //显示调速档数/3
case 0x13: { xsfs=3;break; } //显示左前右三路红外检测A/D转换的电压值/4
case 0x14: { xsfs=4;break; } //显示两路光敏电阻寻迹检测A/D转换的电压值/5
case 0x15: { xsfs=5;break; } //显示左右转向时轮转动脉冲数/6
case 0x16: { xsfs=6;break; } //显示寻迹情况分析qkfx实时值/7
case 0x17: { xsfs=7;break; } //显示前寻迹检测A/D转换的电压值/8
case 0x18: { xsfs=8;break; } //显示测温值/9
case 0x0f: { xsfs=9;break; } //显示完成任务时间/屏幕显示键DISPLAY
case 0x1a: { xsfs=0; //调时间小时加一/~10
hh++;
if(hh==24) hh=0;
break;
}
case 0x1b: { xsfs=0; //调时间分加一/~20
mm++;ss=0;
if(mm==60) mm=0;
break;
}
case 0x19: { xsfs=1; //累计计数请0/0
zjsn=yjsn=0;
break;
}
default: { break; } // 其他键无效
}
}
/*遥控板按键与其对应的键值
01H 节目+ 02H 节目- 03H 音量+ 04H 音量- 05H 亮度- 06H 亮度+
07H 色度- 08H 色度+ 09H 消音 0CH 定时关机 0DH TV/视频 0EH 开关
0FH 屏幕显示 10H 1 11H 2 12H 3 13H 4 14H 5
15H 6 16H 7 17H 8 18H 9 19H 0 1AH 10
1BH 20
*/
/*****************************************************/
void int0zd(void) interrupt 0 //左车轮脉冲计数
{
if((xczt==1)|(xczt==11)) zjsn++; //前进,累加
if((xczt==2)|(xczt==12)|lszt) zjsn--; //后退,减计数
if(zjsn>65530) zjsn=0;
if((zjsn==0)&lszt) lszt=0; //临时倒退终止
if((xczt==3)|(xczt==4)) //左或右转向,临时计数
{ zjs++;
if(zjs==zxjs90)
{ zen=0;yen=0;
if(xczt==3) xczt=5;
if(xczt==4) xczt=6;
if((xczt==4)&(zxrwtt)) {zxrwt=xczt=0;zxrwtt=0;xsfs=9;} //右转后完成任务停车并显示完成任务时间
}
}
}
/*****************************************************/
void int1zd(void) interrupt 2 //右车轮脉冲计数
{
if((xczt==1)|(xczt==11)) yjsn++; //前进,累加
if((xczt==2)|(xczt==12)|lszt) yjsn--; //后退,减计数
if(yjsn>65530) yjsn=0;
if((yjsn==0)&lszt) lszt=0; //临时倒退终止
if((xczt==3)|(xczt==4)) //左或右转向,临时计数
{ yjs++;
if(yjs==zxjs90)
{ zen=0;yen=0;
if(xczt==4) xczt=6;
if(xczt==3) xczt=5;
if((xczt==4)&(zxrwtt)) {zxrwt=xczt=0;zxrwtt=0;xsfs=9;} //右转后完成任务停车并显示完成任务时间
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -