智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 15324|回复: 44
打印 上一主题 下一主题

摄像头采集程序

  [复制链接]

3

主题

12

帖子

0

精华

高级会员

Rank: 4

积分
711
威望
370
贡献
95
兑换币
0
注册时间
2012-3-3
在线时间
174 小时
毕业学校
四中
跳转到指定楼层
1#
发表于 2012-5-12 12:03:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最终还是没能赶上校内赛,虽然是很伤心,在这里只想现在的,以后的孩子不要再话那么多的时间在图像采集方面,可以放多点时间在数据处理方面,以免重蹈我们的悲剧,现在上传上位机程序,如果你喜欢,可以买个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;
  
}

3

主题

104

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1514

优秀会员奖章活跃会员奖章

QQ
威望
776
贡献
514
兑换币
61
注册时间
2012-3-11
在线时间
112 小时
2#
发表于 2012-5-12 16:01:38 | 只看该作者
顶一下!还纠结与图像采集中。。。
回复 支持 反对

使用道具 举报

12

主题

1121

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3668

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

QQ
威望
1871
贡献
1107
兑换币
93
注册时间
2011-3-14
在线时间
345 小时
3#
发表于 2012-5-12 17:32:33 | 只看该作者
谢谢分享!
回复 支持 反对

使用道具 举报

7

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
480
威望
327
贡献
89
兑换币
2
注册时间
2012-4-4
在线时间
32 小时
毕业学校
山东大学威海分校
4#
发表于 2012-5-12 18:29:45 | 只看该作者
校内赛这么早啊!
回复 支持 反对

使用道具 举报

7

主题

59

帖子

0

精华

高级会员

Rank: 4

积分
575
威望
354
贡献
129
兑换币
16
注册时间
2012-3-29
在线时间
46 小时
毕业学校
青岛农业大学
5#
发表于 2012-5-13 20:16:55 | 只看该作者
顶一个
回复 支持 反对

使用道具 举报

7

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
威望
308
贡献
85
兑换币
8
注册时间
2012-3-17
在线时间
37 小时
毕业学校
重庆机电学院
6#
发表于 2012-5-13 21:22:34 | 只看该作者
楼主怎么有四个错误呢??????能说一下是哪四个错误吗?小弟将非常感激!!!!
回复 支持 反对

使用道具 举报

5

主题

94

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
威望
564
贡献
246
兑换币
7
注册时间
2012-2-28
在线时间
100 小时
7#
发表于 2012-5-15 19:42:02 | 只看该作者
我也发现了,应该是数组没定义吧,
回复 支持 反对

使用道具 举报

13

主题

225

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
12763

优秀会员奖章活跃会员奖章

威望
10450
贡献
2157
兑换币
24
注册时间
2012-3-6
在线时间
78 小时
8#
发表于 2012-5-16 11:07:17 | 只看该作者
要是有图像处理就好了,给个思想也好呀?先谢过楼主了
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

高级会员

Rank: 4

积分
711
威望
370
贡献
95
兑换币
0
注册时间
2012-3-3
在线时间
174 小时
毕业学校
四中
9#
 楼主| 发表于 2012-5-17 15:52:01 | 只看该作者
90后 发表于 2012-5-13 21:22
楼主怎么有四个错误呢??????能说一下是哪四个错误吗?小弟将非常感激!!!!

但是我编译出来都没有错误喔
回复 支持 反对

使用道具 举报

5

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
943
QQ
威望
528
贡献
215
兑换币
61
注册时间
2012-2-26
在线时间
100 小时
10#
发表于 2012-5-18 15:30:00 | 只看该作者
我和你的步骤差不多,我的程序就是在中断部分有问题,一直在场中断里循环,跳不出,貌似也没执行行中断,求楼主指导指导,万分感谢
我那个TIE也设定了,我用的T1,和T2,场中断执行后,设定TIE=0X02,关闭场中断,开启行中断,可就是跳不进,路过的都来指导指导
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 23:32 , Processed in 0.057272 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表