📄 main.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 + -