找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2082|回复: 4
打印 上一主题 下一主题
收起左侧

求大神把这两个程序组合起来

[复制链接]
跳转到指定楼层
楼主
ID:205456 发表于 2017-6-6 17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3黑币
/*********************************************************************
    光电开关循迹程序
*********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar x3,x4;
uint i;
sbit P20=P1^2;//L298N使能端ENA?
sbit P21=P1^5;//L298N使能端ENB?
sbit P22=P1^0;//左电机A1? IN1
sbit P23=P1^1;//左电机A2? IN2
sbit P24=P1^3;//右电机B1?  IN3
sbit P25=P1^4;//右电机B2?  IN4
sbit P10=P3^6;//右边探头?
sbit P12=P3^7;//左边探头?
void delay_us(unsigned int aa)
{
while(aa--);
}
void ds(uchar x1,uchar x2)
{
TMOD=0X01;//定时器0,工作方式1??
TH0=x1;//赋高8位初值
TL0=x2;//赋低8位初值??
x3=x1;
x4=x2;//保存计数初值
EA=1;ET0=1;//开总中断,开定时器0中断
TR0=1;//定时器0开始计数?
}

void xunji()
{
if(P10==0&&P12==0)//左、右探头都检测到黑色
{
P22=1;
//停止???
P23=0;

P24=1;

P25=0;
}
if((P10==1&&P12==1))//全检测不到黑线,前进
{
//ds(0xff,0xff);
//计数初值65535????????
P22=0;
P23=0;//全速前进
P24=0;
P25=0;
for(i=0;i<100;i++)
{
delay_us(5);
P20=~P20;
P21=~P21;
}
}
if((P10==0&&P12==1))
//右边探头检测到黑线
{
ds(0xff,0xe1);
//计数初值65505??
}
if((P10==1&&P12==0))//右边探头检测到黑线或右、中探头检测到黑线
{
ds(0xff,0xe1);//计数初值65505??
}
}
void main()
{
while(1)
{
xunji();
P20=1;
P21=1;//ENA和ENB同时为高电平时,L298N芯片正常工作
P22=1;
P23=1;
P24=1;
P25=1;
}
}
void time0()interrupt 1
{
TH0=x3;
TL0=x4;//重新赋计数初值
if((P10==1&&P12==1))//全检测不到黑线,前进
{
P22=0;
P23=0;//全速前进
P24=0;
P25=0;
}
if((P10==0&&P12==1))//右边探头检测到黑线,小车左转
{
P22=1;
P23=0;//小车左拐???
P24=0;
P25=0;
}
if((P10==1&&P12==0))//左边探头检测到黑线,小车右转
{
P22=0;
P23=0;//小车右拐??
P24=1;
P25=0;
}
}

/***************************************************************************
2.
     超声波测距并用数码管显示程序
**********************************************************************/

#include <reg52.h>//器件配置文件
#include <intrins.h>
sbit RX=P1^1;//echo
sbit TX=P1^2;//trig
sbit DU= P2^6;//数码管段选
sbit WE= P2^7;//数码管位选
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
bit flag =0;
unsigned char const discode[] ={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,0x6F,0x40,0x00/*-*/};
unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
unsigned char disbuff[4]={ 0,0,0,0,};
/********************************************************/
void Display(void)//扫描数码管
{
DU = 0;
if(posit==0)
{P0=(discode[disbuff[posit]])|0x80;}
else
{P0=discode[disbuff[posit]];}
DU = 1;
DU = 0;
WE = 0;
P0=positon[posit];
WE=1;
WE=0;
if(++posit>=3)
posit=0;
}
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;//算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
disbuff[0]=10;//“-”
disbuff[1]=10;//“-”
disbuff[2]=10;//“-”
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
/********************************************************/
void zd0() interrupt 1//T0中断用来计数器溢出,超过测距范围
{
flag=1;//中断溢出标志
}
/********************************************************/
void zd3() interrupt 3//T1中断用来扫描数码管和计800MS启动模块
{
TH1=0xf8;
TL1=0xcd;
Display();
timer++;
if(timer>=400)
{
timer=0;
TX=1;//800MS??启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
/*********************************************************/
void main(void)
{
TMOD=0x11;//设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0xf8;//2MS定时
TL1=0xcd;
ET0=1; //允许T0中断
ET1=1;//允许T1中断
TR1=1;//开启定时器
EA=1;//开启总中断
while(1)
{
while(!RX); //当RX为零时等待
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
TR0=0;//关闭计数
Conut();//计算
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-6-6 21:45 | 只看该作者
这个程序是你自己写的还是抄来的?若是你自己写的,建议你再进一步学学;若是抄来的,就把这个程序枪毙了。因为这是一个烂程序,我还是第一次看到一个有连续21个NOP组成的程序。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:62223 发表于 2017-6-7 15:26 | 只看该作者
楼上真有雅兴,那么耐心数得那么准确
回复

使用道具 举报

地板
ID:111634 发表于 2017-6-7 22:22 | 只看该作者
有10000个NOP组成的程序更好玩
回复

使用道具 举报

5#
ID:206560 发表于 2017-6-9 03:06 | 只看该作者
左右手指相扣,就是两个程序合并的结果。 #include 部分 先合并,接着是  SBIT  然后是 全局变量。 自定义函数,main 初始化部分  , while(1)内容。 也就是把程序看成六段组成,每段分别合并。最后是 整理变量名,函数名,端口和定时器,看看有没有冲突。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表