找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于90c52单片机的电磁小车程序设计

[复制链接]
跳转到指定楼层
楼主
ID:263925 发表于 2018-12-20 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该设计是基于90c52单片机的电磁寻迹小车。搭好硬件后(包括两个直流电机,一个万向轮,传感器(电感)及其支架 )。将小车放在通电的导线上传感器与通电导线电磁感应产生电动势,经过放大电路将微弱的信号放大后。再由单片机内部的ad读取数据。分析数据在决定小车的方向.
具体的实现过程如下:
            
1.假设在小车的左右两端各有1个电感并且经过放大电路后ad采集到的值分别为a和b。
2.电机的运转快慢由定时器产生的pwm信号来控制,假设左右两个电机的初始pwm为20,最高为100。
3.我们知道电势的高低和传感器离通电导线的距离有关,距离越远得到的值越小,反之越高。最理想的状态是小车一直在导线的中间走。也就是两个电感的值相同。此时可以通过所得到的电感值算出小车的一个相对的位置 p=a-b/c 这只是一个最基本的式子具体还要根据自己实际所得的ad值来做调整。根据所得到的这个相对位置的值再来调整左边或者右边电机的pwm值。如果p>大于0,说明左边的电感值大于右边也就是说左边的电感距离通电导线近,就应该左转,反之右转。
4.转弯的方法第一可以保持一边电机的pwm不变降低另一边的pwm的值,第二可以保持一边电机的pwm不变提高另一边的pwm的值
本设计已经过测试确实可行由于时间仓促还有很多地方需要完善,见谅!!

单片机源程序如下:

  1. #include "max7219.h"

  2. unsigned char  dis_code[18]={0x7E,0x30,0x6D,0x79,        // 0, 1, 2, 3
  3.                                       0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x01,0x00};// 4, 5, 6, 7, 8, 9,a,b,c,d,e,f,-, ,


  4. void Write_Max7219_byte(unsigned char temp)
  5. {
  6. unsigned char i;
  7. for (i=0;i<8;i++)   
  8.   {
  9.     MAX7219_CLK0; // CLK=0;
  10.           if((temp>>7)&0x1)
  11.           {
  12.                 MAX7219_DIN1;
  13.           }
  14.           else
  15.           {
  16.                 MAX7219_DIN0;
  17.           }
  18.      //DIN=((temp>>7)&0x1);     
  19.      temp<<=1;
  20.      MAX7219_CLK1;//CLK=1;
  21.    }
  22. }

  23. void Write_Max7219(unsigned char address,unsigned char dat)
  24. {
  25.   MAX7219_CS0;//MAX_LOAD=0;
  26.   Write_Max7219_byte(address);
  27.   Write_Max7219_byte(dat);
  28.   MAX7219_CS1;//MAX_LOAD=1;               
  29. }

  30. void clear(void)
  31. {
  32.    Write_Max7219(1,0x00);
  33.    Write_Max7219(2,0x00);
  34.    Write_Max7219(3,0x00);
  35.    Write_Max7219(4,0x00);
  36.    Write_Max7219(5,0x00);
  37.    Write_Max7219(6,0x00);
  38.    Write_Max7219(7,0x00);
  39.    Write_Max7219(8,0x00);
  40. }

  41. //void Max7219_port(void)
  42. //{
  43. //
  44. //        GPIO_InitTypeDef GPIO_InitStructure;
  45. //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  46. //        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2 ;            
  47. //        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;  
  48. //        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;   

  49. //        GPIO_Init(GPIOB,&GPIO_InitStructure);

  50. ////        RCC->APB2ENR|=1<<2;   
  51. ////                    
  52. ////        GPIOA->CRL&=0X0F00FFFF;
  53. ////        GPIOA->CRL|=0X30330000;//PA2 推挽输出            
  54. ////    GPIOA->ODR|=1<<4;      //PA2 输出高
  55. ////        GPIOA->ODR|=1<<5;      //PA2 输出高
  56. ////        GPIOA->ODR|=1<<7;      //PA2 输出高
  57. ////                                                                                       
  58. //}
  59. void Init_Max7219(void)     
  60. {
  61.          Write_Max7219(SHUT_DOWN, 0x00);   //Normal Operation XXXXXXX1 Shutdown Mode   XXXXXXXX0
  62.          Write_Max7219(DECODE_MODE, 0x00);   //Decode Mode Select D7~D0 1 B decode 0 No decode
  63.          Write_Max7219(SCAN_LIMIT, 0x07);   //SCAN LIMIT 0~7 0xX0~0xX7
  64.          Write_Max7219(INTENSITY, 0x0A);   //Set Intensity   0xX0~0xXf
  65.          Write_Max7219(DISPLAY_TEST, 0x00);   //Normal Operation XXXXXXX0 Display Test Mode
  66.          Write_Max7219(SHUT_DOWN, 0x01);   //Normal Operation XXXXXXX1 Shutdown Mode   XXXXXXXX0
  67.          clear();
  68. }

  69. void TestLED(void)
  70. {
  71.    Write_Max7219(1,dis_code[0]);          
  72.    Write_Max7219(2,dis_code[1]);          
  73.    Write_Max7219(3,dis_code[2]);
  74.    Write_Max7219(4,dis_code[3]);  
  75.    Write_Max7219(5,dis_code[4]);
  76.    Write_Max7219(6,dis_code[5]);
  77.    Write_Max7219(7,dis_code[6]);
  78.    Write_Max7219(8,dis_code[7]);             
  79. }

  80. void LED(unsigned char position ,unsigned char Value)
  81. {
  82.        
  83.            Write_Max7219(position,dis_code[Value]);
  84. }

  85. void display(int num,int num1 )
  86. {
  87.   char temp;
  88.         temp = num/1000;
  89.         LED(8 ,temp);
  90.         temp = num%1000/100;
  91.         LED(7 ,temp);
  92.         temp = num%100/10;
  93.         LED(6 ,temp);
  94.         temp = num%10;
  95.         LED(5 ,temp);
  96.         temp = num1/1000;
  97.         LED(4 ,temp);
  98.         temp = num1%1000/100;
  99.         LED(3 ,temp);
  100.         temp = num1%100/10;
  101.         LED(2 ,temp);
  102.         temp = num1%10;
  103.         LED(1 ,temp);
  104. }
复制代码

所有资料51hei提供下载:
基于90c52单片机的电磁小车.rar (127.24 KB, 下载次数: 14)




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

使用道具 举报

沙发
ID:1 发表于 2018-12-21 01:24 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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