注册会员
- 积分
- 124
- 威望
- 70
- 贡献
- 36
- 兑换币
- 32
- 注册时间
- 2014-3-7
- 在线时间
- 9 小时
- 毕业学校
- 襄阳小学
|
2#
楼主 |
发表于 2014-4-16 08:51:48
|
只看该作者
我用的代码是拉普拉德的例程,只改了一点
/*
* 测试硬件平台: Mc9s12xs128
* 版权所有: 北京拉普兰德电子技术有限公司
* 网络销售:
* 公司门户: :/
*
* 说明: 本工程基于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 = 208; //波特率配置成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位分辨率,采样前不卸载内部采样电容!⑼獠看シ⑹保?≡裢ǖ?5
//ATD0CTL2: ??=0,AFFC=1,ICLKSTP=0,ETRIGLE=0,ETRIGP=0,ETRIGE=0,ASCIE=0,
//ACMPIE=0
ATD0CTL2 = 0b01000000; //下降沿触发,不接受外部信号,禁用ATD比较中断请求
}
//---------------------------------------------------------------------
//函 数 名:ADCValue
//功 能:1路A/D转换函数,获取通道channel的A/D转换结果
//参 数:channel = 通道号
//返 回:该通道的12位A/D转换结果
//---------------------------------------------------------------------
uint ADCValue(uchar channel)
{
//暂存A/D转换的结果
uint temp;
ATD0CTL5 = channel;
//取A/D转换结果
while(!ATD0STAT0_SCF);
temp = ATD0DR0;
return temp;
}
//----------------------------------------------------------------------
//函 数 名:延时函数 delay(), DelayMs()
//功 能:延时函数
//返 回:无
//----------------------------------------------------------------------
void delay()
{
unsigned int i;
for(i=0;i<8;i++)
{
asm("nop");
}
}
void DelayMs(int time)
{
short x,y;
for(x=0;x<4106;x++){
for(y=time;y>0;y--){
}
}
}
//----------------------------------------------------------------------
//函 数 名:TSL1401_GetLine
//功 能:获得AD采样像素
//参 数:*pixel 获得的像素值
//返 回:无
//----------------------------------------------------------------------
void TSL1401_GetLine(uchar *pixel)
{
uchar i;
//开始SI
TSL1401_SI(0) ;
TSL1401_CLK(0);
delay(); //20time
TSL1401_SI(1);
delay();
TSL1401_CLK(1);
delay();
TSL1401_SI(0);
delay();
//采集第1个点
//AD配置成为8位精度,所以这里获得的是一个字节数据
TSL1401_CLK(0); pixel[0] = (uchar)ADCValue(0);
//采集第2~128个点
for(i=1; i<128; i++)
{
delay();
TSL1401_CLK(1);
delay();
TSL1401_CLK(0); pixel[i] = (uchar)ADCValue(0);
}
//发送第129个clk
delay();
TSL1401_CLK(1);
delay();
TSL1401_CLK(0);
delay();
}
/********************************************************************/
|
|