⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b30.lst

📁 首先pic和铁电24c02通讯
💻 LST
字号:
     1: #include"pic18fxx2.h"

     2: #include"lcd.h"

     3: #define  uch unsigned char 

     4: uch dis4[17]="DIGITALVOLTMETER";

     5: 

     6: uch dis5[17]="temper   .00c   ";

     7: uch t;

     8:   

     9: #define DQ RC4                                //定义18B20数据端口 

    10: #define DQ_DIR TRISC4                         //定义18B20D口方向寄存器 

    11: #define DQ_HIGH() DQ_DIR =1                   //设置数据口为输入

    12: #define DQ_LOW() DQ = 0; DQ_DIR = 0           //设置数据口为输出

    13:  unsigned char  TLV=0 ;                        //采集到的温度高8位

    14:  unsigned char  THV=0;                         //采集到的温度低8位

    15:  unsigned char TZ=0;                           //转换后的温度值整数部分

    16:  unsigned char TX=0;                    //转换后的温度值小数部分

    17: //------------------------------------------------

    18: //延时函数

    19: void delay(char i) 

    20: {

    21:   while(i--);

    22:  }

    23: //------------------------------------------------

    24: //系统初始化函数

    25: void init()

    26: {

    27:   ADCON1=0X07;                                //设置A口为普通数字口

    28:   TRISD=0X00;                                 //设置D口方向为输出

    29: }

    30: //复位DS18B20函数

    31: reset(void)

    32: {

    33:   char presence=1;

    34:   while(presence)

    35:   { 

    36:     DQ_LOW() ;                                //主机拉至低电平

    37:     delay(195);                              //延时503us

    38:     DQ_HIGH();                                //释放总线等电阻拉高总线,并保持15~60us

    39:     delay(30);                               //延时70us

    40:     if(DQ==1) presence=1;                     //没有接收到应答信号,继续复位

    41:     else presence=0;                          //接收到应答信号

    42:     delay(169);                              //延时430us

    43:    }

    44: }

    45: 

    46: //-----------------------------------------------

    47: //写18b20写字节函数

    48: void write_byte(uch val)

    49: {

    50:  uch i;

    51:  uch temp;

    52:  for(i=8;i>0;i--)

    53:  {

    54:    temp=val&0x01;                            //最低位移出

    55:    DQ_LOW(); 

    56:    ;

    57:    ;

    58:    ;

    59:    ;

    60:    ;                                    //从高拉至低电平,产生写时间隙

    61:    if(temp==1)  DQ_HIGH();                   //如果写1,拉高电平

    62:    delay(27);                               //延时63us

    63:    DQ_HIGH(); 

    64:    ;

    65:    ;

    66:    val=val>>1;                               //右移一位

    67:   }

    68: }

    69: 

    70: //------------------------------------------------

    71: //18b20读字节函数

    72: uch read_byte(void)

    73: {

    74:  uch i;

    75:  uch value=0;                                //读出温度

    76:  static bit j;

    77:  for(i=8;i>0;i--)

    78:  {

    79:    value>>=1; 

    80:    DQ_LOW();

    81:    ;

    82:    ;

    83:    ;

    84:    ;

    85:    ;

    86:    ;                                   //6us

    87:    DQ_HIGH();                               //拉至高电平

    88:    ; 

    89:    ;

    90:    ;  

    91:    ; 

    92:    ;                                  //4us

    93:    j=DQ;

    94:    if(j) value|=0x80;

    95:    delay(27);                             //63us

    96:   }

    97:   return(value);

    98: }

    99: 

   100: //-------------------------------------------------

   101: //启动温度转换函数

   102: uch get_temp()

   103: { 

   104: //int i;

   105: DQ_HIGH();

   106: reset();                                 //复位等待从机应答 

   107: write_byte(0XCC);                        //忽略ROM匹配 

   108: write_byte(0X44);                        //发送温度转化命令  

   109: DQ_HIGH();

   110: reset();                                 //再次复位,等待从机应答 

   111: write_byte(0XCC);                        //忽略ROM匹配 

   112: write_byte(0XBE);                        //发送读温度命令 

   113: TLV=read_byte();                         //读出温度低8 

   114: THV=read_byte();                         //读出温度高8位 

   115: DQ_HIGH();

   116:  if(THV>0x07) 

   117: {TLV=~TLV+1;

   118:  THV=~THV;

   119:   t=1;

   120:  } 

   121:   else

   122:  t=0;                             //释放总线 

   123: TZ=(TLV>>4)|(THV<<4);               //温度整数部分

   124: TX=TLV<<4;                               //温度小数部分

   125: ;

   126: ;

   127: return TZ;

   128: }

   129: void main()//主程序

   130: {

   131:   //uchar t1,t2,t3;

   132:   char z,n,l;

   133:   init(); 

   134:    ADCON1=0X0E;

   135:    INTCON=0X00;

   136:    //INTCON2=0X40;

   137:    //INTCON3=0X00;

   138:    TRISD=0X00;

   139:    lcd_init();

   140:   while(1)

   141:   {

   142:   

   143:    lcd_pos(0);                //设置显示位置为第一行的第1个字符

   144:    z = 0;

   145:     while(dis4[z] != '\0')

   146:      {                         //显示字符"DIGITALVOLTMETER"

   147:        lcd_wdat(dis4[z]);

   148:        z++;

   149:      }

   150: 

   151:     lcd_pos(0x40);             //设置显示位置为第二行第1个字符

   152:      z = 0;

   153:     while(dis5[z] != '\0')

   154:      {

   155:        lcd_wdat(dis5[z]);      //显示字符" VOLTAGE:  .  V "

   156:        z++;

   157:      }

   158: 

   159:    n=get_temp();

   160:    l=wr(n);

   161:    lcd_pos(0x47); 

   162:    lcd_wdat(l);

   163:    //lcd_pos(0x48);

   164:    //lcd_wdat(d5);

   165: }

   166: }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -