2021-09-03

51单片机避障小车

给大家分享一下我在大一是时制作的51单片机避障小车
**小提示:**避障模块也可以当做寻迹模块使用
核心原理:
利用红外对管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障的功能。其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制。
运动机理:
(1)无障碍物当前方都没有障碍物,左右两个轮子都向前正转,则机器人向“前方”直线前进。(2)左前方有障碍物当左前方有障碍物,在左边触须碰到障碍物时,控制右边的轮子反转,则机器人向“左后方”倒退并转弯,即方向转向了障碍物的右边,从而避开了左边的障碍物。向后倒退转弯会持续一会,在完成转弯之后,左边触须不再碰到障碍物,则两个轮子都正转,机器人继续向新的没有障碍物的“前方”直线前进。(3)右前方有障碍物当右前方有障碍物,在右边触须碰到障碍物时,控制左边的轮子反转,则机器人向“右后方”倒退并转弯,即方向转向了障碍物的左边,从而避开了右边的障碍物。向后倒退转弯会持续一会,在完成转弯之后,右边触须不再碰到障碍物,则两个轮子都正转,机器人继续向新的没有障碍物的“前方”直线前进。
所需材料:单片机最小系统
单片机最小系统 杜邦线 万向轮,小车底板, TT电机,
在这里插入图片描述避障模块
在这里插入图片描述
L298n
在这里插入图片描述
接下来只需要将小车组装好,用K4或者K5将程序烧入芯片即可。

//注意程序只做参考之用,要达到最理想的效果,还需要同学们细心调试。		      //包含51单片机头文件,内部有各种寄存器定义#include<HJ-4WD_PWM.H>		  //包含HL-1蓝牙智能小车驱动IO口定义等函数#include <REGX52.H> sbit BUZZ=P1^5;    //主函数	void main(void){		unsigned int n=0;//	unsigned char i;//    P1=0X00; //关电车电机	本实验学习的按键启动知识	    //B:		for(i=0;i<50;i++) //判断K4是否按下//		{//		   delay(1);	//1ms内判断50次,如果其中有一次被判断到K4没按下,便重新检测//		   if(P3^3!=0)//当K4按下时,启动小车前进,如有不明,请看慧净51单片机视频教程//		   goto B; //跳转到标号B,重新检测  //		} 本实验学习的知识蜂鸣器,注意要在HJ-4WD头文件里定义IO口	     BUZZ=~BUZZ;//	     delay(500);//	     BUZZ=0;//响50ms后关闭蜂鸣器		 	TMOD=0X01;        	TH0= 0XFc;		  //1ms定时         	TL0= 0X18;           	TR0= 1;        	ET0= 1;	        EA = 1;		     //开总中断	while(1)	//无限循环	{ 	 			               if(Left_1_led==1&&Right_1_led==1)			  run();	 //调用前进函数			  else			 {			  				     if(Left_1_led==1&&Right_1_led==0)	    //右边检测到红外信号			 	 {				 	  leftrun();					 	  //调用小车左转函数			     }			   				  	  if(Right_1_led==1&&Left_1_led==0)		//左边检测到红外信号				  {	  				      rightrun();						 //调用小车右转函数				  }				 B: 	if(Right_1_led==0&&Left_1_led==0)		//两边传感器同时检测到红外				  {	  							 backrun();		//调用电机后退函数						   	 delay(80);//							 n++;//							 if(n%2==0)//							 	{//									leftrun();//								}//							 else  if((Right_1_led==0&&Left_1_led==0)&&(n%2==1))//							 	{//									rightrun();//								}//							 else//							 	{//									rightrun();//								}							 goto B;		//后退50毫秒							//rightrun();		//调用电机右转函数							//delay(30);  				  }			}	 	 }}
#ifndef _LED_H_#define _LED_H_#include <REGX52.H>    //定义小车驱动模块输入IO口 sbit ENA = P2^2;   //右点机使能sbit IN1 = P2^3;   //为0右轮反转sbit IN2 = P2^4;   //为0右轮正转sbit IN3 = P2^5;   //为0左轮正转sbit IN4 = P2^6;   //为0左轮反转sbit ENB = P2^7;   //左电机使能		/***蜂鸣器接线定义*****/    #define Left_1_led        P3_5	 //左传感器  	    #define Right_1_led       P3_4	 //右传感器       	 	#define Left_moto_pwm	  P2_2	 //PWM信号端		#define Right_moto_pwm	  P2_7	 //PWM信号端		#define Left_moto_go      {P2_3=1,P2_4=0;}  //you电机向前走	#define Left_moto_back    {P2_3=0,P2_4=1;} 	//you边电机向后转	#define Left_moto_Stop    {P2_7=0;}         //you边电机停转                     	#define Right_moto_go     {P2_5=1,P2_6=0;}	//zuo边电机向前走	#define Right_moto_back   {P2_5=0,P2_6=1;}	//zuo边电机向后走	#define Right_moto_Stop   {P2_2=0;}      	//zuo边电机停转  	unsigned char pwm_val_left  =0;//变量定义	unsigned char push_val_left =0;// 左电机占空比N/20	unsigned char pwm_val_right =0;	unsigned char push_val_right=0;// 右电机占空比N/20	bit Right_moto_stop=1;	bit Left_moto_stop =1;	unsigned  int  time=0;   /************************************************************************/	//延时函数	   void delay(unsigned int k){         unsigned int x,y;	 for(x=0;x<k;x++) 	   for(y=0;y<2000;y++);}/************************************************************************///前速前进     void  run(void){     push_val_left=4;	 //速度调节变量 0-20。。。0最小,20最大	 push_val_right=4;	 Left_moto_go ;   //左电机往前走	 Right_moto_go ;  //右电机往前走}//后退函数 如果看不明白,请看慧净电子51智能小车视频教程     void  backrun(void){     push_val_left=10;	 //速度调节变量 0-20。。。0最小,20最大	 push_val_right=3;	 Left_moto_back;   //左电机往前走	 Right_moto_back;  //右电机往前走}//左转     void  leftrun(void){	     // push_val_left=6;	 push_val_right=12;	 Right_moto_go ;  //右电机往前走     Left_moto_Stop ;  //左电机停止}//右转     void  rightrun(void){ 	 push_val_left=12;	// push_val_right=6;     Left_moto_go  ;   //左电机往前走	 Right_moto_Stop   ;  //右电机	}/************************************************************************//*                    PWM调制电机转速                                   *//************************************************************************//*                    左电机调速                                        *//*调节push_val_left的值改变电机转速,占空比            */		void pwm_out_left_moto(void){     if(Left_moto_stop)   {    if(pwm_val_left<=push_val_left)	       {		     Left_moto_pwm=1; //		     Left_moto_pwm1=1; 		   }	else 	       {	         Left_moto_pwm=0;//		     Left_moto_pwm1=0; 		   }	if(pwm_val_left>=20)	       pwm_val_left=0;   }   else              {           Left_moto_pwm=0;//           Left_moto_pwm1=0; 		  }}/******************************************************************//*                    右电机调速                                  */     void pwm_out_right_moto(void){   if(Right_moto_stop)   {     if(pwm_val_right<=push_val_right)	      {	       Right_moto_pwm=1; //		   Right_moto_pwm1=1; 		   }	else 	      {		   Right_moto_pwm=0;//		   Right_moto_pwm1=0; 		  }	if(pwm_val_right>=20)	       pwm_val_right=0;   }   else              {           Right_moto_pwm=0;//           Right_moto_pwm1=0; 	      }}       /****************************************************TIMER0中断服务子函数产生PWM信号*/ 	void timer0()interrupt 1   using 2{     TH0=0XFc;	  //1Ms定时	 TL0=0X18;	 time++;	 pwm_val_left++;	 pwm_val_right++;	 pwm_out_left_moto();	 pwm_out_right_moto(); }	/*********************************************************************/	#endif

在制作小车的过程中有什么问题可以联系我一起交流讨论共同进步

使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
这里是使用 Python 的 PyMySQL 完成上述任务的代码: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='test') # 创建游标 cur = conn.cursor() # 创建 users 表 cur.execute(''' CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(20), age INT ) ''') # 创建 orders 表 cur.execute(''' CREATE TABLE orders ( id INT PRIMARY KEY, order_date DATE, amount INT, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ) ''') # 插入数据 users_data = [ (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28) ] orders_data = [ (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4) ] for user in users_data: cur.execute('INSERT INTO users VALUES (%s, %s, %s)', user) for order in orders_data: cur.execute('INSERT INTO orders VALUES (%s, %s, %s, %s)', order) # 提交事务 conn.commit() # 查询语句 # 1. 查询订单总金额 cur.execute('SELECT SUM(amount) FROM orders') print(cur.fetchone()[0]) # 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 cur.execute('SELECT ROUND(AVG(age), 2) FROM users') print(cur.fetchone()[0]) # 3. 查询订单总数最多的用户的姓名和订单总数。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_orders DESC LIMIT 1 ''') print(cur.fetchone()) # 4. 查询所有不重复的年龄。 cur.execute('SELECT DISTINCT age FROM users') print([row[0] for row in cur.fetchall()]) # 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 cur.execute('SELECT SUM(amount) FROM orders WHERE order_date BETWEEN "2021-09-01" AND "2021-09-04"') print(cur.fetchone()[0]) # 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id WHERE age <= 25 GROUP BY users.id ORDER BY total_orders DESC ''') print(cur.fetchall()) # 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 3 ''') print(cur.fetchall()) # 8. 查询订单总金额最大的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 1 ''') print(cur.fetchone()) # 9. 查询订单总金额最小的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount ASC LIMIT 1 ''') print(cur.fetchone()) # 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 cur.execute('SELECT * FROM users WHERE name LIKE "%李%" ORDER BY name ASC') print(cur.fetchall()) # 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 cur.execute('SELECT * FROM users WHERE age > 20 ORDER BY age DESC LIMIT 5') print(cur.fetchall()) # 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC ''') print(cur.fetchall()) # 关闭游标和连接 cur.close() conn.close() ``` 注意:在运行代码之前,需要先安装 PyMySQL 模块,可以使用以下命令进行安装: ``` pip install pymysql ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值