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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1075|回復: 4
收起左側

單片機溫控程序,溫控和溫度顯示,單獨放一個沒問題,兩個放一起電機震動不轉動

[復制鏈接]
ID:399481 發表于 2020-3-30 13:15 | 顯示全部樓層 |閱讀模式
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器

#define uchar unsigned char//宏定義
#define uint unsigned int//宏定義

#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
sbit DSPORT=P3^7;

void Delay1ms(unsigned int );
unsigned char Ds18b20Init();
void Ds18b20WriteByte(unsigned char com);
unsigned char Ds18b20ReadByte();
void  Ds18b20ChangTemp();
void  Ds18b20ReadTempCom();
int Ds18b20ReadTemp();
void Lcd1602_Delay1ms(uint c);   //誤差 0us
/*LCD1602寫入8位命令子函數*/
void LcdWriteCom(uchar com);
/*LCD1602寫入8位數據子函數*/        
void LcdWriteData(uchar dat)        ;
/*LCD1602初始化子程序*/               
void LcdInit();                                                  
uchar CNCHAR[6];
void LcdDisplay(int);
void UsartConfiguration();


sbit IN1=P2^0;//定義控制電機的單片機引腳
sbit IN2=P2^1;//定義控制電機的單片機引腳

sbit change=P3^0;//風扇換擋
sbit hand=P3^1;
sbit zidong=P3^2;
sbit ENA=P2^2;//電機使能
int speed=1;


void delay(uint z)// 作為風扇的pwm波的延時
{
        int i,j;
        for(i=10;i>0;i--)
        for(j=z;j>0;j--);
}
void guan(){IN1=0;IN2=0;LcdWriteData('0');LcdWriteCom(0x86+0x40);}
void yi(){IN1=0;IN2=1;ENA=1;delay(100);ENA=0;delay(200);LcdWriteData('1');LcdWriteCom(0x86+0x40);}
void er(){IN1=0;IN2=1;ENA=1;delay(150);ENA=0;delay(150);LcdWriteData('2');LcdWriteCom(0x86+0x40);}
void san(){IN1=0;IN2=1;ENA=1;delay(200);ENA=0;delay(100);LcdWriteData('3');LcdWriteCom(0x86+0x40);}
void si(){IN1=0;IN2=1;ENA=1;delay(200);ENA=0;delay(100);LcdWriteData('3');LcdWriteCom(0x86+0x40);}
void wu(){IN1=0;IN2=1;ENA=1;delay(100);ENA=0;delay(200);LcdWriteData('1');LcdWriteCom(0x86+0x40);}

void zhineng(int temp)
{         
        LcdWriteCom(0x86+0x40);
if (temp<=100 )          { guan();}
else if (temp>100&&temp<=150 ){          yi();        ;}  
else if (temp>150&&temp<=180 ){          er();}        
else if(temp>180&&temp<=300 )        {           san(); }
else if(temp>310&&temp<=350 )        {         si() ;        }         
else        {
                 wu();;
        }
//         switch(i)
//                           {
//                           case 0:IN1=0;IN2=0;LcdWriteData('0');LcdWriteCom(0x86+0x40);break;
//                           case 1:IN1=0;IN2=1;ENA=1;delay(100);ENA=0;delay(200);LcdWriteData('1');LcdWriteCom(0x86+0x40);break;
//                           case 2:IN1=0;IN2=1;ENA=1;delay(150);ENA=0;delay(150);LcdWriteData('2');LcdWriteCom(0x86+0x40);break;
//                           case 3:IN1=0;IN2=1;ENA=1;delay(200);ENA=0;delay(100);LcdWriteData('3');LcdWriteCom(0x86+0x40);break;
//                           case 4:IN1=0;IN2=1;ENA=1;delay(250);ENA=0;delay(50);LcdWriteData('4');LcdWriteCom(0x86+0x40);break;
//                           case 5:IN1=0;IN2=1;ENA=1;delay(300);ENA=0;delay(0);LcdWriteData('5');LcdWriteCom(0x86+0x40);break;        
// }

}                        

//void  shoudong(void)
//{  
//if(change == 0)
//                        {         
//                        Delay1ms(20);
//                        if(change== 0)        
//                                {
//                                speed=speed+1;
//                        if(speed==6)
//                                {speed=0;}
//                                }
//                           switch(speed)
//                           {
//                           switch(speed)
//                           {
//                           case 0:IN1=0;IN2=0;LcdWriteData('0');LcdWriteCom(0x80);break;
//                           case 1:IN1=0;IN2=1;ENA=1;delay(100);ENA=0;delay(200);LcdWriteData('1');LcdWriteCom(0x86+0x40);break;
//                           case 2:IN1=0;IN2=1;ENA=1;delay(150);ENA=0;delay(150);LcdWriteData('2');LcdWriteCom(0x86+0x40);break;
//                           case 3:IN1=0;IN2=1;ENA=1;delay(200);ENA=0;delay(100);LcdWriteData('3');LcdWriteCom(0x86+0x40);break;
//                           case 4:IN1=0;IN2=1;ENA=1;delay(250);ENA=0;delay(50);LcdWriteData('4');LcdWriteCom(0x86+0x40);break;
//                           case 5:IN1=0;IN2=1;ENA=1;delay(300);ENA=0;delay(0);LcdWriteData('5');LcdWriteCom(0x86+0x40);break;
//                          
//                           }
//                        
//                          
//                           }  
//                        }while(!change);   
// }
/*******************************************************************************
* 函數名         : main
* 函數功能                   : 主函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void main()
{
        UsartConfiguration();
        LcdInit();                         //初始化LCD1602
        while(1)

        {        
                  
                zhineng(Ds18b20ReadTemp());//溫控
                LcdDisplay(Ds18b20ReadTemp());//顯示
        
        }
        }

               
                        
        
/*******************************************************************************
* 函數名         : LcdDisplay()
* 函數功能                   : LCD顯示讀取到的溫度
* 輸入           : v
* 輸出                  : 無
*******************************************************************************/
void LcdDisplay(int temp)          //lcd顯示當前溫度值
{
          uchar  datas[] = {0, 0, 0}; //定義數組
                LcdWriteCom(0x80);                //寫地址 80表示初始地址
            LcdWriteData('T');                 //顯示
                LcdWriteCom(0x81);               
            LcdWriteData('e');                 
                LcdWriteCom(0x82);               
            LcdWriteData('m');                 
                LcdWriteCom(0x83);        
            LcdWriteData('p');                 
                LcdWriteCom(0x84);        
            LcdWriteData(':');
                LcdWriteCom(0x80+0x40);        //寫地址 80表示初始地址
        LcdWriteData('S');
        LcdWriteCom(0x81+0x40);        //寫地址 80表示初始地址
        LcdWriteData('p');
        LcdWriteCom(0x82+0x40);        //寫地址 80表示初始地址
        LcdWriteData('e');
        LcdWriteCom(0x83+0x40);        //寫地址 80表示初始地址
        LcdWriteData('e');
        LcdWriteCom(0x84+0x40);        //寫地址 80表示初始地址
        LcdWriteData('d');
        LcdWriteCom(0x85+0x40);        //寫地址 80表示初始地址
        LcdWriteData(':');        
        if(temp< 0)                                //當溫度值為負數
          {
                  LcdWriteCom(0x85);                //寫地址 80表示初始地址
            LcdWriteData('-');                  //顯示負
        }
        else
        {               
        datas[0] = temp / 100;
        datas[1] = temp % 100 / 10;
        datas[2] = temp % 10;
        }
        LcdWriteCom(0x86);                  //寫地址 80表示初始地址
        LcdWriteData('0'+datas[0]); //十位
        LcdWriteCom(0x87);                 //寫地址 80表示初始地址
        LcdWriteData('0'+datas[1]); //個位
        LcdWriteCom(0x88);                //寫地址 80表示初始地址
        LcdWriteData('.');                 //顯示 ‘.’
        LcdWriteCom(0x89);                 //寫地址 80表示初始地址
        LcdWriteData('0'+datas[2]); //顯示小數點  
        LcdWriteCom(0x8A);
        LcdWriteData('C');
   }


/*******************************************************************************
* 函 數 名         :UsartConfiguration()
* 函數功能                   :設置串口
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/

void UsartConfiguration()
{
        SCON=0X50;                        //設置為工作方式1
        TMOD=0X20;                        //設置計數器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //計數器初始值設置,注意波特率是4800的
        TL1=0XF3;
    ES=1;                                                //打開接收中斷
        EA=1;                                                //打開總中斷
        TR1=1;                                        //打開計數器
}


/*******************************************************************************
* 函 數 名         : Lcd1602_Delay1ms
* 函數功能                   : 延時函數,延時1ms
* 輸    入         : c
* 輸    出         : 無
* 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c)   //誤差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
            
}

void Delay1ms(uint y)
{
        unsigned int x;
        for(y;y>0;y--)
                for(x=110;x>0;x--);
}
/*******************************************************************************
* 函 數 名         : LcdWriteCom
* 函數功能                   : 向LCD寫入一個字節的命令
* 輸    入         : com
* 輸    出         : 無
*******************************************************************************/

void LcdWriteCom(uchar com)          //寫入命令
{
        LCD1602_E = 0;     //使能
        LCD1602_RS = 0;           //選擇發送命令
        LCD1602_RW = 0;           //選擇寫入
        
        LCD1602_DATAPINS = com;     //放入命令
        Lcd1602_Delay1ms(1);                //等待數據穩定

        LCD1602_E = 1;                  //寫入時序
        Lcd1602_Delay1ms(5);          //保持時間
        LCD1602_E = 0;
}

/*******************************************************************************
* 函 數 名         : LcdWriteData
* 函數功能                   : 向LCD寫入一個字節的數據
* 輸    入         : dat
* 輸    出         : 無
*******************************************************************************/                  
                  
void LcdWriteData(uchar dat)                        //寫入數據
{
        LCD1602_E = 0;        //使能清零
        LCD1602_RS = 1;        //選擇輸入數據
        LCD1602_RW = 0;        //選擇寫入

        LCD1602_DATAPINS = dat; //寫入數據
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;   //寫入時序
        Lcd1602_Delay1ms(5);   //保持時間
        LCD1602_E = 0;
}

/*******************************************************************************
* 函 數 名       : LcdInit()
* 函數功能                 : 初始化LCD屏
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/                  
void LcdInit()                                                  //LCD初始化子程序
{
         LcdWriteCom(0x38);  //開顯示
        LcdWriteCom(0x0c);  //開顯示不顯示光標
        LcdWriteCom(0x06);  //寫一個指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設置數據指針起點
}
/*******************************************************************************
* 函數名         : Ds18b20Init
* 函數功能                   : 初始化
* 輸入           : 無
* 輸出                  : 初始化成功返回1,失敗返回0
*******************************************************************************/

unsigned char Ds18b20Init()
{
        unsigned int i;
        DSPORT=0;                         //將總線拉低480us~960us
        i=70;        
        while(i--);//延時642us
        DSPORT=1;                        //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
        i=0;
        while(DSPORT)        //等待DS18B20拉低總線
        {
                i++;
                if(i>5000)//等待>5MS
                        return 0;//初始化失敗        
        }
        return 1;//初始化成功
}

/*******************************************************************************
* 函數名         : Ds18b20WriteByte
* 函數功能                   : 向18B20寫入一個字節
* 輸入           : com
* 輸出                  : 無
*******************************************************************************/

void Ds18b20WriteByte(unsigned char dat)
{
        unsigned int i,j;
        for(j=0;j<8;j++)
        {
                DSPORT=0;                        //每寫入一位數據之前先把總線拉低1us
                i++;
                DSPORT=dat&0x01; //然后寫入一個數據,從最低位開始
                i=6;
                while(i--); //延時68us,持續時間最少60us
                DSPORT=1;        //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
                dat>>=1;
        }
}
/*******************************************************************************
* 函數名         : Ds18b20ReadByte
* 函數功能                   : 讀取一個字節
* 輸入           : com
* 輸出                  : 無
*******************************************************************************/
unsigned char Ds18b20ReadByte()
{
        unsigned char byte,bi;
        unsigned int i,j;        
        for(j=8;j>0;j--)
        {
                DSPORT=0;//先將總線拉低1us
                i++;
                DSPORT=1;//然后釋放總線
                i++;
                i++;//延時6us等待數據穩定
                bi=DSPORT;         //讀取數據,從最低位開始讀取
                /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
                byte=(byte>>1)|(bi<<7);                                                  
                i=4;                //讀取完之后等待48us再接著讀取下一個數
                while(i--);
        }                                
        return byte;
}
/*******************************************************************************
* 函數名         : Ds18b20ChangTemp
* 函數功能                   : 讓18b20開始轉換溫度
* 輸入           : com
* 輸出                  : 無
*******************************************************************************/

void  Ds18b20ChangTemp()
{
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);                //跳過ROM操作命令                 
        Ds18b20WriteByte(0x44);            //溫度轉換命令
//        Delay1ms(100);        //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了

}
/*******************************************************************************
* 函數名         : Ds18b20ReadTempCom
* 函數功能                   : 發送讀取溫度命令
* 輸入           : com
* 輸出                  : 無
*******************************************************************************/

void  Ds18b20ReadTempCom()
{        

        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);         //跳過ROM操作命令
        Ds18b20WriteByte(0xbe);         //發送讀取溫度命令
}
/*******************************************************************************
* 函數名         : Ds18b20ReadTemp
* 函數功能                   : 讀取溫度
* 輸入           : com
* 輸出                  : 無
*******************************************************************************/

Ds18b20ReadTemp()
{
        int temp=0;
        unsigned char tmh,tml;
        Ds18b20ChangTemp();                                 //先寫入轉換命令
        Ds18b20ReadTempCom();                        //然后等待轉換完后發送讀取溫度命令
        tml=Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節
        tmh=Ds18b20ReadByte();                //再讀高字節
        temp=tmh;
        temp<<=8;
        temp|=tml;
                if(temp< 0)                                //當溫度值為負數
          {
                temp=~(temp-1);
                temp=temp*0.625+0.5;        
          }
         else
          {
                temp=temp*0.625+0.5;        
        }
        return(temp);

}


回復

使用道具 舉報

ID:584814 發表于 2020-3-30 17:01 | 顯示全部樓層
              LcdWriteCom(0x80);                //寫地址 80表示初始地址
            LcdWriteData('T');                 //顯示
                LcdWriteCom(0x81);               
            LcdWriteData('e');                 
                LcdWriteCom(0x82);               
            LcdWriteData('m');                 
                LcdWriteCom(0x83);        
            LcdWriteData('p');                 
                LcdWriteCom(0x84);        
            LcdWriteData(':');
                LcdWriteCom(0x80+0x40);        //寫地址 80表示初始地址
        LcdWriteData('S');
        LcdWriteCom(0x81+0x40);        //寫地址 80表示初始地址
        LcdWriteData('p');
        LcdWriteCom(0x82+0x40);        //寫地址 80表示初始地址
        LcdWriteData('e');
        LcdWriteCom(0x83+0x40);        //寫地址 80表示初始地址
        LcdWriteData('e');
        LcdWriteCom(0x84+0x40);        //寫地址 80表示初始地址
        LcdWriteData('d');
        LcdWriteCom(0x85+0x40);        //寫地址 80表示初始地址
        LcdWriteData(':');        
感覺這寫法像是按代碼行數拿工錢的
回復

使用道具 舉報

ID:420836 發表于 2020-3-30 23:39 | 顯示全部樓層
在zhineng()中使用了許多單行注釋,僅注釋了第一條語句,但隨后的所有語句均被執行。
回復

使用道具 舉報

ID:215579 發表于 2020-3-31 09:15 | 顯示全部樓層
你不考慮運行的時序的?
你應該把顯示押后到100ms或者更久刷新一次
先把用一組變量當顯存,時間到就填入顯示,沒有道理要連續寫兩次的
顯示對于單片機執行的優先度是非常次的,不需要用大部分資源來刷新顯示
回復

使用道具 舉報

ID:399481 發表于 2020-3-31 11:57 來自觸屏版 | 顯示全部樓層
心靜自能止水 發表于 2020-3-31 09:15
你不考慮運行的時序的?
你應該把顯示押后到100ms或者更久刷新一次
先把用一組變量當顯存,時間到就填入顯 ...

好嘛,我先試試,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产综合精品一区二区三区 | 51ⅴ精品国产91久久久久久 | 亚洲成av人片在线观看无码 | 在线观看成年人视频 | 欧美成人精品一区 | 精品福利视频一区二区三区 | 一区天堂 | 亚洲精品中文在线观看 | 中文字幕在线网 | 国产精品成人一区二区三区 | 亚洲国产网站 | 在线视频一区二区 | a级黄色片视频 | 国产精品久久久久久福利一牛影视 | 中文字幕精品一区二区三区精品 | 99热精品在线 | 精品一区二区三区在线视频 | 国产免费av在线 | 黄色网页在线 | 国产精品久久久久久久岛一牛影视 | 亚洲在线视频 | 色婷婷久久久久swag精品 | 亚洲免费人成在线视频观看 | 亚洲男人网| 国产成人在线一区 | 免费成人在线网站 | 成人亚洲一区 | www.蜜桃av| 曰韩一二三区 | 国产综合精品一区二区三区 | hsck成人网 | 久久亚洲一区 | 综合久久久久 | 中文字幕一区二区三区四区 | 91一区| 久久成人精品视频 | 国产第一页在线观看 | 亚洲色欧美另类 | 美女日批免费视频 | 久久成人精品一区二区三区 | 黄色免费在线观看 |