利用 LM1881 芯片采集视频数据

原理图:

利用 LM1881 芯片采集视频数据_第1张图片

源程序:

  1. #define VIDEO ATD0DR0L  // 经过 AD 转换的视频信号
  2. #define LINELENG 40 // 每行采样点数
  3. #define ROWLENG 10  // 总共采集行数
  4. #define ROWSTART 40 // 每场开始行
  5. #define INTERVAL 20 // 采集间距
  6. //
  7. // 图像采集
  8. //
  9. static unsigned char VsGetflag;                     // 采集状态
  10. static unsigned char Buffer[LINELENG + 2];          // 行缓存数组
  11. static unsigned char ImageData[ROWLENG][LINELENG];  // 图像数组  
  12. static unsigned int HsCnt;                          // 行同步计数
  13. static unsigned int RowImgCnt;                      // 行图像计数
  14. static unsigned char line;
  15. static unsigned char linestore;
  16. //
  17. // 初始化场同步中断,PT7 接 LM1881 场同步信号
  18. //
  19. void ISR_VsInit()
  20. {
  21.   TSCR1 |= 0x80;  // 使能定时器
  22.   TSCR2 = 0x07;   // 定时器自由运行,128分频,不允许溢出中断
  23.   TIE_C7I = 1;    // 允许通道7中断
  24.   TIOS &= 0x7f;   // 设置通道7输入捕捉
  25.   TCTL1 &= 0x3f;  // 定时器7与输出断开
  26.   TCTL3 &= 0x3f;  // 定时器7捕捉上升沿
  27.   TCTL3 |= 0x40;
  28.   TFLG1_C7F = 1;  // 清除场同步中断标志
  29.   DLYCT = 0x01;   // 延时时间选择
  30. }
  31. //
  32. // 禁止场中断
  33. //
  34. void ISR_VsDis()
  35. {
  36.   TIE_C7I = 0;
  37. }
  38. //
  39. // 初始化行同步中断,PT3 接 LM1881 行同步信号
  40. //
  41. void ISR_HsInit()
  42. {
  43.   TSCR1 |= 0x80;  // 使能定时器
  44.   TSCR2 = 0x07;   // 定时器自由运行,128分频,不允许溢出中断
  45.   TIE_C3I = 1;    // 允许通道3中断
  46.   TIOS &= 0xfb;   // 设置通道3输入捕捉
  47.   TCTL2 &= 0x3f;  // 定时器3与输出断开
  48.   TCTL4 &= 0x3f;  // 定时器3捕捉上升沿
  49.   TCTL4 |= 0x40;
  50.   TFLG1_C3F = 1;  // 清除行同步中断标志
  51.   DLYCT = 0x01;   // 延时时间选择
  52. }
  53. //
  54. // 禁止行中断
  55. //
  56. void ISR_HsDis()
  57. {
  58.   TIE_C3I = 0;
  59. }
  60. //
  61. // AD 初始化,选用AD0
  62. //
  63. void ADInit()
  64. {
  65.   ATD0CTL2=0xC0;    //启动AD0 1100
  66.   ATD0CTL3=0x08;    //转换序列长度为1
  67.   ATD0CTL4=0x81;    //时钟采样时间 ATDCLOCK=BUS/2*(PRS+1) 采集模量8位2进制 总分频为4
  68.   ATD0CTL5=0xA0;    //选择通道
  69.   ATD0DIEN=0x00;    //数字信号输入使能
  70. }
  71. //
  72. // 获取图像
  73. //
  74. void GetImage()
  75. {
  76.   // 将场采集标志置 0
  77.   VsGetflag = 0;
  78.   // 打开场中断
  79.   ISR_VsInit();
  80.   // 等待一场采集完毕
  81.   while(0 == VsGetflag); 
  82. }
  83. void main() 
  84. {
  85.   EnableInterrupts;
  86.   for(;;) 
  87.   {
  88.     GetImage(); 
  89.   }    
  90. }
  91. #pragma CODE_SEG __NEAR_SEG NON_BANKED
  92. //
  93. // 行中断处理程序
  94. //
  95. void interrupt 11 IC3_ISR()
  96. {
  97.   // 清除行同步中断标志位
  98.   TFLG1_C3F = 1;
  99.   // 行中断计数器 +1
  100.   HsCnt++;
  101.   // 到达开始采集行开始采集,每隔 INTERVAL 采集一次
  102.   if((HsCnt >= ROWSTART) && (HsCnt % INTERVAL == 0) && (RowImgCnt < ROWLENG))
  103.   {
  104.     // 初始化 AD
  105.     ADInit();
  106.     // 将每行指定数量的数据暂存
  107.     for(line = 0; line < LINELENG + 2; line++)
  108.     {
  109.       while(!ATD0STAT1_CCF0);
  110.       Buffer[line] = VIDEO;
  111.     }
  112.     // 中止 AD 转换
  113.     ATD0CTL2 = 0x00;
  114.     // 行采集计数 +1
  115.     RowImgCnt++;
  116.     // 将行数据存入场图像数组
  117.     for(linestore = 0; linestore < LINELENG; linestore++)
  118.     {
  119.       ImageData[RowImgCnt - 1][linestore] = Buffer[linestore + 2];
  120.     }
  121.   }
  122.   // 判断是否采集完毕
  123.   if(RowImgCnt >= ROWLENG)
  124.   {
  125.     // 禁止行中断
  126.     ISR_HsDis();
  127.     // 一场采集完毕,将标志位置 1
  128.     VsGetflag = 1;
  129.   }
  130. }
  131. //
  132. // 场中断处理程序
  133. //
  134. void interrupt 15 IC7_ISR()
  135. {
  136.   // 清楚场同步中断标志位
  137.   TFLG1_C7F = 1; 
  138.   // 初始化行同步中断计数器
  139.   HsCnt = 0;
  140.   // 初始化行图像计数器
  141.   RowImgCnt = 0;
  142.   // 禁止场中断
  143.   ISR_VsDis();  
  144.   // 打开行中断
  145.   ISR_HsInit(); 
  146. }
  147. #pragma CODE_SEG DEFAULT

你可能感兴趣的:(c,video,buffer)