中级会员
- 积分
- 204
- 威望
- 102
- 贡献
- 62
- 兑换币
- 63
- 注册时间
- 2015-4-23
- 在线时间
- 20 小时
- 毕业学校
- 2132
|
代码如下
#include <hidef.h>
#include "derivative.h"
#include <mc9s12xs128.h>
#define ROW 40 //数字摄像头所采集的二维数组行数
#define COLUMN 120 //数字摄像头所采集的二维数组列数
#define ROW_START 10 //数字摄像头二维数组行开始行值
#define ROW_MAX 200 //数字摄像头所采集的二维数组行最大值
#define THRESHOLD 0x68 //图像阈值,根据所采集图像亮度值大小的实际情况调整(OV7620所采集的亮度值大小为0--255)
unsigned char Buffer[ROW][COLUMN]={0}; //所采集的图像二维数组
unsigned char Image_Center[ROW]={0}; //所采集的图像中心线
unsigned char SampleFlag=0; //奇偶场标记
unsigned int m=0; //换行变量
unsigned int Line; //行中断计数变量
unsigned int hang;
unsigned int Get_Image[]={
17,19,21,23,25,28,31,34,37,40,43,46,49,53,57,
61,65,69,73,77,81,85,89,94,99,105,111,117,123,
129,135,141,147,153,159,166,173,180,187
}; //定每场采哪几行。
/*************************************************************/
/* 初始化PLL函数 */
/*************************************************************/
void PLL_Init(void) {
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR =0xc0 | 0x09;
REFDV=0x80 | 0x01;
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
_asm(nop); //BUS CLOCK=80M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
/*************************************************************/
/* 行场中断初始化函数 */
/*************************************************************/
void TIM_Init(void)
{
TIOS=0x00; //外部输入捕捉0,1通道
TCTL4=0x09; //通道0 上升沿触发,通道1下降沿触发
TSCR1=0x80; //使能
TIE=0x03; //通道 0,1 中断使能
TFLG1=0xFF; //清中断标志位
}
/*************************************************************/
/* IO口初始化函数 */
/*************************************************************/
void IO_Init(void)
{
DDRA=0X00; //端口A配置成输入
}
/*************************************************************/
/* 延时函数 */
/*************************************************************/
void delays(long m){
while(m--);
}
/*************************************************************/
/* 串口0初始化函数 */
/*************************************************************/
void SCI_Init()
{
SCI0BD=44; //115200bps Baud Rate=BusClock/(16*SCIBD)
//SCI0BD=261; //19200bps Baud Rate=BusClock/(16*SCIBD)
//SCI0BD=521;
SCI0CR1=0; //正常8 位模式,无奇偶校验
SCI0CR2=0X2C; //发送允许 接受中断允许
}
/*************************************************************/
/* 串口0发送函数 */
/*************************************************************/
void SCI_Write(unsigned char SendChar)
{
while (!(SCI0SR1&0x80));
SCI0DRH=0;
SCI0DRL=SendChar;
}
/*************************************************************/
/* 向电脑串口发送所采集的图像 */
/*************************************************************/
void Process()
{
unsigned char i,j;
for(i=0;i<ROW;i++)
{
for(j=0;j<COLUMN;j++)
{
if(Buffer[i][j] == 0xFF)
SCI_Write(0xFE) ;
else
SCI_Write(Buffer[i][j]) ;
}
//SCI_Write(0x0D);
//SCI_Write(0X0A);
}
SCI_Write(0xFF);
}
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void)
{
/* put your own code here */
PLL_Init(); //初始化锁相环
TIM_Init(); //初始化中断
IO_Init(); //初始化IO口
SCI_Init(); //初始化串口
EnableInterrupts;
for(;;)
{
Process(); //向电脑串口发送所采集的图像
}
// _FEED_COP(); /* feeds the dog */
/* loop forever */
/* please make sure that you never leave main */
}
/*************************************************************/
/* 行中断处理函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 8 PT0_Interrupt(){
TFLG1_C0F=1; //行中断标志位清除,以便于下次行中断进行
Line++; //行中断计数变量
if ( SampleFlag == 0 || Line<ROW_START || Line>ROW_MAX ){
return; //不是要采集图像的有效行,返回
}
if( Line==Get_Image[hang]){
delays(8);//如果图像不在中间请修改这里
Buffer[m][0]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][1]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][2]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][3]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][4]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][5]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][6]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][7]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][8]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][9]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][10]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][11]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][12]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][13]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][14]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][15]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][16]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][17]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][18]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][19]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][20]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][21]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][22]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][23]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][24]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][25]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][26]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][27]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][28]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][29]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][30]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][31]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][32]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][33]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][34]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][35]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][36]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][37]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][38]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][39]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][40]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][41]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][42]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][43]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][44]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][45]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][46]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][47]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][48]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][49]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][50]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][51]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][52]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][53]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][54]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][55]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][56]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][57]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][58]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][59]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][60]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][61]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][62]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][63]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][64]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][65]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][66]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][67]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][68]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][69]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][70]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][71]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][72]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][73]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][74]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][75]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][76]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][77]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][78]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][79]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][80]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][81]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][82]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][83]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][84]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][85]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][86]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][87]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][88]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][89]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][90]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][91]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][92]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][93]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][94]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][95]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][96]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][97]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][98]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][99]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][100]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][101]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][102]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][103]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][104]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][105]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][106]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][107]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][108]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][109]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][110]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][111]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][112]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][113]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][114]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][115]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][116]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][117]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][118]=PORTA>THRESHOLD?254:0;_asm();Buffer[m][119]=PORTA>THRESHOLD?254:0;_asm();
Buffer[m][120]=PORTA>THRESHOLD?254:0;
hang++;
m++;
}
}
/*************************************************************/
/* 场中断处理函数 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 PT1_Interrupt()
{
TFLG1_C1F=1; //场中断清楚,以便于下次的场中断的正常进行
TFLG1_C0F=1; //行中断清除,以便于开始采集图像数据
m=0; //行中间变量清零,以便于开始从把采集的图像放到数组的第一行
Line=0; //行中断临时变量清零
hang=0; //行临时变量清除
SampleFlag=~SampleFlag; //场中断标记取反,这样只采集奇数场的图像
}
|
|