| 
 
| 本帖最后由 清风萧瑟无眠 于 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);
 }
 }
 | 
 |