第十二届蓝桥杯省赛完整代码

本文详细介绍了使用C语言在嵌入式系统中实现IIC通信接口,与DS18B20温度传感器进行数据交互,并处理按键输入,控制LED和显示屏显示的代码片段。
摘要由CSDN通过智能技术生成

#浅浅试水#

//main.c文件内容

#include <STC15F2K60S2.H>
#include <intrins.h>
#include "onewire.h"
#include "iic.h"
u8 pcfda_point=0;
u8 status=0;
u8 key=0;
u8 point=0;
u16 light_val=0;
u16 temp_set=25;
u16 temp_val=0;
u8 flag_key=0;
float da=0;
u8 da_val=0;
u8 flag_display=0;
u8 a[8]={10,10,10,10,10,10,10,10};
u16 flag_ds18b20=0;
u16 flag_pcfda=0;
float temp_new;
void ctrl(u8 ctrl)
{
  u8 p2data=P2;
    P2=ctrl<<5|(P2&0x1f);
  P2=p2data;

}
u8 key_val(void)
{
    u8 row=0,column=0,adc=0;
  P3=0x0f;P42=0;P44=0;
    if(P30==0)row=1;
    if(P31==0)row=2;
    if(P32==0)row=3;
    if(P33==0)row=4;
    P3=0xf0;P44=1;P42=1;
    if(P44==0)column=1;
    if(P42==0)column=2;
    if(P35==0)column=3;
    if(P34==0)column=4;
    if(row!=0)adc=4*column+(4-row);
    return adc;
    

}
u8 key_sta(void)
{
   static sta=0;
     u8 ret=0,val=key_val();
     switch(sta)
     {
       case 0:if(val!=0)sta=1;break;
       case 1:if(val==0)sta=0;else{sta=2;ret=val;}break;
     case 2:if(val==0)sta=0;break;     
          default:break;
     }
   return(ret);


}
void leds(u8 status,u8 point)
{
    u8 p=(point+1)%2;    
  P0=~(0x02<<status|p);
    ctrl(4);
}
void display(u8 site,u8 light)
{
  P0=0xff;
  ctrl(7);
    P0=0x01<<site;
    ctrl(6);
  switch(light%20)
    {
        case 0:P0=0xc0;break;
      case 1:P0=0xf9;break;
      case 2:P0=0xa4;break;
      case 3:P0=0xb0;break;
      case 4:P0=0x99;break;
      case 5:P0=0x92;break;
      case 6:P0=0x82;break;
      case 7:P0=0xf8;break;
      case 8:P0=0x80;break;
      case 9:P0=0x90;break;
      case 10:P0=0xff;break;
      case 11:P0=0xc6;break;
      case 12:P0=0x8c;break;
        case 13:P0=~0x77;break;
        default:break;
    
    }
    if(light>=20)P0=P0&0x7f;
    ctrl(7);

}
void get(u8 a0,u8 a1,u8 a2,u8 a3,u8 a4,u8 a5,u8 a6,u8 a7)
{
 a[0]=a0;a[1]=a1;a[2]=a2;a[3]=a3;a[4]=a4;a[5]=a5;a[6]=a6;a[7]=a7;
}
void Process(void)
{
  if(flag_ds18b20>101){flag_ds18b20=0;temp_new=ds18b20();temp_val=(int)temp_new;}
    if(flag_pcfda>199){flag_pcfda=0;pcfda(da_val);}
    if(flag_key>10){flag_key=0;key=key_sta();}

}
void Timer2_Init(void)        //1??@12.000MHz
{
    AUXR &= 0xFB;            //?????12T??
    T2L = 0x18;                //???????
    T2H = 0xFC;                //???????
    AUXR |= 0x10;            //???2????
    IE2 |= 0x04;            //?????2??
    EA=1;
}
void main()
{
    P0=0xff;
    ctrl(4);
    P0=0x00;
    ctrl(5);    
  Timer2_Init();
     while(1)
    {
    Process();
      if(key==4){key=0;status++;status=status%3;}else{status=status%3;}
      if(key==5){key=0;point++;point=point%2;}else{point=point%2;}
      if(point==0)
      {
       if(temp_val>=temp_set*100)light_val=500;
       if(temp_val<temp_set*100)light_val=0;
         da_val=light_val/100*51;
      }
      else
      {
         if(temp_val<=2000)da=100;
         else if(temp_val>=4000)da=400;
         else{ da=((temp_val-2000)*1.5+1000)/10;}
     light_val=(int)da;
         da_val=(int)(da*51/100);         
      }
    switch(status)
    {
        case 0:{
        get(11,10,10,10,temp_val/1000,20+temp_val/100%10,temp_val%100/10,temp_val%10);
        break;
        }
        case 1:{
    if(key==8){key=0;temp_set--;}
    if(key==9){key=0;temp_set++;}
        get(12,10,10,10,10,10,temp_set/10,temp_set%10);
        break;}      
        case 2:{
        get(13,10,10,10,10,20+light_val/100,light_val%100/10,light_val%10);
        break;}
        default:break;
    
    }
    
    
    }

}
void Timer2_Isr(void) interrupt 12
{
    flag_ds18b20++;
    flag_pcfda++;
    flag_key++;
    flag_display++;
    flag_display=flag_display%8;
    leds(status,point);
    display(flag_display,a[flag_display]);
    
}

//iic.c

/*
  ????: IIC??????
  ????: Keil uVision 4.10 
  ????: CT107????????? 8051,12MHz
  ?    ?: 2011-8-9
*/

#include "reg52.h"
#include "intrins.h"
#include "iic.h"

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//??????
sbit SDA = P2^1;  /* ??? */
sbit SCL = P2^0;  /* ??? */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//??????
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;    
}

//??????
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//????
/*void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;                      // 0:??,1:???
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}*/

//????
bit IIC_WaitAck(void)
{
    bit ackbit;
    
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//??I2C??????
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//?I2C???????
/*unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
        SCL = 1;
    IIC_Delay(DELAY_TIME);
    da <<= 1;
    if(SDA) da |= 1;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    }
    return da;    
}
*/
void pcfda(u8 ctrl)
{
  
    IIC_Start();
  IIC_SendByte(0x90);
  IIC_WaitAck();
    IIC_SendByte(0x40);
  IIC_WaitAck();
    IIC_SendByte(ctrl);
  IIC_WaitAck();
  IIC_Stop();
}    

//iic.h

#ifndef _IIC_H
#define _IIC_H
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
void pcfda(u8 ctrl);

#endif

//onewire.c

#include <STC15F2K60S2.H>
#include <intrins.h>
#include "onewire.h"
sbit DQ = P1^4;  

void Delay_OneWire(unsigned int t)  //STC89C52RC
{
    t=t*12;
    while(t--);
}

//??????DS18B20?????
void Write_DS18B20(unsigned char dat)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ = 0;
        DQ = dat&0x01;
        Delay_OneWire(5);
        DQ = 1;
        dat >>= 1;
    }
    Delay_OneWire(5);
}

//?DS18B20??????
unsigned char Read_DS18B20(void)
{
    unsigned char i;
    unsigned char dat;
  
    for(i=0;i<8;i++)
    {
        DQ = 0;
        dat >>= 1;
        DQ = 1;
        if(DQ)
        {
            dat |= 0x80;
        }        
        Delay_OneWire(5);
    }
    return dat;
}

//DS18B20?????
bit init_ds18b20(void)
{
      bit initflag = 0;
      
      DQ = 1;
      Delay_OneWire(12);
      DQ = 0;
      Delay_OneWire(80);
      DQ = 1;
      Delay_OneWire(10); 
    initflag = DQ;     
      Delay_OneWire(5);
  
      return initflag;
}
float ds18b20(void)
{
  u8 low,high;
    float adc=11;
  init_ds18b20();
    Write_DS18B20(0xcc);
    Write_DS18B20(0x44);
    
  init_ds18b20();
    Write_DS18B20(0xcc);
    Write_DS18B20(0xbe);
  low=Read_DS18B20();
    high=Read_DS18B20();
    adc=(high<<8|low)*6.25;
    return adc;

}

//onewire.h

#ifndef _ONEWIRE_H
#define _ONEWIRE_H
#include "iic.h"
float ds18b20(void);

#endif

基本上自己编写的部分和底层代码都已经包含,大家通过复制代码就可以看一下最终运行效果,如有错误欢迎指出

  • 37
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值