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

📄 main.c

📁 基于IAR Embedded Workbench开发平台
💻 C
📖 第 1 页 / 共 2 页
字号:
  TACCTL2=0x00;
  TACCR2=0x00; 
  
  TAR=0x0000;//clear timer counter计数器值清0
  TACTL=TASSEL1+ID1+ID0+MC1+MC0+TACLR;           
  //定时器A 时钟源为SMCLK,8分频,增减计数模式,清TAR(计数器)
}

#pragma vector = TIMERA0_VECTOR         //ccr0 中断服务
__interrupt void ta0_isr(void)
{
  TACCR0=0x2EE;                         //初始值装载  
  if(++timea0>=1000)
   {
    timea0=0;
    timea1++;
   }
}

/**********ADC转换**********/
void adc_init(void)
{
  ADC10CTL1=INCH_0+SHS_0+ADC10DIV_0+ADC10SSEL_0+CONSEQ_0;
  //开通道0,AD启动信号来源ADC10SC,时钟源内部时钟并1分频,选单通道单次转换
  ADC10CTL0=ADC10SHT_0+REF2_5V+REFON+SREF_0+ADC10ON+ADC10IE;
  //采样周期为4xADC10CLKs,2.5V参考,内部参考电压开,选AVCC AVSS为参考电压,启动AD模块,AD中断使能 
  ADC10CTL0|=ENC;                       //AD转换使能
}

#pragma vector = ADC10_VECTOR           //ADC10中断服务
__interrupt void adc_isr(void)            
{adc_num=ADC10MEM;}                     //保存AD结果


/********DS18B20复位********/
unsigned char ds18b20_ack(void)
{
 uchar ack=1;
 ds18b20_dir|=ds18b20_port;            //控制口为输出状态
 ds18b20_out&=(~ds18b20_port);         //输出低              
 delay_us(500);                        //延时500us           
 ds18b20_out|=ds18b20_port;
 ds18b20_dir&=(~ds18b20_port);         //控制口为输入状态              
 delay_us(80);                         //延时80us            
 ack=ds18b20_in&ds18b20_port;          //读出DS18B20返回值
 delay_us(250);                        //等待返回脉冲结束
 return(ack);
}

/*******DS18B20读1字节******/
unsigned char ds18b20_read(void)
{
 uchar i=0,byte=0;
 for (i=0;i<8;i++)
  {
   ds18b20_dir|=ds18b20_port;          //控制口为输出状态
   ds18b20_out&=(~ds18b20_port);       //输出低              
   delay_us(2);                        //至少保持1uS才能释放
   ds18b20_out|=ds18b20_port;
   ds18b20_dir&=(~ds18b20_port);       //控制口为输入状态              
   delay_us(10);                       //输出低出现后15uS内数据有效
   if((ds18b20_in&ds18b20_port)!=0)    //读出值为1
    {byte|=0X80;}	
   else
    {byte&=0X7f;}
   if(i<7)
    {byte>>=1;}                        //读完1个BYTE         
   delay_us(50);
  }
 return(byte);
}

/*******DS18B20写1字节******/
void ds18b20_write(unsigned char cmd)
{
 uchar i,j;
 ds18b20_dir|=ds18b20_port;           //控制口为输出状态
 for(j=0;j<=7;j++)
  {
   i=cmd&0x01;
   if(i==0x01)                        //写BIT"1"
    {
     ds18b20_out&=(~ds18b20_port);
     delay_us(15);
     ds18b20_out|=ds18b20_port;
     delay_us(85);
    }
   else                               //写BIT"0"
    {
     ds18b20_out&=(~ds18b20_port);
     delay_us(85);
     ds18b20_out|=ds18b20_port;
     delay_us(15);
    } 
   cmd>>=1;	     
  }
}

/*******单个DS18B20温度测量函数******/
float ds18b20_single_data(void)
{
 uchar read_bytel=0,read_byteh=0;
 int read_byte=0;
 float buff;
 ds18b20_ack();
 if(ds18b20_ack()==0)
  {
   ds18b20_write(0xcc);                  //跳过ROM匹配
   ds18b20_write(0x44);                  //开始转换命令
   delay_us(1000); 
   ds18b20_ack();                        //读温度前复位 
   ds18b20_write(0xcc);                  //跳过ROM匹配
   ds18b20_write(0xbe);                  //开始读取命令   
   read_bytel=ds18b20_read();            //读出低BYTE 
   read_byteh=ds18b20_read();            //读出高BYTE
   read_byte=(read_byteh<<8)|read_bytel; //数据组合
   if(read_byte<0)                       //如果温度为负
    {
     read_byte=~read_byte+1;
     buff=read_byte*-0.0625;             //16进制转换为正确的十进制数据
    }
   else buff=read_byte*0.0625;           //16进制转换为正确的十进制数据
  }
 else
  {ds18b20_ack();}
 return (buff);
}

/*******单个DS18B20 ROM读取函数******/
void ds18b20_single_rom(void)
{
 uchar x=0;
 ds18b20_ack(); 
 if(ds18b20_ack()==0)
  {
   ds18b20_write(0x33);                  //ROM读取命令 
   for(x=0;x<8;x++)
    {ds18b20_rom[x]=ds18b20_read();}  //将读到的ROM值存入数组(低位器件代码40最先被读)
  }
 else
  {ds18b20_ack();} 
}

/*******多个DS18B20温度测量函数******/
void ds18b20_many_data(void)
{
 uchar read_bytel=0,read_byteh=0,x=0;
 int read_byte=0;
 float buff;
 ds18b20_ack();
 if(ds18b20_ack()==0)
  {
   ds18b20_write(0xcc);                  //跳过ROM匹配
   ds18b20_write(0x44);                  //开始转换命令
   delay_us(1000); 
   
   ds18b20_ack();                        //读温度前复位 
   ds18b20_write(0x55);                  //ROM匹配
   for(x=0;x<8;x++)
    {ds18b20_write(ds18b20_rom_store[0][x]);}//先传低位器件代码40
   ds18b20_write(0xbe);                  //开始读取命令   
   read_bytel=ds18b20_read();            //读出低BYTE 
   read_byteh=ds18b20_read();            //读出高BYTE
   read_byte=(read_byteh<<8)|read_bytel; //数据组合
   if(read_byte<0)                       //如果温度为负
    {
     read_byte=~read_byte+1;
     buff=read_byte*-0.0625;             //16进制转换为正确的十进制数据
    }
   else buff=read_byte*0.0625;           //16进制转换为正确的十进制数据
    lcd_cmd_send(0x60);lcd_cmd_send(0x00);
    lcd_cmd_send(0x70);lcd_cmd_send(0x30);
    lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
    lcd_text_display("一号测量温度:");
    lcd_float_display(buff);
    lcd_text_display("℃");    
   
   ds18b20_ack();                        //读温度前复位 
   ds18b20_write(0x55);                  //ROM匹配
   for(x=0;x<8;x++)
    {ds18b20_write(ds18b20_rom_store[1][x]);}//先传低位器件代码40
   ds18b20_write(0xbe);                  //开始读取命令   
   read_bytel=ds18b20_read();            //读出低BYTE 
   read_byteh=ds18b20_read();            //读出高BYTE
   read_byte=(read_byteh<<8)|read_bytel; //数据组合
   if(read_byte<0)                       //如果温度为负
    {
     read_byte=~read_byte+1;
     buff=read_byte*-0.0625;             //16进制转换为正确的十进制数据
    }
   else buff=read_byte*0.0625;           //16进制转换为正确的十进制数据
    lcd_cmd_send(0x60);lcd_cmd_send(0x00);
    lcd_cmd_send(0x70);lcd_cmd_send(0x47);
    lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
    lcd_text_display("二号测量温度:");
    lcd_float_display(buff);
    lcd_text_display("℃");      
  }
 else
  {ds18b20_ack();}
}

/*******数码管显示函数******/
void led_display(void)
{
 if(led_xs!=timea1)
  {led_xs=timea1;led_a++;}
 if(led_a>=10)
  {led_b++;led_a=0;}
 if(led_b>=6)
  {led_c++;led_b=0;}
 if(led_c>=10)
  {led_d++;led_c=0;}
 if(led_d>=6)
  {led_d=0;}
 
 lcd_data=led_code[led_d];
 P3OUT&=0xf8;
 P3OUT|=0x01;
 delay_ms(1); 

 lcd_data=led_code[led_c];
 P3OUT&=0xf8;
 P3OUT|=0x02;
 delay_ms(1); 
 
 lcd_data=led_code[10];
 P3OUT&=0xf8;
 P3OUT|=0x02;
 delay_ms(1); 
 
 lcd_data=led_code[led_b];
 P3OUT&=0xf8;
 P3OUT|=0x03;
 delay_ms(1); 
 
 lcd_data=led_code[led_a];
 P3OUT&=0xf8;
 P3OUT|=0x04;
 delay_ms(1); 
}

/*******按键扫描函数******/
void key_scan(void)
{
  ADC10CTL0&=~ENC;                                       //AD禁止
  ADC10CTL1=INCH_2+SHS_0+ADC10DIV_0+ADC10SSEL_0+CONSEQ_0;//通道2
  ADC10CTL0|=ENC;                                        //AD使能 
  ADC10CTL0|=ADC10SC;                                    //开始转换
  delay_us(10);
  if(adc_num<869)                                        //有按键按下
   {
    delay_ms(1);                                         //去抖动
    ADC10CTL0|=ADC10SC;                                  //再次转换
    delay_us(10);
    if(adc_num>807&&adc_num<869)     //2.6v--2.8v
     key_num=9; 
    else if(adc_num>714&&adc_num<776)//2.3v--2.5v
     key_num=8; 
    else if(adc_num>621&&adc_num<683)//2.0v--2.2v
     key_num=7; 
    else if(adc_num>528&&adc_num<590)//1.7v--1.9v
     key_num=6; 
    else if(adc_num>434&&adc_num<496)//1.4v--1.6v
     key_num=5; 
    else if(adc_num>341&&adc_num<403)//1.1v--1.3v
     key_num=4; 
    else if(adc_num>248&&adc_num<310)//0.8v--1.0v
     key_num=3; 
    else if(adc_num>155&&adc_num<217)//0.5v--0.7v
     key_num=2; 
    else if(adc_num>62&&adc_num<124) //0.2v--0.4v
     key_num=1; 
    else key_num=0;
    while(adc_num<931) //3V
     {
      ADC10CTL0|=ADC10SC;            //再次转换
      delay_us(10);
     }
   }
  //else key_num=0;
}


void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  BCSCTL1 =CALBC1_12MHZ;                //设定DCO为12MHZ
  DCOCTL =CALBC1_12MHZ;
  port_init();
  timea_init();
  adc_init();
  lcd_init();
  lcd_clean();
  delay_ms(1000);
  lcd_clean();
  _EINT();

  while(key_num!=5)
  {menu();delay_ms(100);}
  
  lcd_clean();
  while(1)
  {
    adc_num=0;adc_numx=0;
    lcd_cmd_send(0x60);lcd_cmd_send(0x00);
    lcd_cmd_send(0x70);lcd_cmd_send(0x00);
    lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
    ADC10CTL0&=~ENC;                                       //AD禁止
    ADC10CTL1=INCH_0+SHS_0+ADC10DIV_0+ADC10SSEL_0+CONSEQ_0;//通道0
    ADC10CTL0|=ENC;                                        //AD使能 
    for(ytime=0;ytime<256;ytime++)
    {
    ADC10CTL0|=ADC10SC;                                    //开始转换
    delay_us(10);
    adc_num=3.3*adc_num/1024;
    adc_numx+=adc_num;
    }
    adc_num=adc_numx/256;
    lcd_text_display("一号测量电压:");
    lcd_float_display(adc_num);
    lcd_text_display("v");
    
    adc_num=0;adc_numx=0;
    lcd_cmd_send(0x60);lcd_cmd_send(0x00);
    lcd_cmd_send(0x70);lcd_cmd_send(0x17);
    lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);  
    ADC10CTL0&=~ENC;                                       //AD禁止
    ADC10CTL1=INCH_1+SHS_0+ADC10DIV_0+ADC10SSEL_0+CONSEQ_0;//通道1
    ADC10CTL0|=ENC;                                        //AD使能 
    for(ytime=0;ytime<256;ytime++)
    {
    ADC10CTL0|=ADC10SC;                                    //开始转换
    delay_us(10);
    adc_num=3.3*adc_num/1024;
    adc_numx+=adc_num;
    }
    adc_num=adc_numx/256;
    lcd_text_display("二号测量电压:");
    lcd_float_display(adc_num);
    lcd_text_display("v");
    
    ds18b20_many_data();//2个ds18b20读取温度数据
    
    /*
    lcd_cmd_send(0x60);lcd_cmd_send(0x00);
    lcd_cmd_send(0x70);lcd_cmd_send(0x20);
    lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
    ds18b20_single_rom();                    //采集单个DS18B20的ROM值
    for(xtime=0;xtime<8;xtime++)
     {
       lcd_num_display(ds18b20_rom[7-xtime]);//显示单个DS18B20的ROM值
       lcd_text_display(","); 
     }
    
    lcd_cmd_send(0x60);lcd_cmd_send(0x00);
    lcd_cmd_send(0x70);lcd_cmd_send(0x60);
    lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
    lcd_float_display(ds18b20_single_data());//显示单个DS18B20的采集温度值
    lcd_text_display("℃");   */
    
  
    lcd_cmd_send(0x60);lcd_cmd_send(0x00);
    lcd_cmd_send(0x70);lcd_cmd_send(0x60);
    lcd_cmd_send(0xf1);lcd_cmd_send(0x0f);
    lcd_text_display("测试时间:");
    lcd_num_display(timea1);
    lcd_text_display("s");
    
    for(xtime=0;xtime<100;xtime++)            //LED显示函数
    {led_display();}
 }
}

⌨️ 快捷键说明

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