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

📄 main.c

📁 在MagicARM2200实验箱上实现的模拟温度报警实验。通过采集实验箱上W1的电压信号
💻 C
字号:
/****************************************************************************
* 文件名:I2CTEST.C
* 功能:使用硬件I2C对ZLG7290进行操作,利用中断方式操作。
* 说明:将跳线器JP5短接。
****************************************************************************/
#include  "config.h" 

#define   ZLG7290		0x70  /* 定义器件地址 */
#define   LED1      1<<16       // P2.16  
#define   LED2      1<<17		// P2.17  
#define   LED3	    1<<18		// P2.18  
#define   LED4	    1<<19		// P2.19  
#define   LED5	    1<<20       // P2.20  
#define   LED6	    1<<21		// P2.21 
#define   LED7	    1<<22		// P2.22 
#define   LED8	    1<<23		// P2.23 
#define   LEDCON	0x00ff0000
#define   DISP_TAB  0xffffffff

//#define   Glitter_COM 	0x70            


/****************************************************************************
* 名称:I2C_Init()
* 功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
* 入口参数:fi2c		初始化I2C总线速率,最大值为400K
* 出口参数:无
****************************************************************************/
void  I2C_Init(uint32 fi2c)
{  if(fi2c>400000) fi2c = 400000;

   PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效

   I2SCLH = (Fpclk/fi2c + 1) / 2;	// 设置I2C时钟为fi2c
   I2SCLL = (Fpclk/fi2c) / 2;
   I2CONCLR = 0x2C;
   I2CONSET = 0x40;					// 使能主I2C
   
   /* 设置I2C中断允许 */
   VICIntSelect = 0x00000000;		// 设置所有通道为IRQ中断
   VICVectCntl0 = 0x29;				// I2C通道分配到IRQ slot 0,即优先级最高
   VICVectAddr0 = (int)IRQ_I2C;	    // 设置I2C中断向量地址	
   VICIntEnable = 0x0200;           // 使能I2C中断 
}
	

/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<5000; i++);
}
	
		

/****************************************************************************
* 名称:main()
* 功能:对ZLG7290进行操作
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位);
*      在CONFIG.H文件中包含I2CINT.H、ZLG7290.H。
****************************************************************************/
int  main(void)
{  uint8  disp_buf[8];	
  // uint8  key;
   uint8  i;
   uint32  ADC_Data;
   
   PINSEL0 = 0x00000000;			// 设置管脚连接,使用I2C口
   PINSEL1 = 0x01400000;			// 设置P0.27、P0.28连接到AIN0、AIN1
   DelayNS(10);
   I2C_Init(30000);                 // I2C配置及端口初始化
   
   //while(1)
   //{
   /* 进行全闪测试 */
   for(i=0; i<2; i++) disp_buf[i] = 0xC8;
   ZLG7290_SendBuf(disp_buf,2);
   DelayNS(50);
   
    /* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */
    ADCR = (1 << 0)                     |		// SEL = 1 ,选择通道0
           ((Fpclk / 1000000 - 1) << 8) | 		// CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
           (0 << 16)                    |		// BURST = 0 ,软件控制转换操作
           (0 << 17)                    | 		// CLKS = 0 ,使用11clock转换
           (1 << 21)                    | 		// PDN = 1 , 正常工作模式(非掉电转换模式)
           (0 << 22)                    | 		// TEST1:0 = 00 ,正常工作模式(非测试模式)
           (1 << 24)                    | 		// START = 1 ,直接启动ADC转换
           (0 << 27);							// EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
    DelayNS(10);								
    ADC_Data = ADDR;							// 读取ADC结果,并清除DONE标志位
   
    /* PINSEL2使用启动代码的默认配置,切勿任意配置PINSEL2,否则总线会受到干扰 */ 
    IO2DIR = LEDCON;    	        // 配置LED控制I/O方向
    
    
   while(1)
   {
        ADCR = (ADCR&0x00FFFF00)|0x01|(1 << 24);	// 设置通道1,并进行第一次转换
        while( (ADDR&0x80000000)==0 );	            // 等待转换结束
        ADCR = ADCR | (1 << 24);					// 再次启运转换
        while( (ADDR&0x80000000)==0 );              // 等待转换结束
        ADC_Data = ADDR;							// 读取ADC结果
        ADC_Data = (ADC_Data>>6) & 0x3FF;           // 提取AD转换值
        ADC_Data = ADC_Data * 3300;                 // 数值转换
        ADC_Data = ADC_Data / 1024;
   
   
   if(ADC_Data>=3200)
   {
       disp_buf[0]=1;
       disp_buf[1]=4;
       ZLG7290_SendBuf(disp_buf,2);
       DelayNS(50);
       IO2CLR = DISP_TAB;   // 输出LED显示数据
       DelayNS(10);	        // 延时
       IO2SET = 0xffffffff;
       
   }
   else if((ADC_Data>=3150)&&(ADC_Data<3200))
         {
            disp_buf[0]=0;
            disp_buf[1]=4;
            ZLG7290_SendBuf(disp_buf,2);
            DelayNS(50);
         }
   else if((ADC_Data>=3100)&&(ADC_Data<3150))
         {
            disp_buf[0]=9;
            disp_buf[1]=3;
            ZLG7290_SendBuf(disp_buf,2);
            DelayNS(50);
         }
   else if((ADC_Data>=3050)&&(ADC_Data<3100))
         {
            disp_buf[0]=8;
            disp_buf[1]=3;
            ZLG7290_SendBuf(disp_buf,2);
            DelayNS(50);
         }
   else if((ADC_Data>=3000)&&(ADC_Data<3050))
         {
            disp_buf[0]=7;
            disp_buf[1]=3;
            ZLG7290_SendBuf(disp_buf,2);
            DelayNS(50);
         }
   else if(ADC_Data<3000)
         {
           disp_buf[0]=6;
           disp_buf[1]=3;
           ZLG7290_SendBuf(disp_buf,2);
           DelayNS(50);
           IO2CLR = DISP_TAB;   // 输出LED显示数据
           DelayNS(10);	        // 延时
           IO2SET = 0xffffffff;
         }
           
            
                        
   }

  return(0);					
}

⌨️ 快捷键说明

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