立即注册 登录
返回首页

uid:207912的个人空间

日志

今天的程序

已有 543 次阅读2017-6-5 10:13 |个人分类:程序| 单片机, 程序

今天研究出来了基于单片机的小空间恒温控制系统。

源程序清单如下:

//ds18b20 drive program

//for 51 mcu with lcd1602 display

#include "reg52.h"

#include <intrins.h>

/*******************************************************************/

#define  HIGH      1             //高电平

#define  LOW       0            //低电平

#define  TRUE      1           //

#define  ZERO      0           //

#define  MSB       0x80

//ds18b20 part

#define  SkipRom     0xcc

#define ConvertTemperature   0x44

#define Read Scratchpad    0xbe

sbit One_Wire_Bus=P1^6;

 

void One_ Wire_ Delay (unsigned char delay_ time);

void One_Wire_Write_Byte (unsigned char oww_dat);

unsigned char One_Wire_Read_Byte(void);

void Read_18B20(void);

void Initize_One_Wire_Bus(void);

void delay(void);

/********************************************************************/

data unsigned char GetScratchpad[2];

code unsignedchardecimalH[16]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};

code unsigned char decimalL[16]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};

unsigned char Result Temperature H;//经过处理后的温度整数部分

unsigned char Result Temperature L H, Result Temperature LL;//经过处理后的温度的小数部分

data unsigned char ResultSignal;//温度为负数标志位

/********************************************************************/

void Initize_One_Wire_Bus(void)

{One_Wire_Bus=0;

 One_Wire_Delay (80); / /Bus master pulling low 488us

 One_Wire_Bus=1;

 One_Wire_Delay (25);//Resister pull up 158us;}

/********************************************************************/

/******************* ds18b20 **********************************/

void One_Wire_Delay (unsigned char delay_time)

    {

 While (delay_time) delay_time--;//Delay time us :=(8+delay_time*6)us;

}

/********************************************************************/

unsigned char One_Wire_Read_Byte (void)

{

 bit temp_bit;

 unsigned char i,result=0;

 for (i=0; i<8;i++)

 {

  One_Wire_Bus=0;

  One_Wire_Bus=1;

  temp_bit=One_Wire_Bus;

  One_Wire_Delay (9);  //delay 62 us

  If (temp_bit)

   result|=0x01<<i;

 }

 Return (result);

}

/********************************************************************/

void One_Wire_Write_Byte(unsigned char oww_dat)

 unsigned char i;

 for (i=0;i<8;i++)

 {

  One_Wire_Bus=0;

  if(oww_dat&0x01)One_Wire_Bus=1;

  One_Wire_Delay (20); //delay 128 us

  One_Wire_Bus=1;

  oww_dat>>=1;

 }

 One_Wire_Delay (10);

}

/********************************************************************/

void Read_18B20 (void)

{

 unsigned char tempH,tempL;

 Initize_One_Wire_Bus ();

 One_Wire_Write_Byte (SkipRom);

 _nop_();

 

 One_Wire_Write_Byte (ConvertTemperature);

 One_Wire_Delay (5);

 

 Initize_One_Wire_Bus ();

 One_Wire_Write_Byte (SkipRom);

 _nop_();

 One_Wire_Write_Byte (ReadScratchpad);

GetScratchpad[0]=One_Wire_Read_Byte(); //DS18B20读出的低8位温度值

GetScratchpad[1]=One_Wire_Read_Byte(); //DS18B20读出的高8位温度值

 One_Wire_Delay (120);

 tempH=(GetScratchpad[1]<<4)|(GetScratchpad[0]>>4);    //温度的整数部分

 tempL=(GetScratchpad[0]&0x0f);                     //温度的小数部分

 Initize_One_Wire_Bus();                          

 if(tempH&0x80)   //判断温度的正负值

 {

  tempH=~tempH;

  tempL=~tempL+1;

  ResultSignal=1;//温度为负数标志位

   }

   Result Temperature H=tempH; //经过处理后的温度的整数部分

   Result Temperature L=decimalL[tempL]; //经过处理的温度的小数部分十分位

Result Temperature LH=decimalH[tempL];//经过处理的温度的小数部分的百分位

 }

/********************************************************************/

 

/*******************************************************************/

//lcd part

#define  LINE1     0

#define  LINE2     1

#define  LINE1_HEAD    0x80

#define  LINE2_HEAD    0xC0

#define  LCD_DELAY_TIME   40

#define  DATA_MODE    0x38

#define  OPEN_SCREEN    0x0C

#define  DISPLAY_ADDRESS   0x80

#define  CLEARSCREEN    LCD_en_command(0x01)

#define COMMAND_SLOT

LCD1602_RS=LOW; LCD1602_RW=LOW;LCD1602_EN=LOW

#define  DATA_SLOT

LCD1602_RS=HIGH;LCD1602_RW=LOW;LCD1602_EN=LOW

//common part

#define  HIGH     1            //高电平

#define  LOW      0            //低电平

#define  TRUE      1           //

#define  ZERO      0           //

#define  MSB       0x80

//change this part at different board

#define  LCDIO     P0

sbit LCD1602_RS=P1^0;   //数据命令选择  1 data  0 command 

sbit LCD1602_RW=P1^1;   //读写选择      1 read   0 write    

sbit LCD1602_EN=P1^2;   //LCD使能信号

 

//function define

/********************************************************************/

void LCD_delay(void);//lcd 延时函数

void LCD_en_command(unsigned char command);//写命令

void LCD_en_dat(unsigned char temp);//写数据

void LCD_set_xy( unsigned char x, unsigned char y );//设置显示地址

void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);//write lcd a character function

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//write lcd string function

void LCD_init(void);//lcd 初始化.

 

//unsigned char code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};//自定义字符

/********************************************************************/

/*                  自定义字符写入CGRAM                         */

/*******************************************************************/

void writetab()

   { unsigned char i;

 LCD_en_command(0x40);

 for(i=0;i<8;i++)

 LCD_en_dat(mytab[i]);  }

/********************************************************************/

/******************** LCD PART *************************************/

void LCD_delay(void)  

{ unsigned char i;

 for(i=LCD_DELAY_TIME;i>ZERO;i--);//be sure lcd reset 

}

/********************************************************************/ 

void LCD_en_command(unsigned char command)

{

 LCDIO=command;

 COMMAND_SLOT;

 LCD_delay();

 LCD1602_EN=HIGH;

}

/********************************************************************/

void LCD_en_dat(unsigned char dat)

{

 LCDIO=dat;

 DATA_SLOT;

 LCD_delay();

 LCD1602_EN=HIGH;

}

/********************************************************************/

void LCD_set_xy( unsigned char x, unsigned char y )

{

 unsigned char address;

 if (y == LINE1)

  address = LINE1_HEAD + x;

 else  address = LINE2_HEAD + x;

 LCD_en_command(address);

}

/********************************************************************/

void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)

{  LCD_set_xy( x, y );

  LCD_en_dat(dat);  }

/********************************************************************/

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)

{  LCD_set_xy( X, Y ); //set address

    while (*s)  // write character

    { LCDIO=*s;   LCD_en_dat(*s);  

  s ++;}

}

/********************************************************************/

void LCD_init(void)

{

 unsigned char i;

 CLEARSCREEN;//clear screen

 LCD_en_command(DATA_MODE);//set 8 bit data transmission mode

 LCD_en_command(OPEN_SCREEN);//open display (enable lcd display)

 LCD_en_command(DISPLAY_ADDRESS);//set lcd first display address

 CLEARSCREEN;//clear screen

 for(i=0;i<15;i++)

     LCD_delay();

}

 

    #define uint  unsigned int

#define uchar unsigned char

    void delay(void)

{

      uint x;

      for(x=0;x<1000;x++);

}

uchar key()

{

      uchar count,cmd,key;

      key=0;

      while(key==0)

      {   P2=0x0f;

             if(P2!=0x0f)

             {   delay();

                    if(P2!=0x0f)

                    {   cmd=0xef;

                           for(count=0;count<2;count++)

                           {   P2=cmd;

                                  if((P2&0x0f)!=0x0f)

                                  {   key=(cmd&0xf0)+(P2&0x0f);

                                         key=~key;

                                         break;}

                                  else

                                  cmd=(cmd<<1)+1;

                           }

                    }

             //     else   return 0x00;

             }

      //     else    return 0x00;

      }

      P2=0x0f;

      while(P2!=0x0f);

      return(key);

    }

    int keyscan()

{

      uchar i,keycode;

             i=keybd();          

             switch(i)

             {   case 0x11:{keycode=1;}break;

                    case 0x12:{keycode=2;}break;

                    case 0x14:{keycode=3;}break;

                    case 0x18:{keycode=4;}break;

                    case 0x21:{keycode=5;}break;

                    case 0x22:{keycode=6;}break;

                    case 0x24:{keycode=7;}break;

                    case 0x28:{keycode=8;}break;

                    default:{keycode=0;}break;

             }

             return keycode;


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部