本帖最后由 清风萧瑟无眠 于 2014-3-17 11:13 编辑
#include <MSP430G2553.h>
#include <definetion.h>
#include <12864show.h>
void io_init();
void lcdshow_init();
void write_com(uchar com);
void write_data(uchar data);
void write_show(uchar x,uchar y);
uint read_temperature();
void lcd_show();
void delay_us(uint us);
void ds18b20(void);
void temperature_show(uint temp);
uint a,b,c,temperature,error;
uchar first_line[]="当前温度:00. 00";
void delay_ms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=125;j>0;j--);
}
//***************us级延时函数**********************//
void delay_us(uint us) // 2/3=12us 1=20us 5=35 10=50 15=141 80=500
{
uint i;
for(i=us;i>0;i--);
}
/*******************I0_point_init(I0引脚初始化)*******************/
void io_init()
{
WDTCTL=WDTPW+WDTHOLD;
P1DIR|=a_output;
P2DIR|=BIT0+BIT1+BIT2+BIT3;
}
/******************************12864show_procedure(12864显示程序)******************************/
/*******************LCDshow_init(12864显示初始化)*******************/
void lcdshow_init()
{
en_0;
rw_0;
psb_1;
write_com(0x01);
write_com(0x30);
write_com(0x0c);
}
/*******************LCD_Write_command(12864写指令)*******************/
void write_com(uchar com)
{
rs_0;
P1OUT=com;
delay_ms(2);
en_1;
delay_ms(5);
en_0;
}
/*******************LCD_Write_data(12864写数据)*******************/
void write_data(uchar data)
{
rs_1;
P1OUT=data;
delay_ms(2);
en_1;
delay_ms(5);
en_0;
}
/*******************LCD_Write_show(显示位置坐标)*******************/
void write_show(uchar x,uchar y)
{
uchar pos;
if(x==0)
x=0x80;
if(x==1)
x=0x90;
if(x==2)
x=0x88;
if(x==3)
x=0x98;
pos=x+y;
write_com(pos);
}
/*******************LCD_show(内容显示)*******************/
void lcd_show()
{
uint i;
i=0;
write_show(0,0);
while(first_line!='\0')
{
write_data(first_line);
i++;
}
}
//******************************DS18B20程序*******************************//
//***************复位时序************************//
void reset() //************复位
{
P2DIR|=BIT4;
DQ_1;
_NOP();
DQ_0;
delay_us(170);
DQ_1;
delay_us(10);
P2DIR&=~BIT4;
_NOP();
if(P2IN&BIT4)
error=1;
else
error=0;
P2DIR|=BIT4;
delay_us(40);
}
//***************写时序************************//
void write(uchar date) //************写时序
{
uint i;
P2DIR|=BIT4;
for(i=0;i<8;i++) //***********循环8次
{
DQ_0;
delay_us(1/3);
if (date&0x01==0x01) //************如果写1
{
DQ_1; //***************拉高
}
else //************如果写0
{
DQ_0; //*****继续保持低电平
}
_NOP();
DQ_1;
date>>=1; //**字节右移继续判断
}
}
//***************读时序************************//
uchar read() //*******带返回值函数
{
uint i,temp=0;
for(i=0;i<8;i++) //*************循环8次
{ //************字节右移
DQ_0;
temp>>=1;
DQ_1;
delay_us(1);
P2DIR&=~BIT4;
if(P2IN&BIT4)
{
temp|=0x80;
}
P2DIR|=BIT4;
delay_us(4);
}
return temp;
}
//***************读温度值***********************//
uint read_temperature()
{
reset();
write(0xcc);
write(0x44);
delay_us(100);
reset();
write(0xcc);
write(0xbe);
a=read();
b=read();
reset();
b<<=8;
c=a|b;
return (c*0.0625);
}
//***************温度计算***********************//
void temperature_count(uint wei,uint num)
{
uint ge , shi ;
write_com(0x80+wei);
ge=num/10;
shi=num%10;
write_data(0x30+ge);
write_data(0x30+shi);
}
//***************温度显示***********************//
void temperature_show(uint temp)
{
uint zheng,xiao;
zheng = temp/1000 ;
temperature_count(5,zheng);
xiao = temp%1000/10;
temperature_count(7,xiao);
}
void main()
{
io_init();
lcdshow_init();
lcd_show();
while(1)
{
temperature=read_temperature();
temperature_show(temperature);
delay_us(50);
}
} |