单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:463|回复:0

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

[复制链接]
ID:673695发表于 2023-12-14 23:11|显示全部楼层
智能寻迹小车资料
DSCN7186.JPG
100_2879.JPG
IMG_7345.jpg


单片机源程序如下:
  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. }
复制代码
51hei.png



PCB文件下载(有错误 仅供参考 求大神指导): 资料.7z(73.04 KB, 下载次数: 6)

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

Powered by 单片机教程网