找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4612|回复: 0
收起左侧

mega16智能循迹小车制作资料 含PCB avr源码 成品图片

[复制链接]
ID:140725 发表于 2017-3-5 23:36 | 显示全部楼层 |阅读模式

给51黑电子论坛的朋友们分享一个用mega16单片机做的智能循迹小车制作资料,下面是做成后的图片,经过测试一切ok。
100_2879.JPG DSCN7186.JPG
这个循迹小车各个电路模块:
IMG_7345.jpg

mega16单片机智能循迹小车的pcb文件
0.png


0.png
mega16单片机智能循迹小车制作资料下载:
智能循迹小车全部资料.rar (2.23 MB, 下载次数: 48)


下面是部分源码预览:

  1. /******************************************************************************
  2. 名称 :寻迹控制
  3. cpu  : mega16
  4. 晶振 :内部8M
  5. 作者 :漂洋过海
  6. ******************************************************************************/

  7. #include <iom16v.h>
  8. #include <macros.h>
  9. #define uchar unsigned char
  10. #define uint  unsigned int

  11. /******************************************************************************/
  12. /********************************宏定义***************************************/
  13. /******************************************************************************/
  14. #define H595DDR_OUT    DDRC |=BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6)
  15. #define H595CTL       PORTC    //高低高平
  16. #define H595_SER_H    H595CTL |= BIT(PC6) //数据              
  17. #define H595_SER_L    H595CTL &= ~BIT(PC6)                                          
  18. #define H595_RCK_H    H595CTL |= BIT(PC5) //副寄存器时钟                        
  19. #define H595_RCK_L    H595CTL &= ~BIT(PC5)
  20. #define H595_SCK_H    H595CTL |= BIT(PC4) //主时钟                        
  21. #define H595_SCK_L    H595CTL &= ~BIT(PC4)

  22. #define H595DDR_OUT1    DDRD |=BIT(0)|BIT(1)|BIT(2)
  23. #define H595CTL1       PORTD    //高低高平
  24. #define H595_SER1_H    H595CTL1 |= BIT(PD0) //数据              
  25. #define H595_SER1_L    H595CTL1 &= ~BIT(PD0)                                          
  26. #define H595_RCK1_H    H595CTL1 |= BIT(PD1) //副寄存器时钟                        
  27. #define H595_RCK1_L    H595CTL1 &= ~BIT(PD1)
  28. #define H595_SCK1_H    H595CTL1 |= BIT(PD2) //主时钟                        
  29. #define H595_SCK1_L    H595CTL1 &= ~BIT(PD2)


  30. #define SEG_1_H       H595CTL |= BIT(PC0)//数码管四个位选端
  31. #define SEG_1_L       H595CTL &= ~BIT(PC0)
  32. #define SEG_2_H       H595CTL |= BIT(PC1)
  33. #define SEG_2_L       H595CTL &= ~BIT(PC1)
  34. #define SEG_3_H       H595CTL |= BIT(PC2)
  35. #define SEG_3_L       H595CTL &= ~BIT(PC2)
  36. #define SEG_4_H       H595CTL |= BIT(PC3)
  37. #define SEG_4_L       H595CTL &= ~BIT(PC3)

  38. #define BACK1_ON           PORTB |= BIT(PD3)     //前后//转向档瓶刂?               
  39. #define BACK1_OFF          PORTB &= ~BIT(PD3)
  40. #define BACK2_ON           PORTB |= BIT(PD4)                          
  41. #define BACK2_OFF          PORTB &= ~BIT(PD4)
  42. /******************************************************************************/
  43. /**********************************end*****************************************/
  44. /******************************************************************************/


  45. uint count,ppp,count1,voltage;
  46. uchar angle_flag1,angle_flag2=0;
  47. uchar anglel,angleh;
  48. uint i=0;
  49. uchar sudu=0x40;
  50. uchar AD_num1,AD_num=0;
  51. static uchar black_flag;
  52. static uchar online;
  53. uint AD_get[8]={0,0,0,0,0,0,0,0};
  54. uint AD_min[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  55. uint AD_max[8]={0,0,0,0,0,0,0,0};
  56. uint AD_read[8]={0,0,0,0,0,0,0,0};
  57. static uchar weiseg[4] = {0xfe,0xfd,0xfb,0xf7};
  58. static uchar state[]={4,12,8,10,26,58,18,48,32,33,1,65,64,128};
  59. static uchar shushow[11]={   
  60.                            0xFA,/*0*/
  61.                            0x60,/*1*/
  62.                            0xDC,/*2*/
  63.                            0xF4,/*3*/
  64.                            0x66,/*4*/
  65.                            0xB6,/*5*/
  66.                            0xBE,/*6*/
  67.                            0xE0,/*7*/
  68.                            0xFE,/*8*/
  69.                            0xF6,/*9*/
  70.                            0x00

  71.                           };
  72. static uchar taple[] = {
  73.                           0xff,
  74.                                                   0xe7,
  75.                                                   0xc3,
  76.                                                   0x81,
  77.                                                   0x00,
  78.                                                   0x18,
  79.                                                   0x3c,
  80.                                                   0x7e,
  81.                                                   0xff,
  82.                                                   0xaa,
  83.                                                   0x55
  84.                                            };
  85. static uint  smg[11]  = {
  86.                           1,
  87.                           12,
  88.                                                   123,
  89.                                                   1234,
  90.                                                   2345,
  91.                                                   3456,
  92.                                                   4567,
  93.                                                   5678,
  94.                                                   6789,
  95.                                                   9123,
  96.                                                   3210        
  97.                                             };
  98. void AD_control();
  99. void angle_control();
  100. void set_angle(uchar agh,uchar agl);
  101. void display(uint shuzhi);
  102. void delay1(int k) ;
  103. void set595(uchar s2);
  104. void led_line(uchar s2);
  105. /*******************************************************************************/
  106. //////////////////////////////中断初始化函数/////////////////////////////////////
  107. /*******************************************************************************/        
  108. /******************************************************************************

  109.                            端口初始化函数

  110. ******************************************************************************/                                
  111. void port_init(void)
  112. {
  113.     DDRA  = 0x00;
  114.     PORTB = 0x00;
  115.     DDRB  = 0xff;
  116.     PORTC = 0x0F;
  117.     DDRC  = 0x7F;
  118.     PORTD = 0x00;
  119.     DDRD  = 0xff;
  120.     H595DDR_OUT ;
  121.     H595DDR_OUT1;
  122. }
  123. /******************************************************************************

  124.                              AD初始化函数

  125. ******************************************************************************/
  126. void adc_init(void)
  127. {
  128. ADCSRA        = 0x00;        //禁止AD转换
  129. ADMUX        = 0x60;
  130. SFIOR |= 0x00;
  131. ACSR        = 0x80; //禁止模拟比较器
  132. ADCSRA        = 0xEE;
  133. }


  134. /**********************定时T1初始化******************************

  135.   模式:8位相位修正PWM模式
  136.   舵角控制: OCR1AL=0XCA时,左最大,0XD0时,中间位置,0XD7时右转最大
  137.   系统时钟:内部8MHZ,经256分频得61.275HZPWM频率
  138.   
  139. ****************************************************************/

  140. //定时T1初始化
  141. void timer1_init(void)
  142. {
  143. TCCR1B = 0x00;//停止定时器
  144. TIMSK |= 0x18;//中断允许
  145. TCNT1H = 0x00;
  146. TCNT1L = 0x00;//初始值
  147. OCR1AH = 0x00;
  148. OCR1AL = 0xC9;//匹配A值(C8-D0-DA)
  149. OCR1BH = 0x00;
  150. OCR1BL = 0x09;//匹配B值
  151. TCCR1A = 0xf1;
  152. // TCCR1B = 0x04;//启动定时器
  153. TCCR1B = 0x04;//启动定时器
  154. }

  155. /******************************************************************************

  156.                              串口初始化函数

  157. ******************************************************************************/
  158. void uart0_init(void)
  159. {
  160. UCSRB = 0x00; //disable while setting baud rate
  161. UCSRA = 0x00;
  162. UCSRC = BIT(URSEL) | 0x06;
  163. UBRRL = 0x67;
  164. UBRRH = 0x00;//set baud rate hi
  165. UCSRB = 0x98;
  166. }
  167. /**********************************END****************************************/



  168. /*****************************************************************************/
  169. ///////////////////////////////中断处理函数////////////////////////////////////
  170. /*****************************************************************************/



  171. void uart0_tx_isr( char x)
  172. {
  173.   while(!(UCSRA&0x20));
  174.   UDR=x;
  175. }
  176. unsigned int adc_calc(void)
  177. {
  178. //计算实际电压
  179. unsigned long value=0;
  180. value = ADCL>>6;                 //首先读低位
  181. value|=(int)ADCH << 2; //然后读高位
  182. voltage = value;
  183. return voltage;
  184. }
  185. /*************************************************
  186.        中断接受,同时发送接受到的内容
  187. **************************************************/
  188. #pragma interrupt_handler uart0_rx_isr:12
  189. void uart0_rx_isr(void)
  190. {
  191.   unsigned char x;
  192.   CLI();
  193.   x=UDR;
  194.   uart0_tx_isr(x);
  195.   SEI();
  196. }

  197. #pragma interrupt_handler adc_isr:15
  198. void adc_isr(void)//转换完成后中断处理
  199. {
  200.    uchar back_flag;
  201.    AD_num++;
  202.    ADMUX++;
  203.    if(AD_num>7)
  204.     {
  205.       AD_num = 0;
  206.           ADMUX        = 0x60;
  207.     }
  208.    voltage=adc_calc();
  209.    AD_get[AD_num1]=voltage;

  210. /*********************************AD转换值处理*****************************************/

  211. /*  AD_min[AD_num1]=(AD_get[AD_num1]<AD_min[AD_num1]) ? AD_min[AD_num1]:AD_get[AD_num1];
  212.    AD_max[AD_num1]=(AD_get[AD_num1]>AD_max[AD_num1]) ? AD_max[AD_num1]:AD_get[AD_num1];
  213.    AD_read[AD_num1]= (AD_min[AD_num1]+ AD_max[AD_num1])*3/4 ;
  214.    if(AD_get[AD_num1]>AD_read[AD_num1])
  215.     {
  216.          back_flag|=BIT(i);
  217.      black_flag=back_flag;  
  218.         } */
  219. /********************************此部分有待证实*****************************************/
  220.    AD_num1++;
  221.    if(AD_num1>7)
  222.    AD_num1=0;
  223. }
  224. /**************************************************/
  225. /////////////////定时器T1匹配中断A服务程序/////////
  226. /**************************************************/
  227. #pragma interrupt_handler timer1_compa_isr:7
  228. void timer1_compa_isr(void)
  229. {
  230. CLI();
  231. if(angle_flag1==1)
  232.   {
  233.     angle_flag1=0;
  234.     OCR1AH = angleh;
  235.     OCR1AL = anglel;
  236.   }
  237.   SEI();
  238. }
  239. //定时器T1匹配中断B服务程序
  240. #pragma interrupt_handler timer1_compb_isr:8
  241. void timer1_compb_isr(void)
  242. {
  243. CLI();
  244. if(angle_flag2==1)
  245.   {
  246.     angle_flag2=0;
  247.     OCR1BH = 0x00;
  248.     OCR1BL = sudu;
  249.   }
  250.   SEI();
  251. }


  252. /******************************************************************************/
  253. ///////////////////////////time delay funtion///////////////////////////////////
  254. /******************************************************************************/


  255. void delay1(int k)   //延时
  256. {
  257.      int i;           
  258.      for(i=0;i<k;i++);
  259. }
  260.          


  261. /******************************************************************************/
  262. /*****************************595扫描流水灯函数********************************/
  263. /******************************************************************************/         
  264. void set595(uchar s2)
  265.   {
  266.         uchar mid,j = 0;
  267.         CLI();
  268.         for (j=0;j<8;j++)
  269.     {
  270.           mid=s2&0x01;   
  271.           H595_SCK_L ;
  272.           if (mid == 0)
  273.               H595_SER_L ;
  274.           else
  275.               H595_SER_H;
  276.               NOP();
  277.               H595_SCK_H;
  278.           NOP();
  279.               s2=s2>>1;
  280.          }
  281.          H595_RCK_L ;
  282.      NOP();
  283.          H595_RCK_H;
  284.          SEI();
  285.         
  286.   }
  287.         
  288. void led_line(uchar s2)
  289.   {
  290.          uchar mid,j=0;
  291.          CLI();
  292.          for (j=0;j<8;j++)
  293.      {
  294.            mid=s2&0x01;   
  295.            H595_SCK1_L ;
  296.            if (mid==0)
  297.              H595_SER1_L ;
  298.            else
  299.              H595_SER1_H;
  300.              NOP();
  301.              H595_SCK1_H;
  302.              NOP();
  303.              s2=s2>>1;
  304.          }
  305.          H595_RCK1_L ;
  306.      NOP();
  307.          H595_RCK1_H;
  308.          SEI();
  309.    }
  310.         

  311.         
  312. void display(uint shuzhi)
  313. {
  314.    uchar ge,shi,bai,qian;
  315.    if(shuzhi > 999)
  316.      {
  317.        ge=shuzhi%10;
  318.        shi=shuzhi%100/10;
  319.        bai=shuzhi%1000/100;
  320.        qian=shuzhi/1000;
  321.      }
  322.    else  if(shuzhi>99)
  323.     {
  324.        ge=shuzhi%10;
  325.        shi=shuzhi%100/10;
  326.        bai=shuzhi/100;
  327.        qian=10;
  328.         }
  329.    else if(shuzhi>9)
  330.     {
  331.        ge   = shuzhi%10;
  332.        shi  = shuzhi/10;
  333.        bai  = 10;
  334.        qian = 10;
  335.     }
  336.    else
  337.         {
  338.             ge   = shuzhi;
  339.         shi  = 10;
  340.         bai  = 10;
  341.         qian = 10;
  342.         }  
  343.    set595(shushow[ge]);
  344.    SEG_4_L;
  345.    delay1(200);
  346.    SEG_4_H;

  347.    set595(shushow[shi]);
  348.    SEG_3_L;
  349.    delay1(200);
  350.    SEG_3_H;
  351.    
  352.    set595(shushow[bai]);
  353.    SEG_2_L;
  354.    delay1(200);
  355.    SEG_2_H;
  356.    
  357.    set595(shushow[qian]);
  358.    SEG_1_L;
  359.    delay1(200);
  360.    SEG_1_H;
  361.   }
  362.   
  363. /******************************************************************************/
  364. /**********************************END*****************************************/
  365. /******************************************************************************/





  366. /********************************角度,速度实时处理函数************************/
  367. void set_angle(uchar agh,uchar agl)
  368.   {
  369.      angle_flag1=1;
  370.          angleh=agh;
  371.          anglel=agl;
  372.          
  373.   }
  374.   void set_sudu(uchar sd)
  375.   {
  376.     angle_flag2=1;
  377.         sudu=sd;
  378.   }
  379. /************************************end***************************************/




  380. /*********************坡道处理函数,有待实践证实********************************/
  381.   void set_podao()
  382.   {
  383.     uint ii,iii;
  384.         if(i<100)//上坡
  385.     AD_control();
  386.           else
  387.     if(i>100)//下坡趋势//傍晚100快速50
  388.          {
  389.            for(ii=0;ii<6000;ii++ )


  390. …………篇幅太大余下代码请下载附件…………

复制代码







回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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