⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 [拉普兰德]TSL1401线性CCD模块资料包
💻 C
字号:
/*
 * 测试硬件平台:  Mc9s12xs128
 * 版权所有:      北京拉普兰德电子技术有限公司
 * 网络销售:      http://laplenden.taobao.com
 * 公司门户:      http://www.lpld.cn
 *
 * 说明:    本工程基于Mc9s12xs128 开源底层开发包开发,
 *          
 *
 * 用途:		拉普兰德TSL1401线性CCD模块使用例程
 *                      
 * 引脚连接:
 *                      PORTA_PA0   --SI
 *                      PORTA_PA1   --CLK
 *                      AN00        --AO 
 *
 * 串口显示:利用MC9S12XS128的SCI0作为串口
 *                      PS1        --TXD
 *                      PS0        --RXD
 *
 * 参数设置:
 *                      PRINT_AD    --设置串口打印数据的类型,二值量或模拟量   
 *                      THRESHOLD   --设置模拟量转二值量的阈值   
 *                      WINDOW_WIDTH--设置串口打印采集数据的宽度   
 *
 */
#include <hidef.h>            /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define TSL1401_SI(x)   (PORTA_PA0=(x))
#define TSL1401_CLK(x)  (PORTA_PA1=(x))

#define PRINT_AD        (1)       //设置串口打印数据类型,0:打印二值化数据,1:打印AD值
#define THRESHOLD       (100)     //设置二值化阈值
#define WINDOW_WIDTH    (128)     //设置串口打印的像素个数,最大128,最小0

void IO_Init(void);
void ADC_Init(void);
void UART0_Init(void);
void SetBusClock(void);
uint ADCValue(uchar channel);
void TSL1401_GetLine(uchar *pixel);
void UART0_SendByte(byte ch);
void UART0_SendPacket(byte *pBuf,int pBuf_Length);
void delay();
void DelayMs(int time);

//全局变量声明
uchar gPixel[128] = {0};

void main(void) 
{

  uchar i;
  
	EnableInterrupts;
	//初始化系统时钟,使其配置在32Mhz
  SetBusClock();
  //初始化IO
  IO_Init();
  //初始化ADC
  ADC_Init();
  //初始化UART
  UART0_Init();
  
  for(;;) 
  {
  
    _FEED_COP(); /* feeds the dog */
    
    //获得像素值
    TSL1401_GetLine(gPixel);
    
    //打印输出
    for(i=(64-WINDOW_WIDTH/2); i<(64+WINDOW_WIDTH/2); i++)
    {
#if(PRINT_AD==1)          //串口发送AD值,可用于线性CCD调试助手
      if(gPixel[i]==0xFF) 
        gPixel[i] = 0xFE; //遇到FF用FE替换即可
      UART0_SendByte(gPixel[i]);
#else                     //串口发送而值量,方便用串口调试
      if(gPixel[i]>THRESHOLD)
        UART0_SendByte(1);
      else
        UART0_SendByte(0);
#endif     
    }
    UART0_SendByte(0xFF);
    DelayMs(100);
  } 
  
}


//---------------------------------------------------------------------
// 函数功能:配置单片机锁相环,使其工作在32Mhz
// 形式参数:  无
// 函数返回值:无   
//---------------------------------------------------------------------
void SetBusClock(void)
{   
  CLKSEL=0x00;        //disengage PLL to system
  PLLCTL_PLLON=1;     //turn on PLL
  SYNR =0x40 | 0x03;  //VCOFRQ[7:6];SYNDIV[5:0];
  REFDV=0x80 | 0x01;  //REFFRQ[7:6];REFDIV[5:0]
  POSTDIV=0x00;
                      //fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1);fPLL= fVCO/(2 × POSTDIV);BUS= fPLL/2
                      //if POSTDIV=0, fPLL= fVCO 
  _asm(nop);          //BUS CLOCK=32M
  _asm(nop);
  while(!(CRGFLG_LOCK==1));  //when pll is steady ,then use it;
  CLKSEL_PLLSEL =1;          //engage PLL to system; 
}

//---------------------------------------------------------------------
// 函数功能:控制
// 形式参数:  无
// 函数返回值:无   
//---------------------------------------------------------------------
void IO_Init(void) 
{

  DDRA_DDRA0 = 1; //配置IO为输出
  DDRA_DDRA1 = 1; //配置IO为输出
  PORTA_PA0  = 0; //配置IO的数据为0
  PORTA_PA1  = 0; //配置IO的数据为0
}

//---------------------------------------------------------------------
// 函数功能:UART0_Init初始化
// 形式参数:  无
// 函数返回值:无   
//---------------------------------------------------------------------
void UART0_Init(void)
{
  SCI0CR1 = 0x00; 
  SCI0CR2 = 0x2C;     //接收中断使能,发送接收使能
  SCI0BD  = 0x34;     //波特率配置成38400
                      //When IREN = 0 then 
                      //SCI baud rate = SCI bus clock / (16 x SBR[12:0])
}

//---------------------------------------------------------------------
// 函数功能:SCI0发送一个字节数据
// 形式参数:  byte ch:发送的一个字节数据
// 函数返回值:无   
//---------------------------------------------------------------------
void UART0_SendByte(byte ch)
{
  while(!(SCI0SR1&0x80));
  SCI0DRL = ch; 
}

//---------------------------------------------------------------------
// 函数功能:SCI0发送字符串数据
// 形式参数:   byte *pBuff     发送缓冲区
//              int Length 发送字节的长度 
// 函数返回值:无   
//---------------------------------------------------------------------
void UART0_SendPacket(byte *pBuf,int pBuf_Length) 
{
  int i;
  for(i=0;i<pBuf_Length;i++)
  {
    while(!(SCI0SR1&0x80));
    SCI0DRL=*(pBuf+i); 
  }
} 


//---------------------------------------------------------------------
//函 数 名:ADCInit                                                      
//功    能:A/D转换初始化,设置A/D转换时钟频率为1MHz                      
//参    数:无                                                           
//返    回:无                                                           
//---------------------------------------------------------------------
void ADC_Init(void)
{

  //ATD0CTL4: SMP2=1,SMP1=1,SMP0=1,PRS4=0,PRS3=1,PRS2=1,PRS1=1,PRS0=1 
  ATD0CTL4 = 0b11101111; //设置采样时间和频率,fATDCLK=fBUS/(2 ×(PRS + 1)) 
  
  //ATD0CTL3: DJM=1,S8C=0,S4C=0,S2C=0,S1C=1,FIFO=0,FRZ1=0,FRZ0=0 
  ATD0CTL3 = 0b10001000; //采样结果右对齐,每个序列的转换个数为1
   
  //ATD0CTL0: ??=0,??=0,??=0,??=0,WRAP3=1,WRAP2=1,WRAP1=1,WRAP0=1 
  ATD0CTL0 = 0b00000001; //AD循环采集到AN1后即可  
  
  //ATD0CTL1: ETRIGSEL=0,SRES1=0,SRES0=0,SMP_DIS=0,ETRIGCH3=1,ETRIGCH2=1
  //,ETRIGCH1=1,ETRIGCH0=1 
  ATD0CTL1 = 0b00001111; //8位分辨率,采样前不卸载内部采样电容!⑼獠看シ⑹保

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -