Stellaris launchpad LM4F120 18B20温度采样 12864串行显示 求助

2019-03-24 12:07发布

18B2012864 18B2012864
程序:

#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"
#define uchar unsigned char
#define uint  unsigned int
#define Delay_us(x)    SysCtlDelay((long)(SysCtlClockGet( )*(double)x /3000000 ))
#define Delay_ms(x)    SysCtlDelay((long)(SysCtlClockGet( )*(double)x /3000 ))

/*******************************************'
*   12864  声明
******************************************/
#define sclk_1   GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,0Xff )
#define sclk_0   GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2,0x00 )
#define cs_1     GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,0xFF )
#define cs_0     GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4,0x00 )
#define sid_1     GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,0xff )
#define sid_0     GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3,0x00 )
#define sid       GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_3)
void left_shift(uchar Byte);
void write_command(uchar cmd);
void write_data(uchar Data);
void write_position(uchar row,uchar colum);
void init_LCD(void);
void write_string(char *s); //写字符串
void Clean_LCD(void);
void delay(uint xms);
void LCD(uchar x,uchar y,uchar i);
uchar LcdReadData(void);   //写数据子程序
void Disp_Numb(uint temper);    //转化
void init_LCD(void);
uchar dN[6];    //转化成lcd显示
char a[]={"7765654534"};
//////////////////////////////////////////////////////////////
#define   DQ_OUT     GPIOPinTypeGPIOOutputOD(GPIO_PORTA_BASE, GPIO_PIN_5)
#define   DQ_IN      GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_5)
#define   DQ0        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5,0x00)
#define   DQ1        GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5,0xff)
#define   DQ_Read     GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_5)
void DS18B20_Init(void);
void Write_onebyte(uchar data );
uchar Read_onebtye(void);
uint Read_temp(void);
int kk;
long qq;     //读入储存
uint Init_Flag;  //复位标志
void main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); //40M
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4); //显示12864
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1); //显示12864
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_5);
init_LCD();
Clean_LCD();

while(1)
{
  kk=Read_temp();
  Disp_Numb(kk);
  LCD(0,1,dN[5]+0x30);
  LCD(0,2,dN[4]+0x30);
  LCD(0,3,0x2e);         //0x2e是小数点对应的ASCII码值
  LCD(0,4,dN[3]+0x30);
  LCD(0,5,dN[2]+0x30);
  LCD(0,6,dN[1]+0x30);
  LCD(0,7,dN[0]+0x30);

}

}
/*
while(1)
{
     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1,0x00);
     Delay_us(1000000);
     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1,0xff);
     Delay_us(1000000);

}

*/

///////////////////////////////////
void DS18B20_Init(void)
{
DQ_OUT;
DQ0;
Delay_us(600);
DQ1;
Delay_us(60);
DQ_IN;
Delay_us(1);
qq = DQ_Read;
if(qq==0)
{
  Init_Flag=1;
}
else
{
  Init_Flag=0;
}
Delay_us(480);
DQ_OUT;
}

void Write_onebyte(uchar data )
{
uchar i;
DQ_OUT;
for(i=8;i>0;i--)
{
  DQ0;
  Delay_us(5);
  if((data&0x01))
  {
   DQ1;
  }
  else
  {
   DQ0;
  }
  Delay_us(55);
  data=data>>1;
  DQ1;
}
}
uchar Read_onebtye(void)
{
  uchar i;
  uint  temp=0;
  uint  jj=0;
  for(i=8;i>0;i--)
  {
   DQ_OUT;
   temp=temp>>1;
   DQ0;
   Delay_us(1);
   DQ1;
   DQ_IN;
   Delay_us(1);
   jj=(DQ_Read);
   if(jj==0)
   {
    temp=temp|0x00;
   }
   else
   {
    temp=temp|0x80;
   }
   Delay_us(60);
   DQ_OUT;
   DQ1;
  }
  return temp;
}



uint Read_temp(void)
{
  uint temp;
  uint temp_l;
  uint temp_h;;
  DS18B20_Init();
  Write_onebyte(0xcc);
  Write_onebyte(0x44);
  Delay_ms(1000);
  DS18B20_Init();
  Write_onebyte(0xcc);
  Write_onebyte(0xbe);
  temp_l= Read_onebtye();
  temp_h= Read_onebtye();
  temp_h=temp_h<<8;
  temp=temp_h|temp_l;
  return temp;
}







/////////////////////////////////////////////////////////
//////////////////////12864///////////////////////////////
void LCD(uchar x,uchar y,uchar i)
{
  Delay_ms(1);
  write_position(x,y);
  Delay_ms(1);
  write_data(i);
}
void left_shift(uchar Byte)
{
  uchar lcd_count;
  uchar msb;
  sclk_0;
  delay(1);
  msb= Byte & 0x80;
  delay(1);
  for(lcd_count=8;lcd_count;lcd_count--)
  {
   if((msb&0x80)==0x80){
    delay(1);
    sid_1;}//sid=1
   else {
    delay(1);
    sid_0;}//sid=0
   delay(2);
   delay(1);
   sclk_1;//sclk=1
   delay(4);
   delay(1);
   sclk_0;//sclk=0
   delay(1);
   Byte=Byte<<1;
   delay(1);
   msb=Byte&0x80;
   delay(1);
  }
}
void write_command(uchar cmd)
{
  uchar cmd_H,cmd_L;
  cmd_H = cmd & 0xf0;
  delay(1);
  cmd_L =((cmd & 0x0f)<<4) & 0xf0;
  delay(1);
  left_shift(0xf8);
  delay(1);
  left_shift(cmd_H);
  delay(1);
  left_shift(cmd_L);
  delay(1);
}
void write_data(uchar Data)
{
  uchar data_H,data_L;
  data_H = Data & 0xf0;
  delay(1);
  data_L =((Data & 0x0f)<<4) & 0xf0;
  delay(1);
  left_shift(0xfa);
  delay(1);
  left_shift(data_H);
  delay(1);
  left_shift(data_L);
  delay(1);
}
void write_position(uchar row,uchar colum)
{uchar p;
switch(row)
{case 0:p=0x80+colum;
delay(1);
write_command(p);break;
case 1:p=0x90+colum;
delay(1);
write_command(p);break;
case 2:p=0x88+colum;
delay(1);
write_command(p);break;
case 3:p=0x98+colum;
delay(1);
write_command(p);break;
default :break;
}
delay(10);
}
void init_LCD(void)
{
  cs_1;
  //P1=P1|0X0f;
  delay(1);
  write_command(0x30);
  delay(1);
  write_command(0x0c);
  delay(1);
  write_command(0x02);
  delay(1);
}
void write_string(char *s)
{
  for(;(*s)!='';s++)
  {write_data(*s);
  delay(10);
  }
}
void Clean_LCD(void)
{
  write_command(0x01);
  delay(1);
}
void delay(uint xms)
{
  uint i;
  for(i=xms;i>0;i--)
  {
   SysCtlDelay( SysCtlClockGet( ) /30000);
  }
}

/*******************************************************************************
                     向LCD读数据函数
  *****************************************************************************/
uchar LcdReadData(void)//;写数据子程序
{
  uchar data,i;
  sclk_0;
  cs_1;
  delay(2);
  sclk_1;    //LCD 使能
  delay(1);
  for(i=0;i<8;i++)
  {
   data = sid;
   data=data<<1;
   delay(1);
  }//往LCD 送数据
  delay(1);
  sclk_0;           //关使能
  delay(5);   // 延迟
  return (data);
}


void Disp_Numb(uint temper)
{
  uchar i;
  for(i = 0;i < 6;i++) dN = 0; //初始化显示变量
  //数值转换
  if(temper & 0x0001)
  {
   dN[0] = 5;
   dN[1] = 2;
   dN[2] = 6;
  }
  if(temper&0x0002)
  {
   dN[1] += 5;
   dN[2] += 2;
   dN[3] += 1;
  }
  if(temper & 0x0004)
  {
   dN[2] += 5;
   dN[3] += 2;
   if(dN[2] >= 10)
   {
    dN[2] -= 10;
    dN[3] += 1;
   }
  }
  if(temper&0x0008)
  {
   dN[3] += 5;
  }
  if(temper & 0x00f0)
  {
   dN[4] += 1;
  }
  if(temper & 0x0100)
  {
   dN[4] += 2;
  }
  if(temper & 0x0200)
  {
   dN[4] += 4;
  }
  if(temper & 0x0400)
  {
   dN[4] += 8;
   if(dN[4] >= 10)
   {
    dN[4] -= 10;
    dN[5] += 1;
   }
  }
  if(temper & 0x0800)
  {
   dN[4] += 6;
   dN[5] += 1;
   if(dN[4] >= 10)
   {
    dN[4] -= 10;
    dN[5] += 1;
   }
  }
  if(temper & 0x0f00)
  {
   dN[4] += 2;
   dN[5] += 3;
   if(dN[4] >= 10)
   {
    dN[4] -= 10;
    dN[5] += 1;
   }
  }
  if(temper & 0x1000)
  {
   dN[4] += 4;
   dN[5] += 6;
   if(dN[4] >= 10)
   {
    dN[4] -= 10;
    dN[5] += 1;
   }
   if(dN[5] >= 10)
   {
    dN[5] -= 10;
   }
  }
}

温度一直显示27.9375    没有变化

求求大神指点。
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
Study_Stellaris
1楼-- · 2019-03-24 19:40
DS18B20_Init();
  Write_onebyte(0xcc);
  Write_onebyte(0x44);
  Delay_ms(1000);
  DS18B20_Init();
为什么初始化两遍呢?
会不会是18B20 坏了
konggang
2楼-- · 2019-03-24 21:06
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章