打印
[STM8]

stm8测2路18b20温度显示 通过按键切换

[复制链接]
1445|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lwliuming063 于 2014-5-17 21:47 编辑

菜鸟问下 这个 流程 谁给说下啊!一路温度显示已经搞定!

888888.bmp (475.4 KB )

888888.bmp
沙发
mmuuss586| | 2014-5-18 09:28 | 只看该作者
判断按键下降沿,每检测到1次按键从高电平到低电平的变化,切换显示就好了;

使用特权

评论回复
板凳
lwliuming063|  楼主 | 2014-5-19 10:46 | 只看该作者
mmuuss586 发表于 2014-5-18 09:28
判断按键下降沿,每检测到1次按键从高电平到低电平的变化,切换显示就好了; ...

#include <iostm8s003f3.h>
#define uchar unsigned char
#define uint unsigned int

#define led1_off       PD_ODR|=0x10
#define led1_on        PD_ODR&=~0x10   //PD4

#define led2_off       PA_ODR|=0x08
#define led2_on        PA_ODR&=~0x08   //PA3



#define cs_1          PC_ODR|=0x20
#define cs_0          PC_ODR&=~0x20    //PC5

#define clk_1         PC_ODR|=0x40     
#define clk_0         PC_ODR&=~0x40    //PC6

#define di_1          PC_ODR|=0x80
#define di_0          PC_ODR&=~0x80    //PC7

#define tc_1          PD_ODR|=0X04
#define tc_0          PD_ODR&=~0X04    //PD2

#define tc1_1         PD_ODR|=0X08
#define tc1_0         PD_ODR&=~0X08    //PD3

#define tc           (PD_IDR&0X04)>>2 //PD2
#define tc1          (PD_IDR&0X08)>>3 //PD3
#define set          (PB_IDR&0X20)>>5 //PB5
const uchar sz[]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f};
float temp1;
float temp2;
float xx;
void delayms(uint x)
{
uint m,n;
for(m=0;m<100;m++)
   for(n=0;n<x;n++){;;;};
}
/********************************************/
void delay(uint US)                  
{
uint i;
US=US*5/4;                           //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<US;i++);
}
////////////////////////////////////////////
void GPIO_init(void)
{
  
  CLK_CKDIVR = 0x08;
  
  PA_DDR = 0xff;  // 配置PD端口的方向寄存器PD3输出
  PA_CR1 = 0xff;  // 设置PD3为推挽输出
  PA_CR2 = 0xff;   
  
  PB_DDR = 0xdf;  // 配置PD端口的方向寄存器PD3输出
  PB_CR1 = 0xff;  // 设置PD3为推挽输出
// PB_CR2 = 0xff;   
  
  PD_DDR = 0xff;  // 配置PD端口的方向寄存器PD3输出
  PD_CR1 = 0xff;  // 设置PD3为推挽输出
  PD_CR2 = 0xff;   

  PE_DDR = 0xff;  // 配置PD端口的方向寄存器PD3输出
  PE_CR1 = 0xff;  // 设置PD3为推挽输出
  PE_CR2 = 0xff;   
  
  PC_DDR = 0xff;  // 配置PD端口的方向寄存器PD3输出
  PC_CR1 = 0xff;  // 设置PD3为推挽输出
  PC_CR2 = 0xff;   
  
}
void clk_init(void)
{
  CLK_CKDIVR = 0x08;         // 16M内部RC经2分频后系统时钟为8M
}
void init_devices(void)
{
  asm("sim");  // 关全局中断
  clk_init();
  GPIO_init();
  //tim1_init();
  asm("rim");  // 开全局中断

}
////////////////////////////////////////////////

//////////////复位//////////////////////////////
void B20_init(void)
{
      tc_0;            //配置为输出        //拉低       
     
      delay(600);     //等待600微秒
      tc_1;           //释放总线               
      delay(60);      //等待60微秒                         
      PD_DDR=0x04;    //配置为输入        
      while(tc);     //等待DS18B20拉低
      while(!(tc));  //等待DS18B20释放总线               
}
uchar B20_readB(void)
{
  uchar i,retd=0;
for(i=0;i<8;i++)    //位计数值
{
    retd>>=1;            //右移,准备接受新的数据位
    tc_0;           //配置为输出  //拉低,启动读数据位
    tc_1;               //释放总线       
    delay(5);            //等待5微秒               
                                                 
     PD_DDR=0x04;   //配置为输入,开始读取数据位
     if(tc)           //该位是否为高  
     {
        retd|=0x80;//是就将此位置高
      }
      delay(50);  //等待50微秒  
  }
return retd;         //将读到的一个字节返回
}

void B20_writeB(uchar wrd)
{
  uchar i;
  for(i=0;i<8;i++)                  //位计数值
  {
      tc_0;                            //配置为输出 //拉低,启动写数据位
      delay(1);                 //等待1微秒
                                                
        if(wrd&0x01)                //此位数据是否为高
        {
         tc_1;                        //是高则将单总线拉高
        }
        else
        {
         tc_0;                       //是低则将单总线拉低
         }
        delay(50);               //等待50微秒
        tc_1;                       //释放总线
        wrd>>=1;              //右移,为写入新的数据位做准备
   }
  delay(50);                     //等待50微秒
}

float Read_temp(void)
{
uint templ,temph;
// uint temp;
B20_init();                  //初始化,每次写命令都从初始化开始
B20_writeB(0xcc);           //跳过ROM
B20_writeB(0x44);           //启动温度转换
B20_init();                     //初始化,每次写命令都从初始化开始
B20_writeB(0xcc);           //跳过ROM
B20_writeB(0xbe);           //读寄存器
templ=B20_readB();          //读温度低字节
temph=B20_readB();       //读温度高字节
B20_init();

temp1=(templ|(temph<<8))*0.625;  //将温度整理成16位变量
return temp1;              //返回16位变量
}
////////////////////////////////////////////////////////

/////////////////////////wendu2////////////////////////
void B20_init1(void)
{
                //配置为输出        //拉低       
      tc1_0;
      delay(600);     //等待600微秒
      tc1_1;           //释放总线               
      delay(60);      //等待60微秒                         
      PD_DDR=0x08;    //配置为输入        
      while(tc1);     //等待DS18B20拉低
      while(!(tc1));  //等待DS18B20释放总线               
}
uchar B20_readB1(void)
{
  uchar i,retd=0;
for(i=0;i<8;i++)    //位计数值
{
    retd>>=1;            //右移,准备接受新的数据位
    tc1_0;           //配置为输出  //拉低,启动读数据位
    tc1_1;               //释放总线       
    delay(5);            //等待5微秒               
                                                 
     PD_DDR=0x08;   //配置为输入,开始读取数据位
     if(tc1)           //该位是否为高  
     {
        retd|=0x80;//是就将此位置高
      }
      delay(50);  //等待50微秒  
  }
return retd;         //将读到的一个字节返回
}

void B20_writeB1(uchar wrd)
{
  uchar i;
  for(i=0;i<8;i++)                  //位计数值
  {
      tc1_0;                    //配置为输出 //拉低,启动写数据位
      delay(1);                 //等待1微秒
                                                
        if(wrd&0x01)                //此位数据是否为高
        {
         tc1_1;                        //是高则将单总线拉高
        }
        else
        {
         tc1_0;                       //是低则将单总线拉低
         }
        delay(50);               //等待50微秒
        tc1_1;                       //释放总线
        wrd>>=1;              //右移,为写入新的数据位做准备
   }
  delay(50);                     //等待50微秒
}

float  Read_temp1(void)
{
uint templ,temph;

B20_init1();                     //初始化,每次写命令都从初始化开始
B20_writeB1(0xcc);           //跳过ROM
B20_writeB1(0xbe);           //读寄存器
delay(30);
templ=B20_readB1();          //读温度低字节
temph=B20_readB1();      //读温度高字节

B20_init1();                  //初始化,每次写命令都从初始化开始
B20_writeB1(0xcc);           //跳过ROM
B20_writeB1(0x44);           //启动温度转换


temp2=(templ|(temph<<8))*0.625;  //将温度整理成16位变量
return temp2;              //返回16位变量
}

////////////////////////显示///////////////////////////
void send(uchar x)
{
   uchar i;
   cs_0;
   
   for(i=0;i<8;i++)
      {
            clk_0;
                if((x&0x01)!=0){di_1;}else di_0;
               
                clk_1;
                x=x>>1;          
          };
          
}
void disp(uint sd,uchar kz)
{   uchar aa[4];  
  if(kz==0)
  {
    aa[0]=sd/1000;
    aa[1]=sd%1000/100;
    aa[2]=sd%100/10;
    aa[3]=sd%10;
   di_1;
   clk_1;
   cs_1;   
   send(0x40);
   cs_1;
   
    send(0xc0);
    send(sz[aa[0]]);      
    send(0xc2);
    send(sz[aa[1]]);
    send(0xc4);
    send(sz[aa[2]]);
    send(0xc6);
    send(sz[aa[3]]);
   cs_1;
   send(0x8c);
   cs_1;
  }else
  {
   
  }
   
}
////////////////////////////////////////////////////////////////
/******************************按键选择路数*****************************/
uchar kk=1;

void key()
{
   if(set==0){delayms(1000);kk++;};
   if(kk==1){led1_on;led2_off;xx=temp2;};
   if(kk==2){led1_off;led2_on;xx=temp1;};
   if(kk>2)kk=1;
   

}

//////////////////主函数/////////////////////////
void main()
{

  // init_devices();//系统初始化
  GPIO_init();
  led1_off;
  led2_off;
  for(;;)
  {     
        key();
        temp1=Read_temp(); //读取温度1
        temp2= Read_temp1();//读取温度2
        disp(xx,0);
  }
}

下载后无反应呢 感觉程序死到那一块了  郁闷了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

14

帖子

1

粉丝