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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3603|回復: 1
打印 上一主題 下一主題
收起左側

基于單片機的恒溫系統控制(程序)

[復制鏈接]
跳轉到指定樓層
樓主
ID:207912 發表于 2017-6-5 09:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
源程序清單如下:
//ds18b20 driveprogram
//for 51 mcuwith 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
#defineConvertTemperature   0x44
#define Read Scratchpad    0xbe
sbitOne_Wire_Bus=P1^6;
void One_ Wire_ Delay(unsigned char delay_ time);
voidOne_Wire_Write_Byte (unsigned char oww_dat);
unsigned charOne_Wire_Read_Byte(void);
voidRead_18B20(void);
voidInitize_One_Wire_Bus(void);
voiddelay(void);
/********************************************************************/
data unsignedchar GetScratchpad[2];
code unsignedchardecimalH[16]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
code unsignedchar decimalL[16]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};
unsigned charResult Temperature H;//經過處理后的溫度整數部分
unsigned charResult Temperature L H, Result Temperature LL;//經過處理后的溫度的小數部分
data unsignedchar ResultSignal;//溫度為負數標志位
/********************************************************************/
voidInitize_One_Wire_Bus(void)
{One_Wire_Bus=0;
One_Wire_Delay (80); / /Bus master pulling low488us
One_Wire_Bus=1;
One_Wire_Delay (25);//Resister pull up 158us;}
/********************************************************************/
/*******************ds18b20 **********************************/
voidOne_Wire_Delay (unsigned char delay_time)
    {
While (delay_time) delay_time--;//Delay timeus :=(8+delay_time*6)us;
}
/********************************************************************/
unsigned charOne_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);
}
/********************************************************************/
voidOne_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 thispart at different board
#define  LCDIO    P0
sbitLCD1602_RS=P1^0;   //數據命令選擇  1 data 0 command  
sbitLCD1602_RW=P1^1;   //讀寫選擇      1 read  0 write     
sbitLCD1602_EN=P1^2;   //LCD使能信號
//function define
/********************************************************************/
voidLCD_delay(void);//lcd 延時函數
voidLCD_en_command(unsigned char command);//寫命令
voidLCD_en_dat(unsigned char temp);//寫數據
void LCD_set_xy(unsigned char x, unsigned char y );//設置顯示地址
voidLCD_write_char( unsigned x,unsigned char y,unsigned char dat);//write lcd acharacter function
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char*s);//write lcd string function
voidLCD_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);  }
/********************************************************************/
/******************** LCD PART*************************************/
voidLCD_delay(void)   
{ unsigned chari;
for(i=LCD_DELAY_TIME;i>ZERO;i--);//be surelcd reset  
}
/********************************************************************/  
voidLCD_en_command(unsigned char command)
{
LCDIO=command;
COMMAND_SLOT;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
voidLCD_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);
}
/********************************************************************/
voidLCD_write_char( unsigned x,unsigned char y,unsigned char dat)
{  LCD_set_xy( x, y );
  LCD_en_dat(dat);  }
/********************************************************************/
voidLCD_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 ++;}
}
/********************************************************************/
voidLCD_init(void)
{
unsigned char i;
CLEARSCREEN;//clear screen
LCD_en_command(DATA_MODE);//set 8 bit datatransmission mode
LCD_en_command(OPEN_SCREEN);//open display(enable lcd display)
LCD_en_command(DISPLAY_ADDRESS);//set lcdfirst display address
CLEARSCREEN;//clear screen
for(i=0;i<15;i++)
     LCD_delay();
}
    #defineuint  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;

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:326690 發表于 2021-4-8 12:07 | 只看該作者
這段代碼是要實現什么功能呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美日韩电影 | 精品一区二区三区在线播放 | 一级免费毛片 | 黄色成人国产 | 亚洲av毛片成人精品 | 一区二区三区中文字幕 | 激情a| 免费一区二区三区在线视频 | 国产乱码久久久 | 中文字幕视频免费 | 日本黄色的视频 | 天天天天操| 亚洲二区在线 | 国产特一级黄色片 | 91九色在线观看 | 99精品免费久久久久久久久日本 | 国产高清在线视频 | 91最新入口| 亚洲欧美在线一区 | 午夜小视频在线播放 | 久久国产成人午夜av影院武则天 | 成人免费精品视频 | 91精品一区二区三区久久久久久 | 在线免费观看a级片 | 久久久日韩精品一区二区三区 | 成人av在线大片 | 99国产视频 | 97伦理电影网 | 日韩一区二区三区在线视频 | 日韩高清一区 | 99精品国自产在线 | 日韩视频1 | 欧美电影免费观看 | 欧美日韩视频在线 | 色婷婷久久综合 | 中文字幕成人在线 | 国产日韩精品一区 | 91精品久久久 | 亚洲国产一区二区三区在线观看 | 最新中文字幕久久 | 涩涩片影院 |