⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cam.lst

📁 基于单片机的串口摄像头模块的读写C语言源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V8.16   CAM                                                                   05/23/2009 21:20:21 PAGE 1   


C51 COMPILER V8.16, COMPILATION OF MODULE CAM
OBJECT MODULE PLACED IN CAM.obj
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE SRC\CAM.c BROWSE DEBUG OBJECTEXTEND CODE PRINT(.\CAM.lst) OBJ
                    -ECT(CAM.obj)

line level    source

   1          #include <SST89x5xxRD2.h>
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          #define Width 10         //图像的宽80(8*10)个像素
   5          #define Height 32        //图像的高
   6          uchar lcd_x;//lcd的x坐标
   7          uchar lcd_y;//lcd的y坐标
   8          
   9          sbit cs=P3^3;   //定义LCD的D/#C控制口
  10          sbit std=P3^5;  //定义LCD的串行数据端口
  11          sbit sclk=P3^7; //定义LCD的串行时钟端口                   
  12          sbit rst=P3^6;                  
  13          sbit key=P2^0;
  14          
  15          uchar code SYNC_ID[]=           {0xaa,0x0d,0x00,0x00,0x00,0x00}; 
  16          uchar code INITAL_ID[]=         {0xaa,0x01,0x00,0x01,0x01,0x01};        //2位灰度图160*120,4800B
  17          uchar code BAUDRATE_ID[]=       {0xaa,0x07,0xbf,0x01,0x00,0x00};        //baudrate=9600
  18          uchar code SNAPSHOT_ID[]=       {0xaa,0x05,0x01,0x00,0x00,0x00};
  19          uchar code GETPICTURE_ID[]=     {0xaa,0x04,0x01,0x00,0x00,0x00};
  20          uchar code RESET1_ID[]=         {0xaa,0x08,0x01,0x00,0x00,0x00};//状态寄存器复位
  21          uchar code RESET2_ID[]=         {0xaa,0x08,0x00,0x00,0x00,0x00};//完全复位
  22          uchar code SLEEP_ID[]=          {0xaa,0x09,0x00,0x00,0x00,0x00};
  23          uchar code ACK1_ID[]=           {0xaa,0x0e,0x0d,0x00,0x00,0x00};
  24          uchar code ACK2_ID[]=           {0xaa,0x0e,0x0a,0x00,0x00,0x00};
  25          
  26          //定义两个队列用来缓存图片数据
  27          uchar xdata Picture_Dat1[256]; //内部扩展数据RAM(00H~2FFH)
  28          uchar xdata Picture_Dat2[256];
  29          uchar idata front=0,rear=0;//队列的队头指针和队尾指针
  30          bit bank;//bank=0指向Picture_Dat1,否则指向Picture_Dat2
  31          
  32          uint idata countr;//已接受的数据(byte)
  33          
  34          bit error;//传输出错
  35          
  36          void delay(uchar mm)
  37          {
  38   1              uchar idata i;
  39   1              for(i=0;i<mm;i++)
  40   1                      ;
  41   1      }
  42          
  43          void delay_1ms()
  44          {
  45   1              uchar idata i;
  46   1              for(i=0;i<255;i++)
  47   1                      ;
  48   1              for(i=0;i<42;i++)
  49   1                      ;
  50   1      }
  51          
  52          void delay_ms(uchar t)
  53          {
  54   1              uchar idata i;
C51 COMPILER V8.16   CAM                                                                   05/23/2009 21:20:21 PAGE 2   

  55   1              for(i=0;i<t;i++)
  56   1                      delay_1ms();
  57   1      }
  58          
  59          void wr_lcd (uchar dat_comm,uchar content)
  60          {
  61   1              uchar idata a,i,j;
  62   1              delay(50);
  63   1              a=content;
  64   1              cs=1;
  65   1              sclk=0;
  66   1              std=1;
  67   1              for(i=0;i<5;i++)
  68   1              {
  69   2                      sclk=1;
  70   2                      sclk=0;
  71   2              }
  72   1              std=0;
  73   1              sclk=1;
  74   1              sclk=0;
  75   1              if(dat_comm)
  76   1                      std=1;//data
  77   1              else
  78   1                      std=0;//command
  79   1              sclk=1;
  80   1              sclk=0;
  81   1              std=0;
  82   1              sclk=1;
  83   1              sclk=0;
  84   1              for(j=0;j<2;j++)
  85   1              {
  86   2                      for(i=0;i<4;i++)
  87   2                      {
  88   3                              a=a<<1;
  89   3                              std=CY;
  90   3                              sclk=1;
  91   3                              sclk=0;
  92   3                      }
  93   2                      std=0;
  94   2                      for(i=0;i<4;i++)
  95   2                      {
  96   3                              sclk=1;
  97   3                              sclk=0;
  98   3                      }
  99   2              }
 100   1      }
 101          
 102          void init_lcd (void)
 103          {
 104   1              rst=0;
 105   1              delay(100);
 106   1              rst=1;
 107   1              wr_lcd(0,0x30);  //30---基本指令动作   
 108   1              wr_lcd(0,0x01);  //清屏,地址指针指向00H
 109   1              delay(100);
 110   1              wr_lcd(0,0x06);  //光标的移动方向
 111   1              wr_lcd(0,0x0c);  //开显示,关游标
 112   1      }
 113          
 114          
 115          
 116          
C51 COMPILER V8.16   CAM                                                                   05/23/2009 21:20:21 PAGE 3   

 117          
 118          
 119          
 120          //1、换晶振,用22.1184M晶振,在TH1=0xff时,刚好可以产生115200波特率。
 121          
 122          //2、采用6个时钟周期的单片机(换单片机啊。。。)
 123          
 124          //3、增强型51单片机有定时器2!(幸好偶用的是增强型。。。)
 125          
 126          //就用第三种方法啦!这时的公式如下:
 127          
 128          //波特率=11059200/(32×[65536-(RCAP2H,RCAP2L)])
 129          
 130          //其中的RCAP2H,RCAP2L为自动重装值,由上式得:
 131          
 132          //RCAP2H,RCAP2L=65536-11059200/(32×波特率)
 133          
 134          void init_UART()
 135          {
 136   1              SCON=0x50; //串口工作方式1,8位UART,波特率可变  
 137   1          TH2=0xFF;           
 138   1          TL2=0xDC;   //波特率:9600 晶振=11.0592MHz 
 139   1          RCAP2H=0xFF;   
 140   1          RCAP2L=0xDC; //16位自动再装入值 
 141   1      //*****************
 142   1          TCLK=1;   
 143   1          RCLK=1;   
 144   1          C_T2=0;   
 145   1          EXEN2=0; //波特率发生器工作方式
 146   1      
 147   1      //*****************
 148   1              ES=0;//关闭串口中断
 149   1              EA=1;//开全局中断
 150   1          TR2=1 ; //定时器2开始
 151   1      }
 152          
 153          void Read_Picture() interrupt 4 using 1
 154          {
 155   1              uchar dat;
 156   1              if(RI)
 157   1              {
 158   2                      dat=SBUF;
 159   2                      RI=0;
 160   2                      if(front==rear+1)//队列已满
 161   2                      {
 162   3                              ES=0;
 163   3                              error=1;
 164   3                      }
 165   2                      if(bank)
 166   2                      {
 167   3                              Picture_Dat2[rear]=dat;
 168   3                              bank=!bank;
 169   3                              rear++;
 170   3                      }
 171   2                      else
 172   2                      {
 173   3                              Picture_Dat2[rear]=dat;
 174   3                              bank=!bank;
 175   3                              countr++;
 176   3                              countr++;
 177   3                      }                       
 178   2              }
C51 COMPILER V8.16   CAM                                                                   05/23/2009 21:20:21 PAGE 4   

 179   1      }
 180          
 181          void Send_Cmd(uchar *cmd)
 182          {
 183   1              uchar idata i;
 184   1              for(i=0;i<6;i++)
 185   1              {
 186   2                      SBUF=cmd[i];
 187   2                      while(TI==0)
 188   2                              ;
 189   2                      TI=0;
 190   2                      delay(1);
 191   2              }
 192   1      }
 193          
 194          void Wait_ACK(uchar *cmd)
 195          {
 196   1              uchar idata i;
 197   1              for(i=0;i<6;i++)
 198   1              {
 199   2                      while(RI==0)
 200   2                              ;
 201   2                      cmd[i]=SBUF;
 202   2                      RI=0;
 203   2              }
 204   1              //if(cmd[0]==0xAA&&cmd[1]>=0x01&&cmd[1]<=0x0F)
 205   1              //      return 1;
 206   1              //return 0;     
 207   1      }
 208          
 209          bit CAM_Cmd(uchar *cmd)
 210          {
 211   1              uchar idata temp_cmd[6]; 
 212   1              Send_Cmd(cmd);
 213   1              Wait_ACK(temp_cmd);
 214   1              if(temp_cmd[0]==0xAA&&temp_cmd[1]==0x0E&&temp_cmd[2]==cmd[1])
 215   1              {
 216   2                      delay_ms(50);
 217   2                      return 1;
 218   2              }
 219   1              return 0;
 220   1      }
 221          
 222          bit Send_SYNC_Cmd()
 223          {
 224   1              uchar idata OldTH2,OldTL2;//保存原先的波特率
 225   1              uchar idata cmd1[6];
 226   1              uchar idata cmd2[6];
 227   1              uchar idata i,j,k;
 228   1              //*****************
 229   1              //将波特率调整为115200
 230   1              TR2=0 ; //定时器2停止
 231   1              OldTH2=RCAP2H;
 232   1              OldTL2=RCAP2L;
 233   1              TH2=0xFF;           
 234   1          TL2=0xFD;   //波特率:115200 晶振=11.0592MHz 
 235   1          RCAP2H=0xFF;   
 236   1          RCAP2L=0xFD; //16位自动再装入值
 237   1              TR2=1 ; //定时器2开始
 238   1              //*****************
 239   1              for(i=0;i<60;i++)
 240   1              {
C51 COMPILER V8.16   CAM                                                                   05/23/2009 21:20:21 PAGE 5   

 241   2                      Send_Cmd(SYNC_ID);
 242   2                      for(j=0;j<255;j++)
 243   2                      {
 244   3                              for(k=0;k<255;k++)
 245   3                              {
 246   4                                      if(RI!=0)
 247   4                                      {
 248   5                                              Wait_ACK(cmd1);
 249   5                                              Wait_ACK(cmd2);
 250   5                                              break;
 251   5                                      }
 252   4                              }
 253   3                      }
 254   2                      if(j==255&&k==255)//350ms内没有获得应答
 255   2                              continue;
 256   2                      if(cmd1[0]!=0xAA||cmd1[1]!=0x0E||cmd1[2]!=0x0D)
 257   2                              continue;
 258   2                      if(cmd2[0]!=0xAA||cmd2[1]!=0x0D)
 259   2                              continue;
 260   2                      Send_Cmd(ACK1_ID);
 261   2                      delay_ms(50);
 262   2                      break;
 263   2              }
 264   1              if(i==60)
 265   1                      return 0;
 266   1      
 267   1              //将CAM的波特率设置为9600
 268   1              CAM_Cmd(BAUDRATE_ID);
 269   1      
 270   1              //*****************
 271   1              //恢复原先波特率9600
 272   1              TR2=0 ; //定时器2停止
 273   1              TH2=OldTH2;           
 274   1          TL2=OldTL2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -