超声波避障小车c程序
基于51单片机的红外避障+超声波避障程序
基于51单⽚机的红外避障+超声波避障程序最近在学习关于51单⽚机控制智能⼩车,学习了很多⼤佬优秀的代码和思路受到了⼀些启发,决定按⾃⼰的逻辑尝试⼀下关于红外避障+超声波避障的程序经过实际测试,当PWM在50%左右,效果还⾏,但当全速前进时效果不是很理想代码还有待改进,有些地⽅逻辑⽐较混乱,单纯只是为了能跑通,有待优化先记录⼀下,毕竟也花了不少时间来写和调试#include<reg52.H>#include "test2.h"#include <stdlib.h>sbit P22 = P2^2;sbit P23 = P2^3;sbit P24 = P2^4;sbit TRIG = P2^1;sbit ECHO = P2^0;sbit left_zhangai = P3^4;sbit right_zhangai = P3^5;unsigned char flag = 0;unsigned char i;unsigned int out_TH0, out_TL0, distance;void left_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_left_backward();}}void right_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_right_backward();}}void all_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_right_backward();}}void back_bizhang(){for (i = 0; i < 10; i++)car_straight_backward();for (i = 0; i < 10; i++)car_left_backward();}void init_time(){TMOD = 0x11; //启动0 1两个定时器TH0 = 0;TL0 = 0;TR0 = 0;TR1 = 0;TH1 = 238;TL1 = 0;TF0 = 0; //中断溢出标志位TF1 = 1;ET0 = 1;ET1 = 1;EA = 1;}void run(){P22 = 1;P24 = 1;left_zhangai = 1;right_zhangai = 1;TRIG = 0; // 先给控制端初始化为0car_straight_forward_per50();distance = 100;while(1){/////////////////////////////label:if (left_zhangai == 1&&right_zhangai == 1){car_straight_forward_per50();}else{if (left_zhangai == 0&&right_zhangai == 0) {all_bizhang();}if (right_zhangai == 0&&left_zhangai == 1) {right_bizhang();}if (left_zhangai == 0&&right_zhangai == 1) {left_bizhang();}}init_time(); //初始化定时器flag = 0; //置溢出标志位为0//控制⼝发⼀个10US 以上的⾼电平TRIG = 1;TR1 = 1; //启动定时器1delay_10um(2);TRIG = 0;//等待接收端出现⾼电平while(!ECHO){if (TH1 == 0){distance = 200;goto label;}};TR0 = 1; //启动计时器开始计时while(ECHO){if (TH1 == 0){distance = 200;goto label;}}; //等待⾼电平结束TR0 = 0; //关闭低电平out_TH0 = TH0; //取定时器的值out_TL0 = TL0;distance = (TH0*256 + TL0)*1.7/100;if (flag == 1){flag = 0;}else if (distance >= 200){car_straight_forward_per50();}else if (distance <= 10){back_bizhang();}else if (distance <= 20){all_bizhang();}///////////////////////////////////////// }}void timer0() interrupt 1//中断函数{flag=1; //溢出标志位置1}。
超声波避障小车程序设计
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbitEN1=P1^4;
sbit EN2=P1^5;
bitRight_moto_stop=1;
bitLeft_moto_stop =1;
#defineLeft_moto_go{IN1=0,IN2=1,EN1=1;} //左电机向前走
超声波避障小车程序设计
———————————————————————————————— 作者:
———————————————————————————————— 日期:
ﻩ
/***********************************************************************************************************/
time=TH0*256+TL0;
TH0=0;
TL0=0;
S1=(time*1.7)/100; //算出来是CM}
void Count2()//计算函数
{ while(!RX2); //当RX2为零时等待
TR0=1; //开启计数
while(RX2); //当RX2为1计数并等待
TR0=0;//关闭计数
time=TH0*256+TL0;
TH0=0;
TL0=0;
S4=(time*1.7)/100; //算出来是CM }
void Count5()//计算函数
{
while(!RX5);//当RX5为零时等待
TR0=1;//开启计数
while(RX5); //当RX5为1计数并等待
智能小车超声波避障实验
度考虑进去。
测距的公式表示为:L=C×T 式中L 为测量的距离 长度;C 为超声波在空气中的传播速度;T 为测 量距离传播的时间差(T 为发射到接收时间数值的 一半)。已知超声波速度C=344m/s (20℃室温)
HC-SR04接口定义:
Vcc、 Trig(触发端)、 Echo(回声端)、 Gnd
本产品使用方法:触发端发一个10US 以上的高电平,就可以在回声 端等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平 时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此 不断的周期测,就可以达到你移动测量的值了。
智能小车超声波避障实验
单击此处添加您的正文
HC-SR04超声波模块
安装位置
小车车头处留有超声波模块的插口(J2), 超声波探头朝前方直接插上即可
HC-SR04产品特点
1、典型工作用电压:5V。 2、超小静态工作电流:小于2mA。 3、感应角度:不大于15 度。 4、探测距离:2cm-400cm 5、高精度:可达0.3cm。 6、盲区(2cm)超近。
对于超声波测距精度要求达到1mm 时,就必 须把超声波传播的环境温
模块工作原理:
01
采用 IO 触发测距,给至少10us 的高电平信号;
02
模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
03
有信号返回,通过IO 输出一高电平,高电平持续的时间就是超 声波从发射到返回的时间
哈工大 单片机课程设计超声波避障小车
H a r b i n I n s t i t u t e o f T e c h n o l o g y课程设计说明书(论文)设计题目:超声波避障小车院系:电气工程及自动化学院班级:XXXXXXX设计者:XXX学号:XXXXXXXXXX指导教师:于彤彦设计时间:2013.09.02.-2013.09.11哈尔滨工业大学哈尔滨工业大学课程设计任务书开题报告一.立项依据1.1课题目的●进一步熟练掌握单片机的使用方法、提高程序的编写能力●掌握单片机系统外扩器件的连接与使用●掌握软件和硬件调试的基本技巧与方法●提高器件说明书以及时序过程的阅读、理解能力1.2立项目的(1)设计一辆利用超声波传感器来实现避障功能的小车,使小车对其运动方向受到的阻碍作出各种躲避障碍的动作。
(2)进一步学习单片机原理及其应用,了解超声波传感器的工作原理。
1.3立项意义在当今社会,汽车成为了越来越普遍,人们不可缺少的交通工具。
但汽车的不断增加,随之而来就是越来越多的交通事故。
交通事故成为了现在越来越严重的安全隐患。
所以随着汽车工业的快速发展,我们必须加强对汽车安全性能的考虑。
所以,智能汽车概念应运而生,他既是汽车产业的机遇也是汽车产业的挑战。
汽车的智能化必将是未来汽车产业发展的趋势,在这样的背景下,我们开展了基于超声波的智能小车的避障研究。
超声波作为智能车避障的一种重要手段,以其避障实现方便,计算简单,易于做到实时控制,测量精度也能达到实用的要求,在未来汽车智能化进程中必将得到广泛应用。
我国作为一个世界大国,在高科技领域也必须占据一席之地,未来汽车的智能化是汽车产业发展必然的,在这种情况下研究超声波在智能车避障上的应用具有深远意义,这将对我国未来智能汽车的研究在世界高科技领域占据领先地位具有重要作用。
二.课题设计2.1设计要求(1)在车前方没有障碍物时,小车沿直线向前走。
(2)在车前方有障碍物时,小车能避开障碍物,避障方法如下:①先向左边转90度,如果前面没有障碍物,再沿直线向前走;②如果前面仍有障碍物,则向右转180度,如果前面没有障碍物,则直线行走;③如果前面仍有障碍物,则向右90度,然后直线行走2.2设计原理该智能车系统可分为四个主要模块:传感器避障模块,单片机主控核心模块,电机驱动模块,USB下载模块。
超声波避障小车编程程序
附录:超声波避障小车程序源代码#include"warterlight.h"#include"steer.h"#include<reg52.h>void delay_ms(unsigned int ms);extern void write_com(unsigned char dat,unsigned char test_flag) ;extern void write_date(unsigned char dat);extern void display(void);extern void init1602() ;extern void forward();extern void stop();extern void turn_left();extern void turn_right();extern void backward();unsigned char distance;sbit so=P3^4;sbit led=P1^5;void display(void){unsigned char ge,shi,bai,d;d=(unsigned char)distance;bai=d/100;ge=d%10;shi=d/10%10;write_com(0x80+0x0b,0);write_date(bai+0x30);write_date(shi+0x30);write_date(ge+0x30);}void main(void){char i;unsigned int k=0,j=0;so=0 ;init1602(); //液晶初始化while(1){k=0;/*产生约5us的脉冲*/so=1;i++;i++;i++;so=0;delay_nus(50); /*延时一段时间,度过不稳定期*/ while(so) // 脉冲来了{k++; // 表征脉冲的宽度}if(k){distance=k/10;display();if(distance>10){led=1;for(j=3;j>0;j--){forward();}}else{led=0;turn_left();}}}}#include"steer.h"#include<reg52.h>sbit P1_0=P1^0;sbit P1_1=P1^1;void delay_nus(unsigned int i){i=i/10;while(--i);}void forward(){P1_0=1;delay_nus(1300);P1_0=0;P1_1=1;delay_nus(1700);P1_1=0;delay_nus(20000);TR1=1;}void stop(){P1_0=1;delay_nus(1500);P1_0=0;P1_1=1;delay_nus(1500);P1_1=0;delay_nus(20000);TR1=1;}void backward(){P1_0=1;delay_nus(1700);P1_0=0;P1_1=1;delay_nus(1300);P1_1=0;delay_nus(20000);}void turn_left(){unsigned int i;for(i=30;i>0;i--){P1_0=1;delay_nus(1300);P1_0=0;P1_1=1;delay_nus(1300);P1_1=0;delay_nus(20000); }}void turn_right(){unsigned int i;for(i=30;i>0;i--){ TR1=0;P1_0=1;delay_nus(1700);P1_0=0;P1_1=1;delay_nus(1700);P1_1=0;delay_nus(20000);TR1=1;}}#include"waterlight.h"#include<reg52.h>#define uint unsigned int#define uchar unsigned charvoid delay_ms(uint ms);void init1602(void);void write_com(uchar dat,uchar test_flag); void write_date(uchar dat);void display(void);void busy(void);sbit Lcd_rs=P2^2;sbit Lcd_rw=P2^1;sbit Lcd_en=P2^0;uchar code TAB1[]=" distance cm"; void delay_ms(uint ms){uint x,y;for(x=ms;x>0;x--)for(y=70;y>0;y--);}void write_com(uchar dat,uchar test_flag) {uchar temp;if(test_flag==1)busy();Lcd_rw=0;Lcd_rs=0;P0=0x0f; //置高temp=0xf0&dat;P0=temp;Lcd_en=1;Lcd_en=1;Lcd_en=0;P0=0x0f;temp=(0x0f&dat)<<4;P0=temp;Lcd_en=1;Lcd_en=1;Lcd_en=0;}void write_date(uchar dat){uchar temp;busy();Lcd_rw=0;Lcd_rs=1;P0=0x0f;temp=0xf0&dat;P0=temp;Lcd_en=1;Lcd_en=1;Lcd_en=0;P0=0x0f;temp=(0x0f&dat)<<4;P0=temp;Lcd_en=1;Lcd_en=1;Lcd_en=0;}void init1602(void){uchar i;Lcd_rw=0;delay_ms(20);Lcd_en=0;write_com(0x28,0);delay_ms(1);write_com(0x28,0);delay_ms(1);write_com(0x28,0);delay_ms(1);write_com(0x28,1);write_com(0x08,1);write_com(0x0c,1);write_com(0x06,1);write_com(0x01,1);write_com(0x80+0x00,0);for(i=0;i<16;i++){write_date(TAB1[i]);//写第一行}}void busy(void){bit flag;uchar a;Lcd_rw=1;Lcd_rs=0;Lcd_en=1;P0=0xff;do{a=P0;a=a&0x80;if(a==0x80)flag=1;elseflag=0;}while(flag);Lcd_en=0; }。
超声波避障小车设计毕业设计
摘要80C51单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。
这里介绍的是如何用80C51单片机来实现长春工业大学的毕业设计,该设计是结合科研项目而确定的设计类课题。
本系统以设计题目的要求为目的,采用80C51单片机为控制核心,利用超声波传感器检测道路上的障碍,控制电动小汽车的自动避障,快慢速行驶,以及自动停车,并可以自动记录时间、里程和速度,自动寻迹和寻光功能。
整个系统的电路结构简单,可靠性能高。
实验测试结果满足要求,本文着重介绍了该系统的硬件设计方法及测试结果分析。
采用的技术主要有:(1)通过编程来控制小车的速度;(2)传感器的有效应用;(3)新型显示芯片的采用关键词80C51单片机、光电检测器、PWM调速、电动小车TitleAbstract80C51 is a 8 bit single chip computer.Its easily useing and multi-function suffer large users. This article introduce the CCUT graduation design with the 80C51 single chip copmuter.This design combines with scientific research object. This system regard the request of the topic, adopting 80C51 for controling core,super sonic sensor for test the hinder.It can run in a high and a low speed or stop automatically.It also can record the time ,distance and the speed or searching light and mark automatically The electric circuit construction of whole system is simple, the function is dependable. Experiment test result satisfy the request, this text emphasizes introduced the hardware system designs and the result analyse.The adoption of technique as:(1)Reduce the speed by program the engine;(2)efficient application of the sensor;(3)The adoption of the new display chip.Keywords 80C51 single chip computer、light electricity detector、PWM speed adjusting毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
智能循迹避障小车C语言代码
array[0]=(sec%10);
array[1]=(sec/10);
array[2]=(min%10);
array[3]=(min/10);
}
void display()
{
P0=tab[array[0]];
P2=0X01;
delay();
sbit P37=P3^7;
sfr WDT_CONTR=0Xe1;
uint line,flag_stop=1,flag_signal; //小车停止标志位 ,障碍物检测标志位
uint flag_zuo=0,flag_you=0; //偏离黑线标志位
uint number=0;
uint sec=0,min=0,count=0;//时间初始化
delay();
P2=0X00;
}
void delay()
{
uint i;
for(i=500;i>0;i--);
}
void check()
{
P10=1;
_nop_();
_nop_();
flag_signal=P10;
if(flag_signal==0) //检测到障碍物
P2=0X00;
P0=tab[array[1]];
P2=0X02;
delay();
P2=0X00;
P0=tab[array[2]];
P2=0X04;
delay();
P2=0X00;
P0=tab[array[3]];
P2=0X08;
{
P14=0,P15=1,P16=1,P17=1;
Arduino超声波智能避障小车完整代码
Arduino超声波智能避障⼩车完整代码// Arduino超声波 智能避障⼩车(不含舵机)#include <LiquidCrystal.h> //申明1602液晶的函数库LiquidCrystal lcd(11,2,3,4,7,8); //4数据⼝模式连线声明,//===============================================================//LCD的接⼝:各个引脚连接的I/O⼝编号,格式为// LiquidCrystal(rs, enable, d4, d5, d6, d7)// LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)// LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)// LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)//===============================================================int Echo = A0; // Echo回声脚(P2.0)int Trig =A1; // Trig 触发脚(P2.1)int Distance = 0;int L_motor_back=5; //左电机后退(IN1)int L_motor_go=6; //左电机前进(IN2)int R_motor_go=9; // 右电机前进(IN3)int R_motor_back=10; // 右电机后退(IN4)void setup(){Serial.begin(9600); // 初始化串⼝//初始化电机驱动IO为输出⽅式pinMode(L_motor_go,OUTPUT); // PIN 5 (PWM)pinMode(L_motor_back,OUTPUT); // PIN 6 (PWM)pinMode(R_motor_go,OUTPUT);// PIN 9 (PWM)pinMode(R_motor_back,OUTPUT);// PIN 10 (PWM)//初始化超声波引脚pinMode(Echo, INPUT); // 定义超声波输⼊脚pinMode(Trig, OUTPUT); // 定义超声波输出脚lcd.begin(16,2); //初始化1602液晶⼯作 模式//定义1602液晶显⽰范围为2⾏16列字符}//=======================智能⼩车的基本动作=========================void run() // 前进{analogWrite(R_motor_go,200);//右电机前进,PWM⽐例0~255调速,左右轮差异略增减analogWrite(R_motor_back,0);analogWrite(L_motor_go,200);// 左电机前进,PWM⽐例0~255调速,左右轮差异略增减analogWrite(L_motor_back,0);}void brake() //刹车,停车{digitalWrite(R_motor_go,LOW);digitalWrite(R_motor_back,LOW);digitalWrite(L_motor_go,LOW);digitalWrite(L_motor_back,LOW);}void left() //左转(左轮不动,右轮前进){analogWrite(R_motor_go,200); //右电机前进,PWM⽐例0~255调速analogWrite(R_motor_back,0);digitalWrite(L_motor_go,LOW); //左轮不动digitalWrite(L_motor_back,LOW);}void spin_left() //左转(左轮后退,右轮前进){analogWrite(R_motor_go,200); //右电机前进,PWM⽐例0~255调速analogWrite(R_motor_back,0);analogWrite(L_motor_go,0);analogWrite(L_motor_back,200);//左轮后退PWM⽐例0~255调速}void right() //右转(右轮不动,左轮前进){digitalWrite(R_motor_go,LOW); //右电机不动digitalWrite(R_motor_back,LOW);analogWrite(L_motor_go,200);analogWrite(L_motor_back,0);//左电机前进,PWM⽐例0~255调速}void spin_right() //右转(右轮后退,左轮前进){analogWrite(R_motor_go,0);analogWrite(R_motor_back,200);//右电机后退,PWM⽐例0~255调速analogWrite(L_motor_go,200); //左电机前进,PWM⽐例0~255调速analogWrite(L_motor_back,0);}void back() //后退{analogWrite(R_motor_go,0);analogWrite(R_motor_back,150);//右轮后退,PWM⽐例0~255调速analogWrite(L_motor_go,0);analogWrite(L_motor_back,150);//左轮后退,PWM⽐例0~255调速}//==========================================================void Distance_test() // 量出前⽅距离{digitalWrite(Trig, LOW); // 给触发脚低电平2μsdelayMicroseconds(2);digitalWrite(Trig, HIGH); // 给触发脚⾼电平10μs,这⾥⾄少是10μsdelayMicroseconds(10);digitalWrite(Trig, LOW); // 持续给触发脚低电float Fdistance = pulseIn(Echo, HIGH); // 读取⾼电平时间(单位:微秒)Fdistance= Fdistance/58; //为什么除以58等于厘⽶, Y⽶=(X秒*344)/2 // X秒=( 2*Y⽶)/344 ==》X秒=0.0058*Y⽶ ==》厘⽶=微秒/58Serial.print("Distance:"); //输出距离(单位:厘⽶)Serial.println(Fdistance); //显⽰距离Distance = Fdistance;}void Distance_display()//显⽰距离{if((2<Distance)&(Distance<400)){lcd.home(); //把光标移回左上⾓,即从头开始输出lcd.print(" Distance: "); //显⽰lcd.setCursor(6,2); //把光标定位在第2⾏,第6列lcd.print(Distance); //显⽰距离lcd.print("cm"); //显⽰}else{lcd.home(); //把光标移回左上⾓,即从头开始输出lcd.print(" Out of range"); //显⽰超出距离}delay(250);lcd.clear();}void loop(){while(1){Distance_test();//测量前⽅距离Distance_display();//液晶屏显⽰距离if(Distance < 40)//数值为碰到障碍物的距离,可以按实际情况设置{if(Distance < 5){back();delay(100);brake();}while(Distance < 60)//再次判断是否有障碍物,若有则转动⽅向后,继续判断 {spin_right();//右转delay(100);brake();//停车Distance_test();//测量前⽅距离Distance_display();//液晶屏显⽰距离if(Distance < 60){spin_left();delay(200);brake();//停车Distance_test();//测量前⽅距离Distance_display();//液晶屏显⽰距离}}}elserun();//⽆障碍物,直⾏}}。
基于Arduino的超声波壁障小车源程序
基于Arduino的超声波壁障小车源程序河南大学王艺// L = 左// R = 右// F = 前// B = 後#include <Servo.h>int pinLF=14; // 定义6脚位左后int pinLB=15; // 定义9脚位左前int pinRF=16; // 定义10脚位右前int pinRB=17; // 定义11脚位右后int inputPin = 9; // 定义超音波接受脚位int outputPin =8; // 定义超音波发送脚位int Fspeedd = 0; // 前速int Rspeedd = 0; // 右速int Lspeedd = 0; // 左速int directionn = 0;Servo myservo; //myservoint delay_time = 250; // 舵机的稳定时间int Fgo = 8; // 前进int Rgo = 6; // 右转int Lgo = 4; // 左转int Bgo = 2; // 倒车void setup(){Serial.begin(9600);pinMode(pinLB,OUTPUT);pinMode(pinLF,OUTPUT);pinMode(pinRB,OUTPUT);pinMode(pinRF,OUTPUT);pinMode(inputPin, INPUT);pinMode(outputPin, OUTPUT);myservo.attach(10); // 定义舵机第5脚位(PWM)}void advance(int a) // 前进{digitalWrite(pinRF,HIGH);digitalWrite(pinRB,LOW);//analogWrite(pinRF,100);//analogWrite(pinRB, 0);digitalWrite(pinLF,HIGH);digitalWrite(pinLB,LOW);//analogWrite(pinLF,100);//analogWrite(pinLB,0);delay(a * 100);}void right(int b){digitalWrite(pinRF,LOW);digitalWrite(pinRB,LOW);//analogWrite(pinRF,0);// analogWrite(pinRB, 0);digitalWrite(pinLF,HIGH);digitalWrite(pinLB,LOW);//analogWrite(pinLF,100);// analogWrite(pinLB,0);delay(b * 100);}void left(int c){digitalWrite(pinRF,HIGH);digitalWrite(pinRB,LOW);//analogWrite(pinRF,100);//analogWrite(pinRB, 0);digitalWrite(pinLF,LOW);digitalWrite(pinLB,LOW);//analogWrite(pinLF,0);//analogWrite(pinLB,0);delay(c * 100);}void turnR(int d){digitalWrite(pinRF,LOW);digitalWrite(pinRB,HIGH);analogWrite(pinRF,0);analogWrite(pinRB, 100);digitalWrite(pinLF,HIGH);digitalWrite(pinLB,LOW);analogWrite(pinLF,100);analogWrite(pinLB,0);delay(d * 100);}void turnL(int e){digitalWrite(pinRF,HIGH);digitalWrite(pinRB,LOW);analogWrite(pinRF,100);analogWrite(pinRB, 0);digitalWrite(pinLF,LOW);digitalWrite(pinLB,HIGH);analogWrite(pinLF,0);analogWrite(pinLB,100);delay(e * 100);}void stopp(int f) //停止{digitalWrite(pinRB,LOW);digitalWrite(pinRF,LOW);digitalWrite(pinLB,LOW);digitalWrite(pinLF,LOW);delay(f * 100);}void back(int g){digitalWrite(pinRF,LOW);digitalWrite(pinRB,HIGH);//analogWrite(pinRF,0);//analogWrite(pinRB, 150);digitalWrite(pinLF,LOW);digitalWrite(pinLB,HIGH);//analogWrite(pinLF,0);//analogWrite(pinLB,150);delay(g * 100);}void detection() //测量三个角度(0.90.179) {int delay_time = 250; // 舵机稳定时间ask_pin_F();if(Fspeedd < 10){stopp(1);back(2);}if(Fspeedd < 25){stopp(1);ask_pin_L();delay(delay_time);ask_pin_R();delay(delay_time);if(Lspeedd > Rspeedd){directionn = Rgo; //向右走}if(Lspeedd <= Rspeedd){directionn = Lgo; //向左走}if (Lspeedd < 10 && Rspeedd < 10){directionn = Bgo;}}else{directionn = Fgo; //向前走}}void ask_pin_F() // 量出前方距离{myservo.write(90);digitalWrite(outputPin, LOW);delayMicroseconds(2);digitalWrite(outputPin, HIGH);delayMicroseconds(10);digitalWrite(outputPin, LOW);float Fdistance = pulseIn(inputPin, HIGH);Fdistance= Fdistance/5.8/10;Serial.print("F distance:"); //输出距离单位公分Serial.println(Fdistance);Fspeedd = Fdistance;}void ask_pin_L() //测出左边距离{myservo.write(5);delay(delay_time);digitalWrite(outputPin, LOW);delayMicroseconds(2);digitalWrite(outputPin, HIGH);delayMicroseconds(10);digitalWrite(outputPin, LOW);float Ldistance = pulseIn(inputPin, HIGH);Ldistance= Ldistance/5.8/10; // 将时间转化为距离Serial.print("L distance:");Serial.println(Ldistance);Lspeedd = Ldistance;}void ask_pin_R() // 量出右边距离{myservo.write(177);delay(delay_time);digitalWrite(outputPin, LOW);delayMicroseconds(2);digitalWrite(outputPin, HIGH);delayMicroseconds(10);digitalWrite(outputPin, LOW);float Rdistance = pulseIn(inputPin, HIGH);Rdistance= Rdistance/5.8/10;Serial.print("R distance:");Serial.println(Rdistance);Rspeedd = Rdistance;}void loop(){myservo.write(90); //舵机初次位置detection(); //测量角度,判断往哪边转动if(directionn == 2) //假如directionn(方向) = 2(倒车){back(8); // 倒退turnL(2); //Serial.print(" Reverse ");}if(directionn == 6) //假如directionn(方向) = 6(右) {back(1);turnR(6); // 右Serial.print(" Right ");}if(directionn == 4) //假如directionn(方向) = 4(左) {back(1);turnL(6); // 左Serial.print(" Left ");}if(directionn == 8) //假如directionn(方向) = 8(前) {advance(1); // 正常前Serial.print(" Advance ");Serial.print(" ");}}。
智能小车循迹、避障、红外遥控C语言代码
//智能小车避障、循迹、红外遥控C语言代码//实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹,1602显示小车的工作状态,另有三个独立按键分别控制三种状态的转换//注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <>#include <>#include""#include <>#define uchar unsigned char#define uint unsigned intuchar ENCHAR_PuZh1[8]=" run ";//1602显示数组uchar ENCHAR_PuZh2[8]=" back ";uchar ENCHAR_PuZh3[8]=" stop ";uchar ENCHAR_PuZh4[8]=" left ";uchar ENCHAR_PuZh5[8]=" right ";uchar ENCHAR_PuZh6[8]=" xunji ";uchar ENCHAR_PuZh7[8]=" bizhang";uchar ENCHAR_PuZh8[8]=" yaokong";#define HW P2 //红外传感器引脚配置P2k口#define PWM P1 /* L298N管脚定义*//******************************超声波引脚控制******************************/sbit ECHO=P3^2; //超声波接收引脚定义兼红外遥控按键state_total =2 sbit TRIG=P3^3; //超声波发送引脚定义/////红外控制引脚配置sbit KEY2=P3^7; //红外接收器数据线兼循迹按键state_total= 0sbit KEY1=P3^4; //独立按键控制自动避障state_total=1uchar state_total=3,state_2=0;//总状态控制全局变量0为自动循迹模块1为自动避障模块2为红外遥控uchar state_1,DAT; //红外扫描标志位uchar time_1=0,time_2=0;//定时器1中断全局变量time_ 2控制PWM脉冲计数time_1控制转弯延时计数也做延时一次uchar time,timeH,timeL,state=0;//超声波测量缓冲变量state为超声波状态检测控制全局变量uint count=0; //1602显示计数/**************************/unsigned char IRCOM[7]; //红外接收头接收数据缓存IRCOM[2]存放的为数据unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; //红外接收缓存变量/***********/void IRdelay(char x); //x* 红外头专用delayvoid run();void back();void stop();void left_90();void left_180();void right_90();void delay(uint dat); //void init_test();void delay_100ms(uint ms) ;void display(uchar temp); //超声波显示驱动void bizhang_test();void xunji_test();void hongwai_test();void Delay10ms(void);void init_test()//定时器0 1 外部中断0 1 延时初始化{TMOD=0x11; //设置定时器0 1 工作方式1 16位初值定时器TH1=0Xfe; //装入初值定时一次为2000hzTL1=0x0c;TF0=0; //定时器0方式1计数溢出标志TF1=0; //定时器1方式1计数溢出标志ET0=1; //允许定时器0中断溢出ET1=1; //允许定时器1中断溢出EA=1; //开总中断if(state_total==1)//为超声波模块时初始化{TRIG=0; //发射引脚低电平ECHO=0; // 接收引脚低电平EX0=0; //关闭外部中断IT0=1; //由高电平变低电平,触发外部中断0}if(state_total==2) //红外遥控初始化{ IT1=1; //外部中断1为负跳变触发EX1=1; //允许外部中断1TRIG=1; // 为高电平I/O口初始化}delay(60); //等待硬件操作}void main(){ uint i;delay(50);init_test();TR1=1; //开启定时器1LCD1602_Init() ;delay(50);while(state_2==0){if(KEY1==0) //检测按键s1是否按下{Delay10ms(); //消除抖动if(KEY1==0){state_total=0; //总状态定义0为自动循迹模块1为自动避障模块2为红外遥控while((i<30)&&(KEY1==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}if(TRIG==0) //检测按键s2是否按下{Delay10ms(); //消除抖动if(TRIG==0){state_total=1; //总状态定义0为自动循迹模块1为自动避障模块2为红外遥控while((i<30)&&(TRIG==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}if(KEY2==0) //检测按键s3是否按下{Delay10ms(); //消除抖动if(KEY2==0){state_total=2; //总状态定义0为自动循迹模块1为自动避障模块2为红外遥控while((i<30)&&(KEY2==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}}init_test();delay(50); //等待硬件操作50usTR1=0; //关闭定时器1if(state_total==1){//SPEED=90; //自动循迹速度控制高电平持续次数占空比为10的低电平bizhang_test();}if(state_total==0){// SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平xunji_test();}if(state_total==2){//SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平hongwai_test();}}void init0_suspend(void) interrupt 0 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{timeH=TH0; //记录高电平次数timeL=TL0; //state=1; //标志状态为1,表示已接收到返回信号EX0=0; //关闭外部中断0}void time0_suspend0(void) interrupt 1 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{if(state_total==1) // 自动避障初值装入{ TH0=0X00; //装入初值TL0=0x00;}if(state_total==0) //自动循迹初值装入{ TH0=0Xec; //装入初值定时一次200hzTL0=0x78;time_1++; //控制转弯延时计数}}void IR_IN(void) interrupt 2{unsigned char j,k,N=0;EX1 = 0;IRdelay(5);if (TRIG==1){ EX1 =1;return;}//确认IR信号出现while (!TRIG) //等IR变为高电平,跳过9ms的前导低电平信号。
基于STC89C52单片机的超声波避障小车设计
• 154•本文完成了基于单片机STC89C52的超声波避障小车的设计,程序使用KEIL 开发工具编写,硬件部分的核心元件有超声波传感器和电机驱动模块。
当小车向前行驶时,超声波传感器发送脉冲检测小车与障碍物间的距离。
当单片机侦测到前方障碍物进入到危险距离时,即低于设定的安全距离,报警装置发出报警信号,同时根据预先设置的规则及障碍物具体位置信息输出PWM 波控制电机转动、调速,控制小车的转弯、后退,完成自动避障。
随着社会的不断发展,科技的进步和人力成本的增加,创新型、科技型甚至传统型的企业都开始把目光放在智能小车、智能机器人等一切智能装备的发展,京东研发了智慧物流基地,智能机器人分拣快递,智能小车运送快递到指定位置;苏宁研发无人重卡,用以支撑物流配送;亚马逊研发智能仓储;阿里建立智慧一号仓库等,智能小车与智能机器人将成为自动化物流最重要的一员,将完成很多工作。
企业对自动化技术的要求也越来越高,智能避障是智能小车自主工作的第一步,因此,研究智能小车避障技术对于完善智能小车的功能是至关重要的。
自动避障小车其技术内容涵盖了计算机、机电、自动化控制和传感器技术等多个学科的知识领域,设计自动避障小车对于自动化专业本科毕业生来说具有一定的实践价值,有利于学生把学到的知识运用到实践中去。
本设计结合前人的研究成果,利用单片机技术,设计智能避障小车模型,最终完成小车的自动避障。
1 避障小车总体设计本设计小车的核心装置是STC89C52单片机,小车的行驶情况由单片机控制输出信号,经过驱动模块输出PWM 波控制电机转动、调速。
超声波智能避障小车设计的功能核心在于智能小车避障功能的实现,设计的关键点是要解决单片机与超声波模块的通信问题,超声波模块主要负责测量周边的环境数据,单片机则是负责将超声波模块反馈的信息进行处理判断,通过电机驱动模块控制小车的转弯、后退等避障功能的完成。
图1 避障小车系统设计框图图1为避障小车系统设计框图,本系统主要由STC89C52单片机、超声波测距模块、数码管驱动模块、按键模块、电源模块、L298N 电机驱动模块、数码管显示模块和声光报警模块构成。
HC-SR04超声波+小舵机小车避障的51单片机程序
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit trig=P3^3;//触发控制信号输入sbit echo=P3^2;//回响信号输出sbit pwm=P3^4;//输出PWM信号sbit P2_0=P1^0;sbit P2_1=P1^1;sbit P2_2=P1^2;sbit P2_3=P1^3;uchar count,jd;uint time=0,timer=0;bit flag =0;unsigned long s=0,zs=0,ys=0;/********************************************************/ void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}/********************************************************/ void tingzhi()//停止{ P2_0=0; P2_2=0;P2_1=0; P2_3=0;}void qianjin()//前进{ P2_0=0; P2_2=0;P2_1=1; P2_3=1;}void houtui()//后退{ P2_0=1;P2_2=1;P2_1=0;P2_3=0;delay(100);tingzhi();}void zuozhuan()//左转{ P2_0=1;P2_2=0;P2_1=1;P2_3=1;delay(100);tingzhi();}void youzhuan()//右转{ P2_0=0;P2_2=1;P2_1=1;P2_3=1;delay(100);tingzhi();}/********************************************************/void ceju(void){ while(!echo);//当echo为零时等待TR0=1;//开启计数while(echo);//当echo为1计数并等待TR0=0;//关闭计数time=TH0*256+TL0;TH0=0;TL0=0;s=(time*1.7)/100; //算出来是CM}/********************************************************/void qingling(){ timer=0;TH1=65036/256;TL1=65036%256;count=0;}/********************************************************/void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{ flag=1;} //中断溢出标志/********************************************************/void zd1() interrupt 3{ TH1=65036/256;TL1=65036%256;if(count<jd) pwm=1;else pwm=0;count++;count=count%40;timer++;if(timer>=800){timer=0;trig=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();trig=0;}}/*********************************************************/void main( void ){jd=3; count=0;TMOD=0x11;//设T0,T1为方式1,GATE=0;TH0=0;TL0=0;TH1=65036/256;//计数器1定时0.5msTL1=65036%256;IE=0x8a;//总中断开,允许计数器0,1中断开while(1){ TR1=1;ceju();if(s<=10){ tingzhi(); //停止jd=1;count=0;delay(20);TR1=0; qingling();TR1=1;ceju();ys=s;jd=5;count=0;delay(20);TR1=0;qingling();TR1=1;ceju();zs=s;jd=3;count=0;delay(20);TR1=0;qingling();if((zs>=ys)&&(zs>10)) {zuozhuan();}//左转else if((ys>=zs)&&(ys>10)) {youzhuan();}//右转else {houtui();}//后退}else if((s>10)||(flag==1)){qianjin();}//前进}}。
超声波避障小车程序设计
超声波避障小车程序设计/**************************************** ***************************************** **************************///5路超声波避障实验:51单片机+ HC-SR04超声波///**************************************** ***************************************** **************************/#include <AT89x52.H> //器件配置文件#include <intrins.h> #defineRX1 P3_6//小车左侧超声波HC-SR04接收端#define TX1 P1_7 //发送端#define RX2 P3_3//左前方超声波#define TX2 P0_2#define RX3 P2_4 //正前方超声波#define TX3 P2_5#define RX4 P3_5 //右前void Count2() //计算函数{ while(!RX2); //当RX2为零时等待TR0=1; //开启计数while(RX2); //当RX2为1计数并等待TR0=0; //关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S2=(time*1.7)/100; //算出来是CM }void Count3() //计算函数{ while(!RX3); //当RX3为零时等待TR0=1; //开启计数while(RX3); //当RX3为1计数并等待TR0=0; //关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S3=(time*1.7)/100; //算出来是CM }void Count4() //计算函数{ while(!RX4); //当RX4为零时等待TR0=1; //开启计数while(RX4); //当RX4为1计数并等待TR0=0; //关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S4=(time*1.7)/100; //算出来是CM }void Count5() //计算函数{while(!RX5); //当RX5为零时等待TR0=1; //开启计数while(RX5); //当RX5为1计数并等待TR0=0; //关闭计数time=TH0*256+TL0;TH0=0;TL0=0;S5=(time*1.7)/100; //算出来是CMvoid leftrun(void) {push_val_left=20;push_val_right=20;Left_moto_back //左电机往后走Right_moto_go //右电机往前走}/************************************** **********************************/ //右转void rightrun(void){push_val_left=20;push_val_right=20;Left_moto_go //左电机往前走Right_moto_back //右电机往后走}/************************************** **********************************/ //停止void stoprun(void){Left_moto_Stop //左电机停Right_moto_Stop //右电机停}/************************************** **********************************/ /*PWM 调制电机转速*/ /**** ***************************************** ***************************//*左电机调速*/ /*调节push_val_left的值改变电机转速,占空比*/void pwm_out_left_moto(void){if(Left_moto_stop){ if(pwm_va l_left<=push_val_left){ Left_mo to_pwm=1; }else {Left_moto_pwm=0;}if(pwm_val_left>=20)pwm_val_left=0;}else {Left_moto_pwm =0; } } /******************************************************************/ /*右电机调速*/void pwm_out_right_moto(void) { if(Right_moto_stop){ if(pwm_val_right<=pu sh_val_right){ Right_moto_pwm =1;}else {Right_moto_pwm=0; } if(pwm_val_right>=20)pwm_val_right=0; }else{ Right_moto_p wm=0; } }/************************************** ******************/void timer0() interrupt 1 / /T0中断{ }/************************************** *************/ ///*TIMER1中断服务子函数产生PWM信号*/void timer1()interrupt 3{ TH1=(65536-1000)/256; //1ms定时TL1=(65536-1000)%256;timer++;pwm_val_left++;pwm_val_right++;pwm_out_left_moto();pwm_out_right_moto(); }/************************************** ******************* ****************** ****************************************/void main(void){TMOD=0x11; //设T0为方式1,GATE=1;TH0=0;TL0=0;TH1=(65536-1000)/256; //1ms定时TL1=(65536-1000)%256;ET0=1; //允许T0中断ET1=1; //允许T1中断TR1=1; //开启定时器EA=1; //开启总中断while(1) {TX1=1; //开启超声波1探测delay_1ms(1);TX1=0;Count1(); //测距TX2=1;delay_1ms(1);TX2=0;Count2();TX3=1;delay_1ms(1);TX3=0;Count3();TX4=1;delay_1ms(1);TX4=0;Count4();TX5=1;delay_1ms(1);TX5=0;Count5();if(S3<20 && S1<20 && S5<20) //进入狭窄通道{ backrun(); //倒车delay_1ms(100);}else if(S3<20 && S1<S5 ) //车子与障碍物90度垂直,左边距离小右转{ rightrun(); }else if(S3<20 && S5<S1 ) //车子与障碍物90度垂直,右边距离小左转{ leftrun(); }else if(S2<20){ rightrun(); //车与障碍物呈45度角时,车的左边比车的右边距离小,右转}else if(S4<20){ leftrun(); //车与障碍物呈45度角时,车的右边比车的左边距离小,左转}else { run();} } }。
小车避障程序
小车避障行进//===================================================================== // 文件名称:main.c// 功能描述:小车避障行进// 维护记录:2006-12-16 v1.0//=====================================================================#define P_IOA_Data (volatile unsigned int *)0x7000#define P_IOA_Buffer (volatile unsigned int *)0x7001#define P_IOA_Dir (volatile unsigned int *)0x7002#define P_IOA_Attrib (volatile unsigned int *)0x7003#define P_IOB_Data (volatile unsigned int *)0x7005#define P_IOB_Dir (volatile unsigned int *)0x7007#define P_IOB_Attrib (volatile unsigned int *)0x7008#define P_Watchdog_Clear (volatile unsigned int *)0x7012void Delay45(void); //延时函数45void Delay90(void); //延时函数90//===================================================================== // 语法格式:int main(void)// 实现功能:小车避障行进// 参数:无// 返回值:无//===================================================================== int main(void){*P_IOA_Dir = 0x0000; //初始化IOA口为带上拉电阻输入口*P_IOA_Attrib = 0x0000;*P_IOA_Data = 0x0003;*P_IOB_Dir = 0xffff; //初始化IOB口为同相输出口*P_IOB_Attrib = 0xffff;*P_IOB_Data = 0x0000; //初始化IOB口输出为低电平while(1){*P_IOB_Data= 0x0005; //左右轮正转,小车前进if(*P_IOA_Data = 0x0001) //判断左边是否有障碍{*P_IOB_Data= 0x0002; Delay45();// 右轮反转,小车右转45度*P_IOB_Data= 0x0005; Delay90(); //左右轮正转,小车前进*P_IOB_Data= 0x0008; Delay90(); //左轮反转,小车左转90度*P_IOB_Data= 0x0005; Delay90(); //左右轮正转,小车前进*P_IOB_Data= 0x0002; Delay45();// 右轮反转,小车右转45度continue;}if(*P_IOA_Data = 0x0002) //判断右边是否有障碍{*P_IOB_Data= 0x0008; Delay45(); //左轮反转,小车左转45度*P_IOB_Data= 0x0005; Delay90(); //左右轮正转,小车前进*P_IOB_Data= 0x0002; Delay90();// 右轮反转,小车右转90度*P_IOB_Data= 0x0005; Delay90(); //左右轮正转,小车前进*P_IOB_Data= 0x0008; Delay45(); //左轮反转,小车左转45度continue;}if(*P_IOA_Data = 0x0000) //判断前方是否有障碍{*P_IOB_Data= 0x0002; Delay90();// 右轮反转,小车右转90度*P_IOB_Data= 0x0008; Delay90(); //左轮反转,小车左转90度continue;}*P_Watchdog_Clear = 0x0001; //清看门狗}}//========================================================// 语法格式:void Delay45(void)// 实现功能:延时(45度)// 参数:无// 返回值:无//======================================================== void Delay45(void){unsigned int uiCount;for(uiCount = 0;uiCount <= 3000;uiCount++){*P_Watchdog_Clear = 0x0001; //清看门狗}}//========================================================// 语法格式:void Delay90(void)// 实现功能:延时(90度)// 参数:无// 返回值:无//======================================================== void Delay90(void){unsigned int uiCount;for(uiCount = 0;uiCount <= 6000;uiCount++){*P_Watchdog_Clear = 0x0001; //清看门狗}}。
基于89c51单片机的智能超声波避障小车
基于89c51单⽚机的智能超声波避障⼩车接⼝实验课程结课论⽂学号、专业:姓名:论⽂题⽬:指导教师:所属学院:成绩评定教师签名桂林电⼦科技⼤学研究⽣院2014年 7 ⽉ 1 ⽇引⾔现今发达的交通在给⼈们带来便捷的同时也带来了许多的交通事故。
发⽣交通事故的因素有很多。
当然,如果我们的汽车能够更加智能,就是说事先能预测并显⽰前⾯障碍物离车的距离,当障碍物距离很近时汽车会⾃动采取⼀些措施避开障碍物,这样就能够在很⼤程度上避免这些事故的发⽣。
第⼀章总体⽅案概述本⼩车使⽤⼀⽚A T89c52 单⽚机作为主控芯⽚;⽤HC-SR04超声波模块来探测前⽅障碍物的距离,⽤单⽚机P3.1⼝送出⼤于10us 的⾼电平,P3.0⽤来检测回波,⽤单⽚机定时中断计算超声波来回经历的时间,这样可以通过距离计算公式求得前⽅障碍物的距离;LCD1602液晶屏⽤来显⽰距离;L298驱动芯⽚⽤来驱动两个直流电机,在单⽚机P1⼝控制L298的IN1,IN2,IN3,IN4的⾼低电平来控制两个直流电机的正反转,并且在P1⼝输出PWM 波,控制车⼦的⾏驶速度;选⽤ISD1760语⾳芯⽚实现语⾳播报功能,主要采⽤独⽴按键⽅式,进⾏语⾳的录放,⽤单⽚机的P2.4⼝控制语⾳的播放。
本系统设计的简易智能⼩车分为⼏个模块:系统控制模块,测距模块,驱动模块,显⽰模块,语⾳播报模块以及电源模块。
以上相关模块的具体描述如下:系统控制模块:单⽚机STC89C52RC; 测距模块:HC-SR04超声波测距;驱动模块:芯⽚L298及其相关逻辑电路;显⽰模块:LCD1602及其外围电路语⾳播报模块:芯⽚ISD1760及其录放⾳电路;电源模块:4节1.5伏的锂电池它们之间的相互关系如下图1所⽰。
单⽚机控制模块液晶显⽰模块直流电机驱动模块超声波测距模块语⾳播报模块图1 智能⼩车简要原理框架图第⼆章硬件电路设计2.1 单⽚机控制模块此模块控制着超声波测距模块、液晶显⽰模块、直流电机驱动模块、语⾳播报模块的⼯作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RCAP2L=0x33; /*恢复定时器初始值*/
++click;
if (click>=100) click=0;
if (click<=ZK1)
PWM1=0;
else
PWM1=1;
if (click<=ZK2)
PWM2=0;
else
PWM2=1;
}
void main( void )
{
TMOD=0x19; //设T0为方式1,GATE=1;
flag=1;
}
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=0x0f8;
TL1=0x30;
Display();
timer++;
if(timer>=400)
{
timer=0;
TX=1; //800MS 启动一次模块
unsigned char const discode[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90};
unsigned char const positon[3]={ 0x7f,0xbf,0xdf};
unsigned char disbuff[4] ={ 0,0,0,0,};
if (S>40) //控制加速
{
P1=0xaf;
ZK1=ZK1-10;
ZK2=ZK2-10;
}
else
if((S<30)&(K1==0)&(K2==0)) //控制转向
{
ZK1=ZK1+10;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P1=0X8F;
delay();
}
else
if((S<30)&(K1==1)&(K2==1))
{
ZK1=ZK1+10;
ZK2=ZK2+10;
P2=positon[posit];
if(++p}
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
disbuff[0]=S%1000/100;
P1=0X4F;
delay();
}
else
if((S<30)&(K1==0)&(K2==1))
{
ZK1=ZK1+10;
ZK2=ZK2+10;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
void Timer2(void) interrupt 5
{
TF2=0; // T2定时器发生溢出中断时,需要用户自己清除溢出标记
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
void Timer2Interrupt()
{
RCAP2H=0x0fe;
RCAP2L=0x33;
ET2=1; // 允许T2定时器中断
void delay(void) //误差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
}
void Display(void)
{
{P0=discode[disbuff[posit]];}
TH0=0;
TL0=0;
TH1=0x0f8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
Timer2Interrupt();
EA=1; //开启总中断
ZK1=20;
ZK2=20;
while(1)
{
while(INT0==0); //当RX为零时等待
TR0=1;
while(INT0==1); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
static char click=0;
unsigned char ZK1,ZK2;
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
bit flag =0;
#include <reg52.H> //器件配置文件
#include <intrins.h>
sbit K1=P1^0;
sbit K2=P1^1;
sbit TX=P3^0; //触发信号引脚
sbit PWM1=P3^6; //pwm信号输出
sbit PWM2=P3^7;
ZK2=ZK2+10;
P1=0X8F;
delay();
}
else
if((S<30)&(K1==1)&(K2==0))
{
ZK1=ZK1+10;
ZK2=ZK2+10;
P1=0X5F;
delay();
}
if (ZK1>99) ZK1=1;
if (ZK1<1) ZK1=99;
if (ZK2>99) ZK2=1;
if (ZK2<1) ZK2=99;
}
}
EA=1; // 打开总中断
TR2=1; // 启动T2定时器
}
void zd0() interrupt 1
{