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 没有变化
求求大神指点。
此帖出自小平头技术问答
Write_onebyte(0xcc);
Write_onebyte(0x44);
Delay_ms(1000);
DS18B20_Init();
为什么初始化两遍呢?
会不会是18B20 坏了
一周热门 更多>