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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5193|回復(fù): 1
收起左側(cè)

基于51單片機的溫度控制直流電機的轉(zhuǎn)動Proteus仿真+程序

[復(fù)制鏈接]
ID:489234 發(fā)表于 2019-5-24 11:18 | 顯示全部樓層 |閱讀模式
0度到24度電機不運行,25開始運行,50度全速運行,0度以下反轉(zhuǎn)

電路原理圖如下:
QQ瀏覽器截圖20190524111610.png
0.png
代碼如下:
#include<reg51.h>                                         //預(yù)處理命令,定義SFR的頭文件
#include <math.h>
#define uchar unsigned char                              //定義縮寫字符uchar
#define uint  unsigned int                             //定義縮寫字符uint
#define lcd_data P0                                      //定義LCD1602接口 P0
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引腳,轉(zhuǎn)向選擇位
uchar t[2],speed,temperature;  //用來存放溫度值,測溫程序就是通過這個數(shù)組與主函數(shù)通信的
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函數(shù)*/
{
uchar i,temp;                               //聲明變量i,temp
for(i = 20;i > 0;i--)                              //循環(huán)
{
temp = 248;                         //給temp賦值248
while(--temp);                        //temp減1是否等于0,否則繼續(xù)執(zhí)行該行
temp = 248;                         //給temp賦值248
while(--temp);                        //temp減1是否等于0,否則繼續(xù)執(zhí)行該行
}
}
void delay_38us(void)                                    /*延時38us函數(shù)*/
{   
uchar temp;                                //聲明變量temp
temp = 18;                                 //給temp賦值
while(--temp);                               //temp減1是否等于0,否則繼續(xù)執(zhí)行該行
}
void delay_1520us(void)                         /*延時1520us函數(shù)*/
{  
uchar i,temp;                                     //聲明變量i,temp
for(i = 3;i > 0;i--)                               //循環(huán)
{
temp = 252;                               //給temp賦值
while(--temp);                        //temp減1是否等于0,否則繼續(xù)執(zhí)行該行
}
}
uchar lcd_rd_status( )                                   /*讀取lcd1602的狀態(tài),主要用于判斷忙*/
{
uchar tmp_sts;                                  //聲明變量tmp_sts
lcd_data = 0xff;                                   //初始化P3口
lcd_RW = 1;                             //RW =1  讀      
lcd_RS = 0;                              //RS =0  命令,合起來表示讀命令(狀態(tài))
lcd_EN = 1;    //EN=1,打開EN,LCD1602開始輸出命令數(shù)據(jù),100nS之后命令數(shù)據(jù)
//100nS之后命令數(shù)據(jù)有效
tmp_sts = lcd_data;                               //讀取命令到tmp_sts
lcd_EN = 0;                              //關(guān)掉LCD1602
lcd_RW = 0;                             //把LCD1602設(shè)置成寫
return tmp_sts;                                  //函數(shù)返回值tmp_sts
}
void lcd_wr_com(uchar command )                    /*寫一個命令到LCD1602*/
{
while(0x80&lcd_rd_status()); //先判斷LCD1602是否忙,看讀出的命令的最高位是否為1,
//為1表示忙,繼續(xù)讀,直到不忙
lcd_RW = 0;
lcd_RS = 0;                                       //W=0,RS=0 寫命令
lcd_data = command;                             //需要寫的命令寫到數(shù)據(jù)線上
lcd_EN = 1;
lcd_EN = 0;                                       //EN輸出高電平脈沖,命令寫入
}
void lcd_wr_data(uchar sjdata )                          /*寫一個顯示數(shù)據(jù)到lcd1602*/
{      while(0x80&lcd_rd_status());  //判斷1602是否忙,最高位為1表示忙,繼續(xù)讀,直到不忙
lcd_RW = 0;
lcd_RS = 1;                                      //RW=0,RS=1 寫顯示數(shù)據(jù)
lcd_data = sjdata ;                                //把需要寫的顯示數(shù)據(jù)寫到數(shù)據(jù)線上
lcd_EN = 1;
lcd_EN = 0;                               //EN輸出高電平脈沖,命令寫入
lcd_RS = 0;                 
}
void Init_lcd(void)                                  /*初始化lcd1602*/
{
delay_20ms();                                    //調(diào)用延時
lcd_wr_com(0x38);                               //設(shè)置16*2格式,5*8點陣,8位數(shù)據(jù)接口
delay_38us();                                     //調(diào)用延時
lcd_wr_com(0x0c);                                //開顯示,不顯示光標(biāo)
delay_38us();                                     //調(diào)用延時
lcd_wr_com(0x01);                               //清屏
delay_1520us();                                  //調(diào)用延時
lcd_wr_com(0x06);                               //顯示一個數(shù)據(jù)后光標(biāo)自動+1
}      
void GotoXY(uchar x, uchar y)                            //設(shè)定位置,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)                                   //顯示字符串函數(shù)
{
              while(*str!='\0')                                     //判斷字符串是否顯示完
              {
                     lcd_wr_data(*str);                    //寫數(shù)據(jù)
                     str++;                             
              }
}
void LCD_Print(uchar x, uchar y, uchar*str)        //x為行值,y為列值,str是要顯示的字符串
{
GotoXY(x,y);                                    //設(shè)定顯示位置
Print(str);                                              //顯示字符串
}
       /*****************系統(tǒng)顯示子函數(shù)*****************/
void covert1()                                     //溫度轉(zhuǎn)化程序
{
uchar x=0x00;                                       //變量初始化
if(t[1]>0x07)                                 //判斷正負溫度
{
TempBuffer1[0]=0x2d;                          //0x2d為"-"的ASCII碼
                     t[1]=~t[1];                                    //負數(shù)的補碼
                     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;                                         //將高字節(jié)左移4位
     t[1]=t[1]&0x70;                                   //取出高字節(jié)的3個有效數(shù)字位
     x=t[0];                                            //將t[0]暫存到X,因為取小數(shù)部分還要用到它
           x>>=4;                                          //右移4位
           x=x&0x0f;                                              //和前面兩句就是取出t[0]的高四位   
           t[1]=t[1]|x;                                             //將高低字節(jié)有效值的整數(shù)部分拼成一個字節(jié)
           temperature=t[1];
           TempBuffer1[1]=t[1]/100+0x30;                     //加0x30為變 0~9 ASCII碼
           if(TempBuffer1[1]==0x30)                            //如果百位為0
           TempBuffer1[1]=0xfe;                             //百位數(shù)消隱
           TempBuffer1[2]=(t[1]%100)/10+0x30;           //分離出十位
           TempBuffer1[3]=(t[1]%100)%10+0x30;         //分離出個位
}                    
/*******************DS18B20函數(shù)**********************/
void delay_18B20(uint i)                                //延時程序
{
              while(i--);
}
void Init_DS18B20(void)                               //ds18b20初始化函數(shù)
{
             ucharx=0;
             DQ =1;                                           //DQ復(fù)位
             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讀一個字節(jié)函數(shù)
{
              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);                                //返回數(shù)據(jù)
}
void WriteOneChar(uchar dat1)                          //ds18b20寫一個字節(jié)函數(shù)
{
              uchari=0;
              for(i=8; i>0; i--)
              {
                     DQ= 0;                                     //開始寫DS18B20總線要處于復(fù)位(低)狀態(tài)
                     DQ= dat1&0x01;                      //寫入下一位
                  delay_18B20(5);
             DQ = 1;                                     //重新釋放總線
                  dat1>>=1;                                       //把一個字節(jié)分成8個BIT環(huán)移給DQ
      }
}
void ReadTemperature()                                   //讀取ds18b20當(dāng)前溫度
{      
              delay_18B20(80);                              //延時一段時間
              Init_DS18B20();   
              WriteOneChar(0xCC);                                    //跳過讀序號列號的操作
              WriteOneChar(0x44);                            //啟動溫度轉(zhuǎn)換
              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)                             //延時函數(shù)
{
              ucharj,k;                                  //變量i、k為無符號字符數(shù)據(jù)類型
              for(j=i;j>0;j--)                                 //循環(huán)延時
                     for(k=200;k>0;k--);                    //循環(huán)延時
}
/*******************電機轉(zhuǎn)動程序*******************/
void motor(uchar tmp)            
{    uchar x;
     if(TempBuffer1[0]==0x2b)                      //溫度為正數(shù)
              {
                         if(tmp<25)                                            //溫度小于25度
                     {
                           D=0;                                          //電機停止轉(zhuǎn)動
                           PWM=0;
                     }
                     else if(tmp>50)                                 //溫度大于50度,全速轉(zhuǎn)動
                            {
                                   D=0;                                  //D置0
                                   PWM=1;             //正轉(zhuǎn),PWM=1
                        x=250;                              //時間常數(shù)為x
                        delay_motor(x);                        //調(diào)延時函數(shù)
                                  PWM=0;                    //PWM=0
                        x=5;                                    //時間常數(shù)為x
                                delay_motor(x);                 //調(diào)延時函數(shù)
                            }
                            else
                            {
                                   D=0;                                  //D置0
                                  PWM=1;             //正轉(zhuǎn),PWM=1
                       x=5*tmp;                           //時間常數(shù)為x
                       delay_motor(x);                  //調(diào)延時函數(shù)
                                  PWM=0;                    //PWM=0
                       x=255-5*tmp;                       //時間常數(shù)為255-x
                               delay_motor(x);            //調(diào)延時函數(shù)
                         }
                     }
else if (TempBuffer1[0]==0x2d)                   //溫度小于0,反轉(zhuǎn)
                     {
                           D=1;                                          
                    PWM=0;                           //PWM=0
                 x=5*tmp;                                 //時間常數(shù)為tmp
                            delay_motor(x);                  //調(diào)延時函數(shù)
                            PWM=1;                           //PWM=1
                 x=255-5*tmp;                              //時間常數(shù)為255- tmp
                            delay_motor(x);                  //調(diào)延時函數(shù)
                    }
}      
void delay(unsigned int x)                                 //延時函數(shù)名
{
unsigned char i;                            //定義變量i的類型
while(x--)                                    //x自減1
{
for(i=0;i<123;i++){;}                       //控制延時的循環(huán)
}
}
/*************************main主程序*********************/
void main(void)
{
delay_20ms();                                         //系統(tǒng)延時20ms啟動
              ReadTemperature();                              //啟動DS18B20
     Init_lcd();                                      //調(diào)用LCD初始化函數(shù)
              LCD_Print(0,0,tab);                                //液晶初始顯示
              delay(1000);                                   //延時一段時間
              while(1)
{      
                    ReadTemperature();                      //讀取溫度并存放在一個兩個字節(jié)的數(shù)組中
                         delay_18B20(100);
                         covert1();                                        //數(shù)據(jù)轉(zhuǎn)化
                         LCD_Print(4,1,TempBuffer1);               //顯示溫度
                     motor(temperature);                     //電機轉(zhuǎn)動
              }
}

全部資料51hei下載地址:
基于51單片機的溫度控制直流電機的轉(zhuǎn)動.rar (73.85 KB, 下載次數(shù): 132)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:734734 發(fā)表于 2020-4-25 12:17 | 顯示全部樓層
源程序呢,下載的啥都沒有
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩久久 | 久久av资源网 | 一本大道久久a久久精二百 欧洲一区二区三区 | 成人午夜性成交 | 一区二区av | 国产午夜精品一区二区 | 国产精品久久久久久久久久 | 综合精品久久久 | 午夜成人免费视频 | 怡红院成人在线视频 | 亚洲第一视频网站 | 日韩在线欧美 | 欧美伊人| 中文字幕视频三区 | 成人av久久 | 天天操 夜夜操 | 亚洲综合伊人 | 欧美 日韩 国产 成人 在线 | 亚洲精品一区二区三区中文字幕 | 久久大陆| 在线日韩| 日韩在线不卡视频 | www亚洲免费国内精品 | 国产高清视频在线 | 日本特黄a级高清免费大片 国产精品久久性 | 久久国产日本 | 中文字幕在线二区 | 欧美三级电影在线播放 | 亚洲h在线观看 | 日韩精品成人 | 精品成人免费一区二区在线播放 | 中文字幕免费观看 | 日本免费小视频 | 啪啪av| 亚洲不卡在线视频 | 成人在线一区二区三区 | av在线免费观看网站 | 国产精品欧美精品 | 久久久久久成人网 | 亚洲精品自拍视频 | 国产一区二区视频免费在线观看 |