main.c

#include <STC15F2K60S2.H>
#include <intrins.h>
#include <seg.h>
#include <ds18b20.h>
#include <key.h>
#include <pcf8591.h>
#include <led.h>


unsigned int seg_slow_down;//0-65535
unsigned char key_slow_down;
unsigned char key_down,key_old,key_val;

unsigned char segmode=0;
unsigned char ucled[8]={0,0,0,0,0,0,0,0};

unsigned char seg_pos;
unsigned char seg_buf[8]={10,10,10,10,10,10,10,10};
unsigned char seg_point[8]={0,0,0,0,0,0,0,0};
float temperature;
unsigned char seg_wen=25;//0-255
unsigned char sta_wen=25;
float seg_v=0;
bit mode;
void system_init(void)
{
    P0=0xff;
    P2=P2&0x1f|0x80;
    P2&=0x1f;
    
    P0=0x00;
    P2=P2&0x1f|0xa0;
    P2&=0x1f;
}
void key_proc()
{
    if(key_slow_down<10)return;
    key_slow_down=0;
    
    key_val= key_read();
    key_down=key_val&(key_old^key_val);
    key_old=key_val;
    
    switch(key_down)
    {
        case 4:
        if(++segmode==3)segmode=0;
        if(segmode==1)seg_wen=sta_wen;
        if(segmode==2)sta_wen=seg_wen;
        
     break;
        case 8:
        if(segmode==1)
        {
            if(--seg_wen==255)seg_wen=0;
        }
        
     break;
        case 9:
        if(segmode==1)
        {
            if(++seg_wen==100)seg_wen=99;
        
        }
        
     break;
        case 5:
            mode^=1;
        
     break;
    }
}
void working()
{
    if(mode==0)//模式1
    {
        if(temperature<sta_wen)seg_v=0;
        else seg_v=5;
    }
    else//模式2
    {
        if(temperature<20)seg_v=1;
        else if(temperature>40)seg_v=4;
        else
            seg_v=0.15*temperature-2;
    }
    DA_zhuanhua(seg_v*51);
    
    if(mode==0)ucled[0]=1;
    else ucled[0]=0;
    
    if(segmode==0)ucled[1]=1;
    else ucled[1]=0;
    
    if(segmode==1)ucled[2]=1;
    else ucled[2]=0;
    
    if(segmode==2)ucled[3]=1;
    else ucled[3]=0;
    

}

void seg_proc()
{
    if(seg_slow_down<500)return;
    seg_slow_down=0;
    
    temperature=rd_temperature();
    
    
    switch(segmode)
    {
        case 0:
            seg_buf[0]=11;
         seg_point[5]=1;
        
        seg_buf[4]=(unsigned char)temperature/10;
        seg_buf[5]=(unsigned char)temperature%10;
        seg_buf[6]=(unsigned int)(temperature*100)%100/10;
        seg_buf[7]=(unsigned int)(temperature*100)%10;
            
            
        break;
        case 1:
            seg_buf[0]=12;
        seg_point[5]=0;
        
        seg_buf[4]=10;
        seg_buf[5]=10;
        seg_buf[6]=seg_wen/10;
        seg_buf[7]=seg_wen%10;
        
            
            
        break;
        case 2:
            seg_buf[0]=13;
         seg_point[5]=1;
                seg_buf[4]=10;
        seg_buf[5]=(unsigned char)seg_v;
        seg_buf[6]=(unsigned int)(seg_v*100)%100/10;
        seg_buf[7]=(unsigned int)(seg_v*100)%10;
        
            
        break;
    
    }
    

}
void Timer0Init(void)        //1毫秒@12.000MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0=1;
    EA=1;
}
void ServiceT0() interrupt 1
{
    seg_slow_down++;
    key_slow_down++;
    if(++seg_pos==8)seg_pos=0;
    seg_disp(seg_pos,seg_buf[seg_pos],seg_point[seg_pos]);
    led_disp(seg_pos,ucled[seg_pos]);

}

void Delay750ms()        //@12.000MHz
{
    unsigned char i, j, k;

    _nop_();
    _nop_();
    i = 35;
    j = 51;
    k = 182;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{
    Delay750ms();
    rd_temperature();
    Timer0Init();
    system_init();
  while(1)
    {
        seg_proc();
        key_proc();
         working();
    
    }


}

seg.c

#include <seg.h>
unsigned char seg_wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char seg_duan[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 ,0xff,
0xc6,0x8c,0x88};
void seg_disp(unsigned char wei,duan,point)
{
    P0=0xff;
    P2=P2&0x1f|0xe0;
    P2&=0x1f;
    
    P0=seg_wei[wei];
    P2=P2&0X1f|0xc0;
    P2&=0x1f;
    
    P0=seg_duan[duan];
    if(point==1)P0&=0x7f;
    P2=P2&0X1f|0xe0;
    P2&=0x1f;
}

ds18b20.c

#include <ds18b20.h>

sbit DQ=P1^4;
void Delay_OneWire(unsigned int t)  
{
    unsigned char i;
    while(t--){
        for(i=0;i<12;i++);
    }
}

//
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);
}

//
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;
}

//
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 rd_temperature(void)
{
    unsigned char high;
    unsigned char low;
    init_ds18b20();
    Write_DS18B20(0xcc);
    Write_DS18B20(0x44);
    
    init_ds18b20();
    Write_DS18B20(0xcc);
    Write_DS18B20(0xbe);
    low=Read_DS18B20();
    high=Read_DS18B20();
    return ((high<<8)|low)/16.0;
}

key.c

#include <key.h>

unsigned char key_read(void)
{
    unsigned char temp=0;
    P44=0;P42=1;P35=1;P34=1;
    if(P30==0)temp=7;
    if(P31==0)temp=6;
    if(P32==0)temp=5;
    if(P33==0)temp=4;
  P44=1;P42=0;P35=1;P34=1;
    if(P30==0)temp=11;
    if(P31==0)temp=10;
    if(P32==0)temp=9;
    if(P33==0)temp=8;
    P44=1;P42=1;P35=0;P34=1;
    if(P30==0)temp=15;
    if(P31==0)temp=14;
    if(P32==0)temp=13;
    if(P33==0)temp=12;
    P44=1;P42=1;P35=1;P34=0;
  if(P30==0)temp=19;
    if(P31==0)temp=18;
    if(P32==0)temp=17;
    if(P33==0)temp=16;
    return temp;
}

pcf8591.c

#include <pcf8591.h>
#include <intrins.h>

#define DELAY_TIME    5
sbit scl=P2^0;
sbit sda=P2^1;

//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();        
    }
    while(n--);          
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
    I2C_Delay(DELAY_TIME);
    sda = 0;
    I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
    I2C_Delay(DELAY_TIME);
    sda = 1;
    I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
    
    for(i=0; i<8; i++){
        scl = 0;
        I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
        I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
        I2C_Delay(DELAY_TIME);
    }
    
    scl = 0;  
}

//
//unsigned char I2CReceiveByte(void)
//{
//    unsigned char da;
//    unsigned char i;
//    for(i=0;i<8;i++){   
//        scl = 1;
//        I2C_Delay(DELAY_TIME);
//        da <<= 1;
//        if(sda) 
//            da |= 0x01;
//        scl = 0;
//        I2C_Delay(DELAY_TIME);
//    }
//    return da;    
//}

//
unsigned char I2CWaitAck(void)
{
    unsigned char ackbit;
    
    scl = 1;
    I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
    I2C_Delay(DELAY_TIME);
    
    return ackbit;
}

//
//void I2CSendAck(unsigned char ackbit)
//{
//    scl = 0;
//    sda = ackbit; 
//    I2C_Delay(DELAY_TIME);
//    scl = 1;
//    I2C_Delay(DELAY_TIME);
//    scl = 0; 
//    sda = 1;
//    I2C_Delay(DELAY_TIME);
//}

void DA_zhuanhua(unsigned char dat)
{
    I2CStart();
    I2CSendByte(0x90);
    I2CWaitAck();
    
    I2CSendByte(0x41);
    I2CWaitAck();
    
    I2CSendByte(dat);
    I2CWaitAck();
    I2CStop();
}

led.c

#include <led.h>

void led_disp(unsigned char pos,enable)
{
 static unsigned char temp=0x00;
 static unsigned char temp_old=0xff;
    if(enable==1)
    {
        temp |=(0x01<<pos);
    }
    else
    {
        temp &=~(0x01<<pos);
    }
    
    if(temp!=temp_old)
    {
        P0=~temp;
        P2=P2&0X1F|0X80;
        P2&=0X1F;
        temp_old=temp;
    }

}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐