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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

各位大佬,看看這個程序有什么錯嗎?前邊是用一個前輩的,后邊我自己改的

[復制鏈接]
回帖獎勵 16 黑幣 回復本帖可獲得 8 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:734734 發表于 2020-4-25 18:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg52.h>                                         //預處理命令,定義SFR的頭文件
#include <math.h>
#define uchar unsigned char                              //定義縮寫字符uchar
#define uint  unsigned int                             //定義縮寫字符uint
#define lcd_data P0                                      //定義LCD1602接口 P0
sbit led=P1^0;                                              //定義加熱燈為p1.0引腳
sbit DQ =P1^7;                                           //將DQ位定義為P1.7引腳
sbit lcd_RS=P2^0;                                        //將RS位定義為P2.0引腳
sbit lcd_RW=P2^1;                                       //將RW位定義為P2.1引腳
sbit lcd_EN=P2^2;                                        //將EN位定義為P2.2引腳
sbit PWM=P3^7;                                      //將PWM定義為P3.7引腳
sbit D=P3^6;                                  //將d定義為P3.6引腳,轉向選擇位
uchar t[2],speed,temperature;  //用來存放溫度值,測溫程序就是通過這個數組與主函數通信的
uchar DS18B20_is_ok;
ucharTempBuffer1[12]={0x20,0x20,0x20,0x20,0xdf,0x43,'\0'};
uchartab[16]={0x20,0x20,0x20,0x54,0x20,0x4d,0x6f,0x6e,0x69,0x74,0x6f,0x72,'\0'};
                                                                      //顯示"T Monitor"
/**********lcd顯示子程序************/
voiddelay_20ms(void)                         /*延時20ms函數*/
{
uchar i,temp;                               //聲明變量i,temp
for(i = 20;i > 0;i--)                              //循環
{
temp = 248;                         //給temp賦值248
while(--temp);                        //temp減1是否等于0,否則繼續執行該行
temp = 248;                         //給temp賦值248
while(--temp);                        //temp減1是否等于0,否則繼續執行該行
}
}
void delay_38us(void)                                    /*延時38us函數*/
{   
uchar temp;                                //聲明變量temp
temp = 18;                                 //給temp賦值
while(--temp);                               //temp減1是否等于0,否則繼續執行該行
}
void delay_1520us(void)                         /*延時1520us函數*/
{  
uchar i,temp;                                     //聲明變量i,temp
for(i = 3;i > 0;i--)                               //循環
{
temp = 252;                               //給temp賦值
while(--temp);                        //temp減1是否等于0,否則繼續執行該行
}
}
uchar lcd_rd_status( )                                   /*讀取lcd1602的狀態,主要用于判斷忙*/
{
uchar tmp_sts;                                  //聲明變量tmp_sts
lcd_data = 0xff;                                   //初始化P3口
lcd_RW = 1;                             //RW =1  讀      
lcd_RS = 0;                              //RS =0  命令,合起來表示讀命令(狀態)
lcd_EN = 1;    //EN=1,打開EN,LCD1602開始輸出命令數據,100nS之后命令數據
//100nS之后命令數據有效
tmp_sts = lcd_data;                               //讀取命令到tmp_sts
lcd_EN = 0;                              //關掉LCD1602
lcd_RW = 0;                             //把LCD1602設置成寫
return tmp_sts;                                  //函數返回值tmp_sts
}
void lcd_wr_com(uchar command )                    /*寫一個命令到LCD1602*/
{
while(0x80&lcd_rd_status()); //先判斷LCD1602是否忙,看讀出的命令的最高位是否為1,
//為1表示忙,繼續讀,直到不忙
lcd_RW = 0;
lcd_RS = 0;                                       //W=0,RS=0 寫命令
lcd_data = command;                             //需要寫的命令寫到數據線上
lcd_EN = 1;
lcd_EN = 0;                                       //EN輸出高電平脈沖,命令寫入
}
void lcd_wr_data(uchar sjdata )                          /*寫一個顯示數據到lcd1602*/
{      while(0x80&lcd_rd_status());  //判斷1602是否忙,最高位為1表示忙,繼續讀,直到不忙
lcd_RW = 0;
lcd_RS = 1;                                      //RW=0,RS=1 寫顯示數據
lcd_data = sjdata ;                                //把需要寫的顯示數據寫到數據線上
lcd_EN = 1;
lcd_EN = 0;                               //EN輸出高電平脈沖,命令寫入
lcd_RS = 0;                 
}
void Init_lcd(void)                                  /*初始化lcd1602*/
{
delay_20ms();                                    //調用延時
lcd_wr_com(0x38);                               //設置16*2格式,5*8點陣,8位數據接口
delay_38us();                                     //調用延時
lcd_wr_com(0x0c);                                //開顯示,不顯示光標
delay_38us();                                     //調用延時
lcd_wr_com(0x01);                               //清屏
delay_1520us();                                  //調用延時
lcd_wr_com(0x06);                               //顯示一個數據后光標自動+1
}      
void GotoXY(uchar x, uchar y)                            //設定位置,x為行,y為列
{
              if(y==0)                                          //如果y=0,則顯示位置為第一行
              lcd_wr_com(0x80|x);
              if(y==1)
              lcd_wr_com(0xc0|x);                             //如果y=1,則顯示位置為第二行
}
void Print(uchar *str)                                   //顯示字符串函數
{
              while(*str!='\0')                                     //判斷字符串是否顯示完
              {
                     lcd_wr_data(*str);                    //寫數據
                     str++;                             
              }
}
void LCD_Print(uchar x, uchar y, uchar*str)        //x為行值,y為列值,str是要顯示的字符串
{
GotoXY(x,y);                                    //設定顯示位置
Print(str);                                              //顯示字符串
}
       /*****************系統顯示子函數*****************/
void covert1()                                     //溫度轉化程序
{
uchar x=0x00;                                       //變量初始化
if(t[1]>0x07)                                 //判斷正負溫度
{
TempBuffer1[0]=0x2d;                          //0x2d為"-"的ASCII碼
                     t[1]=~t[1];                                    //負數的補碼
                     t[0]=~t[0];                                  //換算成絕對值
                     x=t[0]+1;                                        //加1
                     t[0]=x;                                     //把x的值送入t[0]
                     if(x>255)                             //如果x大于255
                     t[1]++;                                     //t[1]加1
              }
      else
             TempBuffer1[0]=0x2b;                          //0xfe為變"+"的ASCII碼
      t[1]<<=4;                                         //將高字節左移4位
     t[1]=t[1]&0x70;                                   //取出高字節的3個有效數字位
     x=t[0];                                            //將t[0]暫存到X,因為取小數部分還要用到它
           x>>=4;                                          //右移4位
           x=x&0x0f;                                              //和前面兩句就是取出t[0]的高四位   
           t[1]=t[1]|x;                                             //將高低字節有效值的整數部分拼成一個字節
           temperature=t[1];
           TempBuffer1[1]=t[1]/100+0x30;                     //加0x30為變 0~9 ASCII碼
           if(TempBuffer1[1]==0x30)                            //如果百位為0
           TempBuffer1[1]=0xfe;                             //百位數消隱
           TempBuffer1[2]=(t[1]%100)/10+0x30;           //分離出十位
           TempBuffer1[3]=(t[1]%100)%10+0x30;         //分離出個位
}                    
/*******************DS18B20函數**********************/
void delay_18B20(uint i)                                //延時程序
{
              while(i--);
}
void Init_DS18B20(void)                               //ds18b20初始化函數
{
             ucharx=0;
             DQ =1;                                           //DQ復位
             delay_18B20(8);                                    //稍做延時
             DQ =0;                                           //單片機將DQ拉低
             delay_18B20(80);                                 //精確延時大于480us
             DQ =1;                                           //拉高總線
             delay_18B20(14);
             x=DQ;                                            //延時后如果x=0則初始化成功 x=1則失敗
               delay_18B20(20);
}
uchar ReadOneChar(void)                                  //ds18b20讀一個字節函數
{
              unsignedchar i=0;
              unsignedchar dat0 = 0;
              for(i=8;i>0;i--)
             {
                     DQ= 0;                             //讀前總線保持為低
                     dat0>>=1;
                     DQ= 1;                             //開始讀總線釋放
                     if(DQ)                                       //從DS18B20總線讀得一位
                     dat0|=0x80;
                     delay_18B20(4);                             //延時一段時間
             }
      return(dat0);                                //返回數據
}
void WriteOneChar(uchar dat1)                          //ds18b20寫一個字節函數
{
              uchari=0;
              for(i=8; i>0; i--)
              {
                     DQ= 0;                                     //開始寫DS18B20總線要處于復位(低)狀態
                     DQ= dat1&0x01;                      //寫入下一位
                  delay_18B20(5);
             DQ = 1;                                     //重新釋放總線
                  dat1>>=1;                                       //把一個字節分成8個BIT環移給DQ
      }
}
void ReadTemperature()                                   //讀取ds18b20當前溫度
{      
              delay_18B20(80);                              //延時一段時間
              Init_DS18B20();   
              WriteOneChar(0xCC);                                    //跳過讀序號列號的操作
              WriteOneChar(0x44);                            //啟動溫度轉換
              delay_18B20(80);                                //延時一段時間
              Init_DS18B20();                                      //DS18B20初始化
              WriteOneChar(0xCC);                           //跳過讀序號列號的操作
              WriteOneChar(0xBE);                            //讀取溫度寄存器等(共可讀9個寄存器)                          delay_18B20(80);                                       //延時一段時間
t[0]=ReadOneChar();                               //讀取溫度值低位
              t[1]=ReadOneChar();                               //讀取溫度值高位
}
void delay_motor(uchar i)                             //延時函數
{
              ucharj,k;                                  //變量i、k為無符號字符數據類型
              for(j=i;j>0;j--)                                 //循環延時
                     for(k=200;k>0;k--);                    //循環延時
}
/*******************電機轉動程序*******************/
void motor(uchar tmp)            
{    uchar x;
     if(TempBuffer1[0]==0x2b)                      //溫度為正數
              {
                         if(tmp<25&&tmp>18)                                            //溫度大于18度小于25
                     {
                           led=0;                                        //燈滅
                           D=0;                                          //電機停止轉動
                           PWM=0;
                     }
                     else if(tmp>25)                                 //溫度大于25度,全速轉動
                            {
                                   led=0;                        //燈滅
                                   D=0;                                  //D置0
                                   PWM=1;             //正轉,PWM=1
                        x=250;                              //時間常數為x
                        delay_motor(x);                        //調延時函數
                                  PWM=0;                    //PWM=0
                        x=5;                                    //時間常數為x
                                delay_motor(x);                 //調延時函數
                            }
                            else if(tmp<18)
                            {   
                                   led=1;                                  //燈亮
                                   D=1;                                  //D置1
                                  PWM=0;             //正轉,PWM=0
                       x=5*tmp;                           //時間常數為x
                       delay_motor(x);                  //調延時函數
                                  PWM=1;                    //PWM=0
                       x=255-5*tmp;                       //時間常數為255-x
                               delay_motor(x);            //調延時函數
                         }
                     }
}      
void delay(unsigned int x)                                 //延時函數名
{
unsigned char i;                            //定義變量i的類型
while(x--)                                    //x自減1
{
for(i=0;i<123;i++){;}                       //控制延時的循環
}
}
/*************************main主程序*********************/
void main(void)
{
delay_20ms();                                         //系統延時20ms啟動
              ReadTemperature();                              //啟動DS18B20
     Init_lcd();                                      //調用LCD初始化函數
              LCD_Print(0,0,tab);                                //液晶初始顯示
              delay(1000);                                   //延時一段時間
              while(1)
{      
                    ReadTemperature();                      //讀取溫度并存放在一個兩個字節的數組中
                         delay_18B20(100);
                         covert1();                                        //數據轉化
                         LCD_Print(4,1,TempBuffer1);               //顯示溫度
                     motor(temperature);                     //電機轉動
              }
}

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产色综合久久 | 国产小视频在线观看 | 国产精品毛片av一区 | 久久久免费少妇高潮毛片 | 亚欧洲精品在线视频免费观看 | www.色.com| 国产日韩精品视频 | 黄色大片在线免费观看 | 国产一级一级国产 | 一色桃子av一区二区 | 99久久精品免费看国产四区 | 亚洲综合一区二区三区 | 男人天堂网站 | 亚洲国产精品久久久久婷婷老年 | 一区二区免费 | 欧美日韩亚洲在线 | 亚洲视频一区在线观看 | 在线观看免费av网 | 国产精品久久久久久久久久久久久 | 久久久青草婷婷精品综合日韩 | 亚洲国产福利视频 | 日韩中文一区二区三区 | 污视频免费在线观看 | 久久精品视频在线免费观看 | 日本爱爱视频 | 国产精品久久久久国产a级 欧美日韩国产免费 | 狠狠干狠狠操 | 婷婷中文在线 | 精品视频免费 | 亚洲一区二区三区免费在线观看 | 日韩精品一二三区 | 亚洲国产黄 | 欧美天堂| 精品乱人伦一区二区三区 | 美女福利视频 | 国产精品色 | 在线不卡视频 | 成人精品一区二区 | 天天操操操操操 | 精品久久久久香蕉网 | 久草视频在线播放 |