標(biāo)題:
飛思卡爾比賽后的代碼和原理圖PCB
[打印本頁(yè)]
作者:
qq570165583
時(shí)間:
2017-10-31 11:19
標(biāo)題:
飛思卡爾比賽后的代碼和原理圖PCB
全部資料51hei下載地址:
液晶3(可用3).zip
(665.28 KB, 下載次數(shù): 16)
2017-10-31 11:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
單片機(jī)源程序如下:
#include "derivative.h"
#include <stdio.h>
#include <string.h>
#include"OLED12864.h"
int AD_wValue[6];//AD轉(zhuǎn)換結(jié)果
word AD[6]={0,0,0,0,0,0};
word AD_erro[4]={0,0,0,0};
int i;
//word AD_value[9]={0,0,0,0,0,0,0,0,0};
int i,numbermax,AD_valuemax,AD_valuemax2,Remax,Remax2;
int numbermax2,Expect_value,Expect_value2,Renumber,Renumber2;
float temp,angle;
int directflag;
char out_flag1,out_flag0;
//char out_flag0,out_flag1;
void delay(int n)
{
int i,j;
for(i=0;i<n;i++);
}
//-----時(shí)鐘初始化程序--------//
void PLL_Init(void)
{
REFDV=1;
SYNR=2;
while(!(CRGFLG&0x08));
CLKSEL=0x80;
}
//---------------------------------------------------------------------
// 函數(shù)功能:配置單片機(jī)鎖相環(huán),使其工作在40Mhz
// 形式參數(shù): 無(wú)
// 函數(shù)返回值:無(wú)
//---------------------------------------------------------------------
void BusCLK_40M(void)
{
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR =0xc0 | 0x04;
REFDV=0x80 | 0x01;
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
_asm(nop); //BUS CLOCK=40M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void Init_PWM(void)
{
PWME=0X00;
PWMCTL_CON01=1; //通道級(jí)聯(lián)
PWMCTL_CON23=1;
PWMCTL_CON45=1;
PWMCAE=0X00; //0左對(duì)齊 1中心對(duì)齊
PWMPRCLK=0X22; //2分頻
PWMPOL_PPOL1=1;
PWMPOL_PPOL5=1;
PWMPOL_PPOL3=1;
//PWMCNT01 = 0; //計(jì)數(shù)器從零開(kāi)始計(jì)數(shù)
//PWMCNT23 = 0; //計(jì)數(shù)器從零開(kāi)始計(jì)數(shù)
PWMSCLA=1;
PWMSCLB=0X19;
PWMCLK_PCLK1=0;
PWMCLK_PCLK5=1;
PWMCLK_PCLK3=1;
//PWMPRCLK =0x00; //選擇時(shí)鐘B,50MHZ
PWMCLK=0XFF;
PWMPER01 = 1000; //周期 20ms
PWMPER45 = 1000; //周期 20ms
PWMPER23=4000; //200hz 周期0.005ms
PWMDTY01 = 670;
PWMDTY45 = 670;
PWMDTY23=315; //317zhong 347zuo 280you
PWME_PWME3 = 1;
PWME_PWME1 = 1;
PWME_PWME5=1;
}
//--------------總線時(shí)鐘=48/2=24MHz------------//
//-----ATD初始化程序--------//
void AD_Init(void)
{
ATD0CTL1=0x00; //00000000 選擇AD0通道為外部觸發(fā),8 位精度,采樣前不放電
ATD0CTL2=0x40; //01000000 標(biāo)志位自動(dòng)清零,禁止外部觸發(fā), 禁止中斷
ATD0CTL3=0xb0; //10001000 右對(duì)齊無(wú)符號(hào),每次轉(zhuǎn)換1 個(gè)序列, No FIFO, Freeze 模式下繼續(xù)轉(zhuǎn)
ATD0CTL4=0x03; //00000001 采樣時(shí)間為4 個(gè)AD 時(shí)鐘周期,PRS=1,ATDClock=24/(2*(1+1))=6MHz
ATD0CTL5=0x30; //00100000 特殊通道禁止,連續(xù)轉(zhuǎn)換,單通道轉(zhuǎn)換,輸入通道為0
ATD0DIEN=0x00; //00000000 禁止數(shù)字輸入
}
//-----讀取AD轉(zhuǎn)換結(jié)果--------//
void AD_GetValue()
{
AD_wValue[0]=ATD0DR0; //讀取結(jié)果寄存器的值
AD_wValue[1]=ATD0DR1; //讀取結(jié)果寄存器的值
AD_wValue[2]=ATD0DR2; //讀取結(jié)果寄存器的值
AD_wValue[3]=ATD0DR3; //讀取結(jié)果寄存器的值
AD_wValue[4]=ATD0DR4;
AD_wValue[5]=ATD0DR5;
}
void remember_ADvalue()
{
AD[0]=AD_wValue[0];
AD[1]=AD_wValue[1];
AD[2]=AD_wValue[2];
AD[3]=AD_wValue[3];
AD[4]=AD_wValue[4];
AD[5]=AD_wValue[5];
}
void xiuzhen_ADvalue()
{
for(i=0;i<=5;i++)
AD_erro[i]=AD_wValue[i]-AD[i];
if(AD_erro[i]>10)
AD_wValue[i]=AD[i];
else
AD_wValue[i]=AD_wValue[i];
}
void Get_Road()
{
for(i=0;i<=3;i++)
{
if(AD[i]>AD_valuemax)
{
AD_valuemax=AD[i]; //采集AD的最大值
numbermax=i; //記錄最大值的通道
// Remax=AD_valuemax;
// Renumber=i;
}
// else
// {
// AD_valuemax=Remax;
// i=Renumber;
// }
}
for(i=0;i<=3;i++)
{
if(AD[i]>AD_valuemax2&&AD[i]<AD_valuemax)
{
AD_valuemax2=AD[i];
numbermax2=i;
// Remax2=AD_valuemax2;
// Renumber2=i;
}
// else
//{AD_valuemax=Remax2;
// i=Renumber2;}
}
switch (numbermax) {
case 0: Expect_value=30; if(AD_valuemax>60)directflag=1;break;
case 1: Expect_value=10; break;
case 2: Expect_value=-10; break;
case 3: Expect_value=-30; if(AD_valuemax>60)directflag=2;break;
//case 4: Expect_value=-50; break;
//case 5: Expect_value=-150; if(AD_valuemax>80)directflag=2;break;
//case 6: Expect_value=-200;if(AD_valuemax>80)directflag=2;break;
}
switch (numbermax2) {
case 0: Expect_value2=30; break;
case 1: Expect_value2=10; break;
case 2: Expect_value2=-10; break;
case 3: Expect_value2=-30; break;
//case 4: Expect_value2=-50; break;
//case 5: Expect_value2=-150; break;
//case 6: Expect_value2=-200; break;
}
}
void change_duoji()
{
if(numbermax>numbermax2) temp=(Expect_value+Expect_value2)/2-(AD_valuemax-AD_valuemax2)/2;
if(numbermax<numbermax2) temp=(Expect_value+Expect_value2)/2+(AD_valuemax-AD_valuemax2)/2;
if(AD_wValue[0]>100||AD_wValue[1]>100||AD_wValue[2]>100||AD_wValue[3]>100)
{
if(numbermax<1) {angle=temp*0.30+315;PWMDTY45=100;PWMDTY01=570;}
else if(numbermax>2) {angle=temp*0.30+315;PWMDTY45=570;PWMDTY01=100;}
else angle=temp*0.20+315;
}
else if(AD_wValue[4]>AD_wValue[5]) angle=((AD_wValue[4]-AD_wValue[5])/2)*0.7+325;
else if(AD_wValue[5]>AD_wValue[4]) angle=305-((AD_wValue[5]-AD_wValue[4])/2)*0.70;
if(angle>350)
{
angle=350;
PWMDTY45=100;
PWMDTY01=570;
}
if(angle<280)
{
angle=280;
PWMDTY45=570;
PWMDTY01=100;
}
if(directflag==1&&AD_valuemax2<40) angle=350;
if(directflag==2&&AD_valuemax2<40) angle=280;
PWMDTY23=(int)angle;
AD_valuemax=0;AD_valuemax2=0;
}
//-----主函數(shù)--------//
void main(void)
{
char e[100] ;
//PLL_Init();
BusCLK_40M();
AD_Init();
Init_PWM();
DDRB=0XFF;
PORTB=0XFF;
LCD_Init();
EnableInterrupts;
for(;;)
{
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
作者:
LRX1113100356
時(shí)間:
2018-1-8 16:19
不錯(cuò),很實(shí)用
作者:
LRX1113100356
時(shí)間:
2018-1-8 16:19
不錯(cuò),很實(shí)用
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1