久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

立即注冊 登錄
返回首頁

uid:207912的個人空間

日志

今天的程序

已有 583 次閱讀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 單片機教程網

返回頂部
主站蜘蛛池模板: 盗摄精品av一区二区三区 | 日韩影院一区 | 日韩成人在线观看 | 亚洲欧美精品一区 | 特黄一级 | 国产日韩久久 | 四虎永久免费在线 | 亚洲福利免费 | 成人免费在线小视频 | 99久久国产综合精品麻豆 | 日本淫视频 | 欧美xxxx做受欧美 | 久久久久久久av麻豆果冻 | 久热爱 | 久久国品片 | 亚洲午夜一区二区 | 久久久久久久av麻豆果冻 | 看片天堂| 国内91在线 | 蜜桃在线视频 | 欧美一区永久视频免费观看 | 九久久| 成年男女免费视频网站 | 少妇久久久久 | 欧美一级二级视频 | 亚洲精品一区二区三区在线 | 国产1区2区 | 亚洲欧美日韩中文在线 | 国产成人麻豆免费观看 | 欧美一级大片 | 蜜桃在线视频 | 久久精品中文 | 国产一区二区三区免费 | 91国内外精品自在线播放 | 中文字幕高清 | 久久视频精品在线 | 国产精品久久久久久久免费大片 | 91免费入口| 久久久爽爽爽美女图片 | 午夜伦4480yy私人影院 | 国产欧美精品一区二区 |