智能车制作
标题:
摄像头采集程序
[打印本页]
作者:
power
时间:
2012-5-12 12:03
标题:
摄像头采集程序
最终还是没能赶上校内赛,虽然是很伤心,在这里只想现在的,以后的孩子不要再话那么多的时间在图像采集方面,可以放多点时间在数据处理方面,以免重蹈我们的悲剧,现在上传上位机程序,如果你喜欢,可以买个20块的上位机(淘宝有),这样就可以看到图像。(PS:绝对没有帮他们卖广告的嫌疑,只是想同学们可以早点搞好图像。)
//T0接受行中断,上升沿触发,T1接受场中断,下降沿触发
//数据口为PA0-PA7
//波特率为115200
//串口分别接单片机S0 S1
//图像大小选择 60*30
//设置帧头帧尾为0x01
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define uint unsigned int
#define uchar unsigned char
uchar hang_count;
#define hangshu 30
#define lieshu 100
#define Mid 1365
#define THRESHOLD 0x70
unsigned char Dianji_data;
unsigned int Duoji_data;
unsigned int zuo_danxian=1,you_danxian=1;
uint hang,lie,center[hangshu],left[hangshu],right[hangshu],image_center[];
uchar row,line1,line2;
uint steer;
uchar shuzu[hangshu][lieshu];
uint hang_table[]={65,69,74,79,83,86,93,100,
107,114,121,128,135,142,145,149,152,156,160,163,166,
169,173,176,180,183,187,190,193,197,};
byte count,second;
void Delay(int De_a)
{
int De_b;
for(De_b=0;De_b<De_a;De_b++)
{
_asm(nop);
// _asm(nop);
}
}
/***********************************************************************/
void crg_init(void)
{
CLKSEL=0x00; // 脱离锁相环
PLLCTL_PLLON=1; // 打开锁相环
SYNR=0XC0 | 0X09; // SYNR =3,REFDV=1
REFDV=0X80 | 0X01; // pllclock=2*16*(1+SYNR)/(1+REFDV)=96MHz;
POSTDIV=0X00; // 锁相环时钟为96MHz
_asm(nop);
_asm(nop);
while(0==CRGFLG_LOCK); // 锁相环锁定
CLKSEL_PLLSEL=1;
}
void PWM_Init(void)
{
PWME=0X00; //禁止通道
PWMPRCLK=0X33; //A=B=80/8=10MHZ
PWMSCLA=5; //SA=A/2/5=1MHZ
PWMSCLB=5; //SB=B/2/5=1MHZ
/*PWM 0,1级联初始化*/
PWMCTL_CON01=1; //0,1级联,寄存器为通道1的
PWMCLK_PCLK1=1; //选时钟SB
PWMPOL_PPOL1=1; //初始电平为高
PWMCAE_CAE1=0; //左对齐方式
PWMCNT01=0; //计数器清零
PWMPER01=20000; //输出周期=SB/10000=100HZ
PWMDTY01=1580; //舵机静止占空比为7.5%=1500/20000
PWME_PWME1=1; //使能
PWMCTL_CON23=1;
PWMCLK_PCLK3=0;
PWMPOL_PPOL3=1;
PWMCAE_CAE3=0;
PWMCNT23=0;
PWMPER23=600;
PWMDTY23=0;
PWME_PWME3=1;
PWMCTL_CON45=1;
PWMCLK_PCLK5=0;
PWMPOL_PPOL5=1;
PWMCAE_CAE5=0;
PWMCNT45=0;
PWMPER45=0;
PWMDTY45=500;
PWME_PWME5=1;
}
/*舵机控制*/
void PWMDuo_Dutycycle(int a)
{
PWMDTY01=a;
}
void PWMDian_Dutycycle(int b)
{
PWMDTY45=b;
}
/******************************************************************
- 功能描述:T0接受行中断,上升沿触发,T1接受场中断,下降沿触发,T7计数
- 参数说明:
- 返回说明:
- 修改记录:
- 注意事项:总线时钟为40M时,该程序适用。
******************************************************************/
void ect_init()
{
TIOS=0x00; //T0、T1设置为输入捕捉,摄像头行场中断---关输出比较通道7
TCTL4=0x09; //通道0为上升沿捕捉,1为下降沿捕捉
TIE=0x03; //开场中断,行中断
TSCR1=0x80; //定时器正常工作
TSCR2=0x00; //最后三位为预分频因子选择位
TFLG1=0xFF; //清除该位
TFLG2=0x80; //清除 TOF
}
/********************************************************************************************/
// IO初始化子函数
/********************************************************************************************/
void IO_init(void)
{ // IO初始化函数
DDRA = 0X00;
}
void photo()
{
unsigned char i,j;
for(i=0;i<=29;i++)
for(j=0;j<=65;j++)
{
if(shuzu
[j]<=60)
shuzu
[j]=1;
else
shuzu
[j]=0;
}
}
/******************************************************************
- 功能描述:8位数据位,无奇偶校验,115200波特率,发送器和接收器都使能
- 参数说明:
- 返回说明:
- 修改记录:
- 注意事项:48M总线时钟下适用
******************************************************************/
void Init_SCI(void)
{
SCI0CR1 = 0x00; // 8位数据位,无奇偶校验
SCI0CR2 = 0x2c; //允许接收和发送数据,允许接收中断功能
SCI0BD = 0x2B; // 115200波特率
}
/******************************************************************
- 功能描述:SCI发送一个字节数据
- 参数说明:
- 返回说明:
- 修改记录:
- 注意事项:
******************************************************************/
void SCI_Send_Byte(unsigned char data)
{
while (!SCI0SR1_TDRE); // 等待发送数据寄存器中的值->发送移位寄存器中
while (!SCI0SR1_TC); // 等待发送移位寄存器中的数值发送完成
SCI0DRL = data;
}
/******************************************************************
- 功能描述:SCI发送一个字符串
- 参数说明:
- 返回说明:
- 修改记录:
- 注意事项:
******************************************************************/
void SCI_Send_Uchar_String(unsigned char *putchar, uint num)
{
uint counter = 0;
while ((counter++) < num) // 判断字符串是否发送完毕
{
SCI_Send_Byte(*(putchar++));
}
}
void SCI_Send_Image_String(unsigned char *putchar, uint num)
{
uint counter = 0;
for(counter=0;counter<num;counter++)
{
if(putchar[counter]==0x01) putchar[counter]=0x02;
SCI_Send_Byte(putchar[counter]);
}
}
void main(void) {
/* put your own code here */
/* uchar x,data; */
crg_init();
ect_init();
IO_init() ;
Init_SCI();
PWM_Init();
EnableInterrupts;
for(;;) {
_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
/*********************************************
功能描述:行中断服务程序,接PT0
参数说明:
返回说明:
修改记录:
注意事项:
*********************************************/
#pragma CODE_SEG NON_BANKED
void interrupt 8 Port0_Interrupt()
{
int i=0,j=0;
unsigned char *p;
TFLG1=0x01;
hang++; //行计数器加 1
if ((hang<30)||(hang>240))
{
return;//判断是否从新的一场开始
}
if(hang==hang_table[hang_count])//行数组采样变量
{
Delay(1);
p=&shuzu[hang_count][0];
shuzu[hang_count][0]=PORTA;_asm();shuzu[hang_count][1]=PORTA;_asm();shuzu[hang_count][2]=PORTA;_asm();shuzu[hang_count][3]=PORTA;_asm();shuzu[hang_count][4]=PORTA;_asm();
shuzu[hang_count][5]=PORTA;_asm();shuzu[hang_count][6]=PORTA;_asm();shuzu[hang_count][7]=PORTA;_asm();shuzu[hang_count][8]=PORTA;_asm();shuzu[hang_count][9]=PORTA;_asm();
shuzu[hang_count][10]=PORTA;_asm();shuzu[hang_count][11]=PORTA;_asm();shuzu[hang_count][12]=PORTA;_asm();shuzu[hang_count][13]=PORTA;_asm();shuzu[hang_count][14]=PORTA;_asm();
shuzu[hang_count][15]=PORTA;_asm();shuzu[hang_count][16]=PORTA;_asm();shuzu[hang_count][17]=PORTA;_asm();shuzu[hang_count][18]=PORTA;_asm();shuzu[hang_count][19]=PORTA;_asm();
shuzu[hang_count][20]=PORTA;_asm();shuzu[hang_count][21]=PORTA;_asm();shuzu[hang_count][22]=PORTA;_asm();shuzu[hang_count][23]=PORTA;_asm();shuzu[hang_count][24]=PORTA;_asm();
shuzu[hang_count][25]=PORTA;_asm();shuzu[hang_count][26]=PORTA;_asm();shuzu[hang_count][27]=PORTA;_asm();shuzu[hang_count][28]=PORTA;_asm();shuzu[hang_count][29]=PORTA;_asm();
shuzu[hang_count][30]=PORTA;_asm();shuzu[hang_count][31]=PORTA;_asm();shuzu[hang_count][32]=PORTA;_asm();shuzu[hang_count][33]=PORTA;_asm();shuzu[hang_count][34]=PORTA;_asm();
shuzu[hang_count][35]=PORTA;_asm();shuzu[hang_count][36]=PORTA;_asm();shuzu[hang_count][37]=PORTA;_asm();shuzu[hang_count][38]=PORTA;_asm();shuzu[hang_count][39]=PORTA;_asm();
shuzu[hang_count][40]=PORTA;_asm();shuzu[hang_count][41]=PORTA;_asm();shuzu[hang_count][42]=PORTA;_asm();shuzu[hang_count][43]=PORTA;_asm();shuzu[hang_count][44]=PORTA;_asm();
shuzu[hang_count][45]=PORTA;_asm();shuzu[hang_count][46]=PORTA;_asm();shuzu[hang_count][47]=PORTA;_asm();shuzu[hang_count][48]=PORTA;_asm();shuzu[hang_count][49]=PORTA;_asm();
shuzu[hang_count][50]=PORTA;_asm();shuzu[hang_count][51]=PORTA;_asm();shuzu[hang_count][52]=PORTA;_asm();shuzu[hang_count][53]=PORTA;_asm();shuzu[hang_count][54]=PORTA;_asm();
shuzu[hang_count][55]=PORTA;_asm();shuzu[hang_count][56]=PORTA;_asm();shuzu[hang_count][57]=PORTA;_asm();shuzu[hang_count][58]=PORTA;_asm();shuzu[hang_count][59]=PORTA;_asm();
shuzu[hang_count][60]=PORTA;_asm();shuzu[hang_count][61]=PORTA;_asm();shuzu[hang_count][62]=PORTA;_asm();shuzu[hang_count][63]=PORTA;_asm();shuzu[hang_count][64]=PORTA;_asm();
shuzu[hang_count][65]=PORTA;_asm();shuzu[hang_count][66]=PORTA;_asm();shuzu[hang_count][67]=PORTA;_asm();shuzu[hang_count][68]=PORTA;_asm();shuzu[hang_count][69]=PORTA;_asm();
shuzu[hang_count][70]=PORTA;_asm();shuzu[hang_count][71]=PORTA;_asm();shuzu[hang_count][72]=PORTA;_asm();shuzu[hang_count][73]=PORTA;_asm();shuzu[hang_count][74]=PORTA;_asm();
shuzu[hang_count][75]=PORTA;_asm();shuzu[hang_count][76]=PORTA;_asm();shuzu[hang_count][77]=PORTA;_asm();shuzu[hang_count][78]=PORTA;_asm();shuzu[hang_count][79]=PORTA;_asm();
shuzu[hang_count][80]=PORTA;_asm();shuzu[hang_count][81]=PORTA;_asm();shuzu[hang_count][82]=PORTA;_asm();shuzu[hang_count][83]=PORTA;_asm();shuzu[hang_count][84]=PORTA;_asm();
shuzu[hang_count][85]=PORTA;_asm();shuzu[hang_count][86]=PORTA;_asm();shuzu[hang_count][87]=PORTA;_asm();shuzu[hang_count][88]=PORTA;_asm();shuzu[hang_count][89]=PORTA;_asm();
shuzu[hang_count][90]=PORTA;_asm();shuzu[hang_count][91]=PORTA;_asm();shuzu[hang_count][92]=PORTA;_asm();shuzu[hang_count][93]=PORTA;_asm();shuzu[hang_count][94]=PORTA;_asm();
shuzu[hang_count][95]=PORTA;_asm();shuzu[hang_count][96]=PORTA;_asm();shuzu[hang_count][97]=PORTA;_asm();shuzu[hang_count][98]=PORTA;_asm();shuzu[hang_count][99]=PORTA;_asm();
for(j=0;j<100;j++,p++)
{
*p=shuzu[hang_count][j];
}
hang_count++;
}
if(hang_count==hangshu)
{
TIE=0x00; //关行中断,场中断
SCI_Send_Byte(0x01);
SCI_Send_Image_String(&shuzu[0][0],hangshu*lieshu);
SCI_Send_Byte(0x01);
TIE=0x02; //开场中断
return;
}
}
/*********************************************
功能描述:场中断服务程序,接PT1
参数说明:
返回说明:
修改记录:
注意事项:
*********************************************/
#pragma CODE_SEG NON_BANKED
interrupt 9 void PT1_Interrupt(void)
{
TFLG1=0x03; //清场中断,行中断
TIE=0x03; //开场中断,关行中断
hang=0;
lie=0;
hang_count=0;
}
作者:
寒路独行、
时间:
2012-5-12 16:01
顶一下!还纠结与图像采集中。。。
作者:
vgjkl
时间:
2012-5-12 17:32
谢谢分享!
作者:
从不耘败
时间:
2012-5-12 18:29
校内赛这么早啊!
作者:
knight9874@163.
时间:
2012-5-13 20:16
顶一个
作者:
90后
时间:
2012-5-13 21:22
楼主怎么有四个错误呢??????能说一下是哪四个错误吗?小弟将非常感激!!!!
作者:
gggfff
时间:
2012-5-15 19:42
我也发现了,应该是数组没定义吧,
作者:
dongpinbo
时间:
2012-5-16 11:07
要是有图像处理就好了,给个思想也好呀?先谢过楼主了
作者:
power
时间:
2012-5-17 15:52
90后 发表于 2012-5-13 21:22
楼主怎么有四个错误呢??????能说一下是哪四个错误吗?小弟将非常感激!!!!
但是我编译出来都没有错误喔
作者:
潞箬
时间:
2012-5-18 15:30
我和你的步骤差不多,我的程序就是在中断部分有问题,一直在场中断里循环,跳不出,貌似也没执行行中断,求楼主指导指导,万分感谢
我那个TIE也设定了,我用的T1,和T2,场中断执行后,设定TIE=0X02,关闭场中断,开启行中断,可就是跳不进,路过的都来指导指导
作者:
拨云见日
时间:
2012-5-18 16:12
请问楼主这个程序能实现哪些功能呢?
作者:
人生若只如初
时间:
2012-5-18 22:45
请问那个行同步脉冲和场同步脉冲随便接PT0,PT1,PT2吗?有什么规则呢,在程序里没看到有定义这两个接口呀
作者:
hwh123
时间:
2012-5-18 23:21
谢楼主!
作者:
新人类
时间:
2012-5-20 13:00
问楼主一下。。。。这样采集的话噪点多么?怎么处理减少噪点。。。。
作者:
knight9874@163.
时间:
2012-5-20 19:06
楼主用的是XS128吗
作者:
Honanking
时间:
2012-5-22 16:43
楼主不地道,程序有拼凑之嫌啊!
作者:
LI912683617
时间:
2012-7-3 09:12
谢谢分享!
作者:
LI912683617
时间:
2012-7-3 09:18
不好使 啊。。。
作者:
LI912683617
时间:
2012-7-3 09:19
楼主回帖啊 怎么用不了啊
作者:
夜影
时间:
2012-7-31 17:16
作者:
1434636181
时间:
2012-8-15 22:20
谢谢楼主
作者:
~ら悠^ǒ^然
时间:
2012-8-18 16:41
高手啊!
作者:
zcc1992
时间:
2012-10-28 15:45
新手,不懂啊
作者:
开心果219407
时间:
2012-11-6 14:36
谢楼主分享
作者:
玻璃中的太阳
时间:
2012-11-6 17:10
还没开始。
作者:
1434636181
时间:
2012-11-14 22:41
shuzu[hang_count][0]=PORTA;_asm();
为什么后面加一个延时啊?
作者:
总是忘记账号
时间:
2012-11-15 20:16
学习一下啊
作者:
§;τ︷疯_zI
时间:
2012-11-16 16:18
请问那个程序是用于上位机和摄像头的吗,是不是摄像头采集图像的程序?如果不加上串口传送部分的程序,剩下的是不是就是摄像头的采集程序?可能有点啰嗦,但希望您能回复,谢谢!
作者:
客流量
时间:
2012-11-17 16:05
顶一下
作者:
有明吗
时间:
2012-11-19 23:08
谢谢分享
作者:
sunnyrain
时间:
2012-11-29 22:08
先留下备用,谢过楼主!
作者:
摄像头。。。
时间:
2013-2-11 16:17
SYNR=0XC0 | 0X09; // SYNR =3,REFDV=1
REFDV=0X80 | 0X01; // pllclock=2*16*(1+SYNR)/(1+REFDV)=96MHz;
我想问一下楼主这个是什么意思啊
作者:
xiaopihai1213
时间:
2013-2-16 22:16
作者:
hj911024
时间:
2013-2-20 10:33
好东西,谢谢楼主
作者:
房楠楠24
时间:
2013-3-11 00:10
作者:
百川汇流
时间:
2013-3-12 05:59
好东西
作者:
q378759521
时间:
2013-3-25 21:10
作者:
飞尘
时间:
2013-3-25 22:02
表示什么都还没有
作者:
Neozoic
时间:
2013-4-4 22:09
谢谢哈!
作者:
一个好青年
时间:
2013-4-27 23:32
作者:
想恋爱。。。
时间:
2013-4-28 13:12
好。。。。。。。。。。。。。。。。。。。。
作者:
lf1286
时间:
2013-4-29 16:25
楼主没说清楚就闪了。
作者:
漫长岁月
时间:
2016-4-22 18:48
复制链接然后在网页打开就可以了吗
作者:
yuanxu95
时间:
2016-4-23 08:55
感谢楼主分享
作者:
夜微冷
时间:
2016-5-15 18:28
而我份儿
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2