高级会员
- 积分
- 590
- 威望
- 343
- 贡献
- 135
- 兑换币
- 205
- 注册时间
- 2015-10-12
- 在线时间
- 56 小时
|
15贡献
新手,最近用51做小车入手,由于没有上位机,自己又不会,只能通过串口显示二值化后的128位数值观察了,但是ccd好似没开始工作,我按那个时序图写的,ccd的启动程序如下:
/*ccd启动程序*/
void startccd()
{
unsigned char i;
SI=1;
Delay1us(1);
CLK=1;
Delay1us(1);
SI=0;
Delay1us(1);
CLK=0;
for(i=0;i<127;i++)
{
Delay1us(1);
Delay1us(1);
CLK=1;
Delay1us(1);
Delay1us(1);
CLK=0;
}
Delay1us(1);
Delay1us(1);
CLK=1;
Delay1us(1);
Delay1us(1);
CLK=0;
Delay1us(1);
Delay1us(1);
}
/*ccd采样程序*/
void ICapture(float *IData)
{
unsigned char i;
SI=1;
Delay1us(1);
CLK=1;
Delay1us(1);
SI=0;
Delay1us(1);
for(i=0;i<200;i++)
Delay1us(1);
*IData=AdChange();
IData++;
CLK=0;
for(i=0;i<127;i++)
{
Delay1us(1);
Delay1us(1);
CLK=1;
Delay1us(1);
Delay1us(1);
*IData=AdChange();
IData++;
CLK=0;
}
Delay1us(1);
Delay1us(1);
CLK=1;
Delay1us(1);
Delay1us(1);
CLK=0;
}
AdChange()程序如下:
unsigned int AD_finished=0,x;
float f;
unsigned char r,display[5]="bbbbb";
x=0;
r='0';
f=0.00;
ADC_CONTR = 0x40; //70时钟周期转换一次
ADC_CONTR |= 0x02; //选择 A/D 当前通道
_nop_();
_nop_();
ADC_CONTR|= 0x20; //180个周期转换一次
_nop_();
_nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源
_nop_();
_nop_();
_nop_();
_nop_(); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
while (AD_finished ==0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //关闭AD转换,ADC_FLAG清0
x=ADC_RES*4+ADC_RESL;
然后我通过lcd观察到x的值不会变,接上ccd就是900多,拔掉就是400多,ad精度是10位的,也就是说实际电压是4V多和2V多。
一直搞不明白,求大神指导。。。
|
|