找回密码
 立即注册

QQ登录

只需一步,快速开始

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

avr单片机智能寻迹小车程序PCB资料

[复制链接]
跳转到指定楼层
楼主
智能寻迹小车资料


单片机源程序如下:
  1. /******************************************************************************
  2. 名称 :寻迹控制
  3. cpu  : mega16
  4. 晶振 :内部8M
  5. ******************************************************************************/

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

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

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


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

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


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

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

  108.                            端口初始化函数

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

  123.                              AD初始化函数

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


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

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

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

  154. /******************************************************************************

  155.                              串口初始化函数

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



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



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

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

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

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


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


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


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

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

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





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




  379. /*********************坡道处理函数,有待实践证实********************************/
  380.   void set_podao()
  381.   {
  382.     uint ii,iii;
  383.         if(i<100)//上坡
  384.     AD_control();
  385.           else
  386.     if(i>100)//下坡趋势//傍晚100快速50
  387.          {
  388.            for(ii=0;ii<6000;ii++ )
  389.         {
  390.                 AD_control();
  391.   switch(black_flag)
  392.   {
  393.    case 4:  set_angle(0x00,0xc8);set_sudu(0xca);BACK2_ON ;break;         //2
  394.    case 6:  set_angle(0x00,0xca);set_sudu(0xca);BACK2_ON ;break;         //12
  395.    case 2 : set_angle(0x00,0xcb);set_sudu(0x9a);BACK2_ON ;break;         //1
  396.    case 10: set_angle(0x00,0xcc);set_sudu(0x9a);BACK2_ON ;break;         //13
  397.    case 8 : set_angle(0x00,0xcd);set_sudu(0x9a);break;         //3  
  398.    case 24: set_angle(0x00,0xce);set_sudu(0x9a);break;         //34
  399.    case 56: set_angle(0x00,0xcf);set_sudu(0x90);break;         //345
  400.    case 16: set_angle(0x00,0xcf);set_sudu(0x90);break;         //4
  401.    case 48: set_angle(0x00,0xd0);set_sudu(0x91);break;         //45   
  402.    case 32: set_angle(0x00,0xd0);set_sudu(0x91);break;         //5
  403.    case 96: set_angle(0x00,0xd1);set_sudu(0x91);break;         //56
  404.    case 64: set_angle(0x00,0xd2);set_sudu(0x91);break;         //6   
  405.    case 65: set_angle(0x00,0xd4);set_sudu(0x91);break;         //06
  406.    case 1: set_angle(0x00,0xd5);set_sudu(0x91);;BACK1_ON ;break;         //0
  407.    case 129: set_angle(0x00,0xd7);set_sudu(0x91);;BACK1_ON ;break;         //07
  408.    case 128: set_angle(0x00,0xd9);set_sudu(0xc1);;BACK1_ON ;break;         //7
  409.   // default:i++;set_angle(0x00,0xd0);break;
  410.    default:set_angle(0x00,0xd0);break;
  411.   }
  412.           }       
  413.            i=0;
  414.         }
  415.   }
  416. /************************************end***************************************/




  417. /******************************************************************************/
  418.                                              ///
  419.                         ////                ///
  420.                          ///      ///////////////////                     
  421.                                               ///             ///
  422.                                          ///
  423.                       ////////   /////////////////////
  424.                                       ///
  425.                              //      ///
  426.                             ///    ///          ///
  427.                       //////    /////////////////////
  428.                                                   ////

  429. /******************************************************************************/
  430. void Online(uchar sd)
  431. {
  432. online++;
  433. if(online==10)
  434. {
  435.    online = 0;
  436.    set_sudu(sd);   
  437. }
  438. set_sudu(0x90);
  439. }
  440. void angle_control()
  441. {  
  442.   
  443.   BACK1_OFF ; //转向灯
  444.   BACK2_OFF ;
  445. switch(black_flag)
  446.   {
  447.   case 4:  set_angle(0x00,0xc8);set_sudu(0xaa);BACK2_ON ;break;         //2
  448.    case 6:  set_angle(0x00,0xcb);set_sudu(0x41);BACK2_ON ;break;         //12
  449.    case 2 : set_angle(0x00,0xcd);set_sudu(0x20);BACK2_ON ;break;         //1
  450.    case 10: set_angle(0x00,0xce);set_sudu(0x15);break;         //13
  451.    case 8 : set_angle(0x00,0xcd);set_sudu(0x10);break;         //3  
  452.    case 24: set_angle(0x00,0xce);set_sudu(0x02);break;         //34
  453.    case 56: set_angle(0x00,0xcf);set_sudu(0x01);break;         //345
  454.    case 16: set_angle(0x00,0xcf);set_sudu(0x01);break;         //4
  455.    case 48: set_angle(0x00,0xd0);set_sudu(0x01);break;         //45   
  456.    case 32: set_angle(0x00,0xd1);set_sudu(0x01);break;         //5
  457.    case 96: set_angle(0x00,0xd1);set_sudu(0x02);break;         //56
  458.    case 64: set_angle(0x00,0xd2);set_sudu(0x10);break;         //6   
  459.    case 65: set_angle(0x00,0xd4);set_sudu(0x15);break;         //06
  460.    case 1:   set_angle(0x00,0xd5);set_sudu(0x20);BACK1_ON;break;         //0
  461.    case 129: set_angle(0x00,0xd7);set_sudu(0x41);BACK1_ON;break;         //07
  462.    case 128: set_angle(0x00,0xd9);set_sudu(0xa1);BACK1_ON;break;         //7
  463.    // case 0:set_sudu(0x5a);BACK1_ON ;break;         //7
  464.    default:i++;set_angle(0x00,0xd0);set_podao();break;
  465.   }
  466.    
  467. }

  468. void AD_control()
  469. {
  470. uchar i;
  471. uchar back_flag=0;
  472. for(i=0;i<8;i++)
  473. {
  474.    AD_min[i]=(AD_get[i]<AD_min[i]) ? AD_min[i]:AD_get[i];
  475.    AD_max[i]=(AD_get[i]>AD_max[i]) ? AD_max[i]:AD_get[i];
  476.    AD_read[i]= (AD_min[i]+ AD_max[i])*7/10 ;
  477.    if(AD_get[i]>AD_read[i])
  478.     {
  479.          back_flag|=BIT(i);
  480.      black_flag=back_flag;  
  481.         }
  482. }
  483. }

  484. void init_devices(void)
  485. {
  486.    CLI(); //禁止所有中断
  487.    MCUCR  = 0x00;
  488.    MCUCSR = 0x80;//禁止JTAG
  489.    GICR   = 0x00;
  490.    port_init();
  491.    adc_init();
  492.   // uart0_init();
  493.    timer1_init();
  494.   // OSCCAL=0Xff;// 内部8m时钟校正
  495.    SEI();//开全局中断
  496. }




  497. /******************************************************************************/
  498. /********************************MAIN FUNTION**********************************/
  499. /******************************************************************************/
  500. void main()
  501. {  
  502.    uint Count,Count1;
  503.    uchar Count2;
  504.    init_devices();
  505.    while(1)
  506.     {
  507.         Count++;
  508.         if(Count>200)
  509.         {
  510.          Count=0;
  511.         Count1++;
  512.         if(Count1>11)
  513.         Count1=0;
  514.         Count2=Count1;       
  515.         led_line(taple[Count2]);       
  516.         }
  517.           //led_line(Count2);
  518.           display(8888);
  519.           //display(black_flag);
  520.           AD_control();
  521.           angle_control();
  522.         }
  523. }
复制代码



PCB文件下载(有错误 仅供参考 求大神指导): 资料.7z (73.04 KB, 下载次数: 6)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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