#include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ #include"mc9s12g128.h" #include"INIT.h" #define ROW 40 //数字摄像头所采集的二维数组行数 #define COLUMN 120 //数字摄像头所采集的二维数组列数 #define ROW_START 17 //数字摄像头二维数组行开始行值 #define ROW_MAX 200 //数字摄像头所采集的二维数组行最大值 #define THRESHOLD 0x20 unsigned char SampleFlag=0; //奇偶场标记 unsigned int Line; //行中断计数变量 unsigned int hang; unsigned int m=0; //换行变量 unsigned char Buffer[ROW][COLUMN]={0}; //所采集的图像二维数组 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 }; //定每场采哪几行。 //////-------------延时函数------------------------------------------------ void delays(long m){ while(m--); } void delay1ms(unsigned z) { static int x,y; for(x=z; x>0;x--) for(y=8010;y>0; y--); } void delay1us(unsigned z) { static int x,y; for(x=z; x>0; x--) for(y=8; y>0; y--); } //------------------------------------------------------------------------- void SCI0_Tranmit(void) { byte i, temp; temp = SCI0SR1; SCI0DRH = 0; //清零 for(i=0; i<COLUMN; i++) { if(Buffer[m]>0x20 && Buffer[m][i+1]>0x20 && Buffer[m][i-1]>0x20) // SCI_Tx(255); SCI_Tx('0'); else SCI_Tx('1'); //黑线 // SCI_Tx(0x31); } SCI_Tx(0x0D); //回车符 SCI_Tx(0X0A);//换行符 } void main(void) { GPIO_Init(); SetBusCLK_nM(48); IOC_Init(); SCI_Init(); EnableInterrupts; for(;;) { // SCI0_Tranmit(); _FEED_COP(); } } /*************************************************************/ /* 行中断处理函数 */ /*************************************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 8 PT0_Interrupt(){ unsigned char i = 0; TFLG1_C0F=1; //行中断标志位清除,以便于下次行中断进行 Line++; //行中断计数变量 if ( SampleFlag == 0 || Line<ROW_START || Line>ROW_MAX ) { return; //不是要采集图像的有效行,返回 } if( Line == Get_Image[hang]) { delays(1);//通常行消隐在每一场的钱4.2us内 for(i=0; i<120; i++) { Buffer[m]=PORTA;_asm(); } SCI0_Tranmit(); 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; //场中断标记取反,这样只采集奇数场的图像 } |
欢迎光临 智能车制作 (http://dns.znczz.com/) | Powered by Discuz! X3.2 |