找回密码
 立即注册

QQ登录

只需一步,快速开始

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

飞思卡尔比赛后的代码和原理图PCB

[复制链接]
跳转到指定楼层
楼主
ID:244481 发表于 2017-10-31 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

全部资料51hei下载地址:
液晶3(可用3).zip (665.28 KB, 下载次数: 16)


单片机源程序如下:
  1. #include "derivative.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include"OLED12864.h"
  5. int AD_wValue[6];//AD转换结果
  6. word AD[6]={0,0,0,0,0,0};
  7. word AD_erro[4]={0,0,0,0};
  8. int i;
  9. //word AD_value[9]={0,0,0,0,0,0,0,0,0};
  10. int i,numbermax,AD_valuemax,AD_valuemax2,Remax,Remax2;
  11. int numbermax2,Expect_value,Expect_value2,Renumber,Renumber2;
  12. float temp,angle;
  13. int directflag;
  14. char out_flag1,out_flag0;
  15. //char out_flag0,out_flag1;

  16. void delay(int n)
  17. {
  18.    int i,j;
  19.    for(i=0;i<n;i++);
  20. }
  21.    
  22. //-----时钟初始化程序--------//
  23. void PLL_Init(void)      
  24. {                    
  25.   REFDV=1;           
  26.   SYNR=2;
  27.   while(!(CRGFLG&0x08));
  28.   CLKSEL=0x80;
  29. }

  30. //---------------------------------------------------------------------
  31. // 函数功能:配置单片机锁相环,使其工作在40Mhz
  32. // 形式参数:  无
  33. // 函数返回值:无   
  34. //---------------------------------------------------------------------
  35. void BusCLK_40M(void)
  36. {   
  37.     CLKSEL=0X00;                                //disengage PLL to system
  38.     PLLCTL_PLLON=1;                        //turn on PLL
  39.     SYNR =0xc0 | 0x04;                        
  40.     REFDV=0x80 | 0x01;
  41.     POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
  42.     _asm(nop);          //BUS CLOCK=40M
  43.     _asm(nop);
  44.     while(!(CRGFLG_LOCK==1));          //when pll is steady ,then use it;
  45.     CLKSEL_PLLSEL =1;                        //engage PLL to system;
  46. }

  47. void Init_PWM(void)
  48. {
  49.     PWME=0X00;  
  50.     PWMCTL_CON01=1;      //通道级联
  51.     PWMCTL_CON23=1;
  52.     PWMCTL_CON45=1;
  53.     PWMCAE=0X00;      //0左对齐 1中心对齐
  54.     PWMPRCLK=0X22;    //2分频
  55.     PWMPOL_PPOL1=1;  
  56.     PWMPOL_PPOL5=1;
  57.     PWMPOL_PPOL3=1;
  58.   //PWMCNT01 = 0;              //计数器从零开始计数
  59.   //PWMCNT23 = 0;              //计数器从零开始计数
  60.   
  61.    PWMSCLA=1;
  62.    PWMSCLB=0X19;
  63.    PWMCLK_PCLK1=0;
  64.    PWMCLK_PCLK5=1;
  65.    PWMCLK_PCLK3=1;
  66.    //PWMPRCLK =0x00;         //选择时钟B,50MHZ
  67.    
  68.    PWMCLK=0XFF;
  69.    
  70.    PWMPER01 = 1000;           //周期 20ms
  71.    PWMPER45 = 1000;           //周期 20ms
  72.    PWMPER23=4000;            //200hz   周期0.005ms
  73.          
  74.    PWMDTY01 = 670;
  75.    PWMDTY45 = 670;            
  76.    PWMDTY23=315;              //317zhong  347zuo  280you
  77.      

  78.    PWME_PWME3 = 1;                     
  79.    PWME_PWME1 = 1;
  80.    PWME_PWME5=1;            
  81. }


  82. //--------------总线时钟=48/2=24MHz------------//
  83. //-----ATD初始化程序--------//
  84. void AD_Init(void)     
  85. {
  86.   ATD0CTL1=0x00; //00000000  选择AD0通道为外部触发,8 位精度,采样前不放电
  87.   ATD0CTL2=0x40; //01000000  标志位自动清零,禁止外部触发, 禁止中断
  88.   ATD0CTL3=0xb0; //10001000  右对齐无符号,每次转换1 个序列, No FIFO, Freeze 模式下继续转
  89.   ATD0CTL4=0x03; //00000001  采样时间为4 个AD 时钟周期,PRS=1,ATDClock=24/(2*(1+1))=6MHz
  90.   ATD0CTL5=0x30; //00100000  特殊通道禁止,连续转换,单通道转换,输入通道为0
  91.   ATD0DIEN=0x00; //00000000  禁止数字输入
  92. }
  93. //-----读取AD转换结果--------//
  94. void AD_GetValue()
  95. {
  96.   AD_wValue[0]=ATD0DR0;  //读取结果寄存器的值
  97.   AD_wValue[1]=ATD0DR1;  //读取结果寄存器的值
  98.   AD_wValue[2]=ATD0DR2;  //读取结果寄存器的值
  99.   AD_wValue[3]=ATD0DR3;  //读取结果寄存器的值
  100.   AD_wValue[4]=ATD0DR4;
  101.   AD_wValue[5]=ATD0DR5;

  102. }

  103. void remember_ADvalue()
  104. {
  105.      AD[0]=AD_wValue[0];
  106.      AD[1]=AD_wValue[1];
  107.      AD[2]=AD_wValue[2];
  108.      AD[3]=AD_wValue[3];
  109.      AD[4]=AD_wValue[4];
  110.      AD[5]=AD_wValue[5];
  111. }

  112. void xiuzhen_ADvalue()
  113. {
  114.    for(i=0;i<=5;i++)
  115.    AD_erro[i]=AD_wValue[i]-AD[i];
  116.    if(AD_erro[i]>10)
  117.    AD_wValue[i]=AD[i];
  118.    else
  119.    AD_wValue[i]=AD_wValue[i];  
  120. }
  121.          
  122. void Get_Road()            
  123. {
  124.        for(i=0;i<=3;i++)
  125.        {
  126.          if(AD[i]>AD_valuemax)
  127.           {
  128.           AD_valuemax=AD[i];         //采集AD的最大值
  129.           numbermax=i;                      //记录最大值的通道
  130.         //  Remax=AD_valuemax;
  131.         //  Renumber=i;
  132.           }
  133.         //  else
  134.         //  {
  135.         //  AD_valuemax=Remax;
  136.         //  i=Renumber;
  137.         //  }
  138.        }
  139.           for(i=0;i<=3;i++)
  140.           {
  141.             if(AD[i]>AD_valuemax2&&AD[i]<AD_valuemax)
  142.             {
  143.              AD_valuemax2=AD[i];
  144.              numbermax2=i;
  145.            //  Remax2=AD_valuemax2;
  146.             // Renumber2=i;
  147.             }
  148.            // else
  149.             //{AD_valuemax=Remax2;
  150.            // i=Renumber2;}
  151.          }
  152.   switch (numbermax) {
  153.     case 0: Expect_value=30; if(AD_valuemax>60)directflag=1;break;
  154.     case 1: Expect_value=10;  break;
  155.     case 2: Expect_value=-10;  break;
  156.     case 3: Expect_value=-30;   if(AD_valuemax>60)directflag=2;break;
  157.     //case 4: Expect_value=-50; break;
  158.     //case 5: Expect_value=-150; if(AD_valuemax>80)directflag=2;break;
  159.     //case 6: Expect_value=-200;if(AD_valuemax>80)directflag=2;break;
  160.   }
  161.   switch (numbermax2) {
  162.     case 0: Expect_value2=30;  break;
  163.     case 1: Expect_value2=10;  break;
  164.     case 2: Expect_value2=-10;   break;
  165.     case 3: Expect_value2=-30;    break;
  166.     //case 4: Expect_value2=-50;  break;
  167.     //case 5: Expect_value2=-150; break;
  168.     //case 6: Expect_value2=-200; break;
  169.    }
  170. }
  171. void change_duoji()                                                            
  172.   {
  173.    if(numbermax>numbermax2) temp=(Expect_value+Expect_value2)/2-(AD_valuemax-AD_valuemax2)/2;
  174.    if(numbermax<numbermax2) temp=(Expect_value+Expect_value2)/2+(AD_valuemax-AD_valuemax2)/2;
  175.    
  176.    if(AD_wValue[0]>100||AD_wValue[1]>100||AD_wValue[2]>100||AD_wValue[3]>100)
  177.    {
  178.    if(numbermax<1)      {angle=temp*0.30+315;PWMDTY45=100;PWMDTY01=570;}
  179.    else if(numbermax>2) {angle=temp*0.30+315;PWMDTY45=570;PWMDTY01=100;}
  180.    else angle=temp*0.20+315;
  181.    }
  182.    
  183.    else if(AD_wValue[4]>AD_wValue[5])   angle=((AD_wValue[4]-AD_wValue[5])/2)*0.7+325;
  184.    else if(AD_wValue[5]>AD_wValue[4])   angle=305-((AD_wValue[5]-AD_wValue[4])/2)*0.70;
  185.    
  186.    if(angle>350)      
  187.    {
  188.    angle=350;
  189.    PWMDTY45=100;
  190.    PWMDTY01=570;
  191.    }
  192.    if(angle<280)      
  193.    {
  194.    angle=280;
  195.    PWMDTY45=570;
  196.    PWMDTY01=100;
  197.    }
  198.    
  199.    if(directflag==1&&AD_valuemax2<40)  angle=350;
  200.    if(directflag==2&&AD_valuemax2<40)  angle=280;
  201.    PWMDTY23=(int)angle;
  202.    AD_valuemax=0;AD_valuemax2=0;      
  203.   }

  204. //-----主函数--------//
  205. void main(void)
  206. {
  207.   char e[100] ;
  208.   //PLL_Init();
  209.   BusCLK_40M();
  210.   AD_Init();
  211.   Init_PWM();
  212.   DDRB=0XFF;
  213.   PORTB=0XFF;
  214.   LCD_Init();
  215.   EnableInterrupts;
  216.                                                   
  217.   for(;;)
  218.   {
  219. ……………………

  220. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:



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

使用道具 举报

沙发
ID:242544 发表于 2018-1-8 16:19 | 只看该作者
不错,很实用
回复

使用道具 举报

板凳
ID:242544 发表于 2018-1-8 16:19 | 只看该作者
不错,很实用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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