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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數字溫度控制器Proteus仿真設計帶源碼

[復制鏈接]
跳轉到指定樓層
樓主
用DS18B20進行溫度轉換,用AT89C51單片機讀取溫度,并根據溫度值,控制1602顯示和直流電機轉動,采用占空比調速,帶有ISIS仿真文件,可直接使用。

proteus仿真原理圖如下:


單片機源程序如下:
  1. /******************************/
  2. /*       數字溫度控制器       */
  3. /******************************/
  4. #include <reg51.h>
  5. //引腳定義
  6. sbit RS=P2^0;//1602LCD RS
  7. sbit RW=P2^1;//1602LCD RW
  8. sbit E=P2^2;//1602LCD E
  9. sbit Moto1=P2^3;//直流電機控制端
  10. sbit Moto2=P2^4;//直流電機控制端
  11. sbit DQ=P2^5;//DS18B20 DQ

  12. #define uchar unsigned char   
  13. #define uint unsigned int           //宏定義
  14. #define LcdData P0                   //1602的D0~D7
  15. #define CWD Moto1=1;Moto2=0           //正轉
  16. #define CCWD Moto1=0;Moto2=1   //反轉
  17. #define Stop Moto1=1; Moto2=1  //停止

  18. //全局變量定義
  19. uchar HPulseNum;//高電平數(PWM波高電平持續長度)
  20. uchar LPulseNum;//低電平數(PWM波低電平持續長度)
  21. uint NumChange;        //周期
  22. bit TempFlag;//正負溫度標志:溫度為正Temp_Flag=0,否則為1
  23. uint Temp;//溫度值
  24. //直流電機轉向狀態 0為CWD(順時針方向) 1為CCWD(逆時針方向)
  25. uchar MotoStatus;  //電機狀態
  26. bit PulseStatus;//PWM波狀態,0高電平 1低電平

  27. //函數申明(共11個函數)
  28. /*****************************************************/
  29. void Delayms(uint xms);//ms級延時函數
  30. void WriteLcd(uchar Dat,bit x);//寫1602LCD指令、數據函數
  31. void InitLcd(void);//初始化1602LCD函數
  32. void StatusLCD(void);//1602LCD顯示狀態函數
  33. void InitT0(void);//初始化定時器T0函數
  34. void Delayus(uchar xus);//us級延時函數
  35. bit Init_DS18B20(void);//初始化DS18B20函數
  36. uchar Read_DS18B20(void);//讀DS18B20函數
  37. void Write_DS18B20(uchar Dat);//寫DS18B20函數
  38. void GetTemp();//取溫度函數
  39. void MotoControl();
  40. /*****************************************************/
  41. uchar FirstLine[16]={"       C STOP"};        //用于1602LCD第一行顯示的數組
  42. uchar SecondLine[16]={"TG! H/L:  0%"};        //用于1602LCD第二行顯示的數組



  43. //ms級延時函數
  44. void Delayms(uint xms)//1ms左右延時
  45. {
  46.         uint i,j;
  47.         for(i=xms; i>0; i--)
  48.                 for(j=110; j>0; j--);
  49. }

  50. //寫1602LCD指令、數據函數
  51. void WriteLcd(uchar Dat,bit x)
  52. {
  53.         E=0;
  54.         LcdData=Dat;
  55.         RS=x;//寫指令時x=0,寫數據時x=1
  56.         RW=0;
  57.         E=1;
  58.         Delayms(1);
  59.         E=0;
  60. }

  61. //初始化1602LCD函數
  62. void InitLcd(void)
  63. {
  64.         WriteLcd(0x38,0);//功能設定(38H)
  65.         WriteLcd(0x0C,0);//顯示開、關設定(0CH)
  66.         WriteLcd(0x06,0);//輸入模式設定(06H)
  67.         WriteLcd(0x01,0);//清除顯示(01H)
  68. }

  69. //1602LCD顯示狀態函數
  70. void StatusLCD(void)
  71. {
  72.         if(TempFlag) FirstLine[0]='-';//如果溫度值為負,顯示負符號
  73.         else FirstLine[0]=' ';//否則不顯示溫度符號

  74.         if(Temp<1000) FirstLine[1]=' ';//如果溫度值小于100,百位顯示空白(不顯示0)
  75.         else FirstLine[1]=Temp/1000+0x30;//取溫度百位并轉換成ASCII碼

  76.         if(Temp<100) FirstLine[2]=' ';//如果溫度值小于10,十位顯示空白(不顯示0)
  77.         else FirstLine[2]=Temp%1000/100+0x30;//取溫度十位并轉換成ASCII碼

  78.         FirstLine[3]=Temp%100/10+0x30;//取溫度個位并轉換成ASCII碼
  79.         FirstLine[4]='.';//顯示小數點
  80.         FirstLine[5]=Temp%10+0x30;//取溫度十分位并轉換成ASCII碼
  81.         FirstLine[6]=0xDF;//顯示℃中C前面的小圓

  82.         if(NumChange!=0)
  83.         {
  84.                 if(MotoStatus==1)//順時針時顯示CWD
  85.                 {
  86.                         FirstLine[9]=' ';
  87.                         FirstLine[10]='C';
  88.                         FirstLine[11]='W';
  89.                         FirstLine[12]='D';
  90.                 }
  91.                 if(MotoStatus==2)//逆時針時顯示CCWD
  92.                 {
  93.                         FirstLine[9]='C';
  94.                         FirstLine[10]='C';
  95.                         FirstLine[11]='W';
  96.                         FirstLine[12]='D';                               
  97.                 }
  98.         }
  99.         else
  100.         {
  101.                 FirstLine[9]='S';
  102.                 FirstLine[10]='T';
  103.                 FirstLine[11]='O';
  104.                 FirstLine[12]='P';               
  105.         }

  106.         if((TempFlag)|(Temp<250))//如果溫度為負或小于25度,溫度過低
  107.                 SecondLine[1]='L';//改寫1602LCD第二行顯示內容

  108.         if((!TempFlag)&(Temp>=250)&(Temp<=300))//如果溫度為正且在25℃~30℃之間,溫度正常
  109.                 SecondLine[1]='G';//改寫1602LCD第二行顯示內容

  110.         if((!TempFlag)&(Temp>300))//如果溫度為正且大于30度,溫度過高
  111.                 SecondLine[1]='H';//改寫1602LCD第二行顯示內容

  112.         //占空比小于100%時,不顯示百位
  113.         if(NumChange<100)
  114.                 SecondLine[8]=' ';
  115.         else
  116.         //取占空比百位并轉換成ASCII碼
  117.                 SecondLine[8]=NumChange/100+0x30;
  118.        
  119.         //占空比小于10%時,不顯示十位
  120.         if(NumChange<10)
  121.                 SecondLine[9]=' ';
  122.         else
  123.         //取占空比十位并轉換成ASCII碼
  124.                 SecondLine[9]=NumChange%100/10+0x30;
  125.        
  126.         //取占空比個位并轉換成ASCII碼
  127.         SecondLine[10]=NumChange%10+0x30;
  128. }





  129. //us級延時函數
  130. void Delayus(uchar xus)//晶振為12MHz,延時時間為2i+5 us
  131. {
  132.         while(--xus);
  133. }

  134. //初始化DS18B20函數
  135. bit Init_DS18B20(void)
  136. {
  137.         bit x;
  138.         DQ=1;
  139.         DQ=0;
  140.         Delayus(250);
  141.         DQ=1;
  142.         Delayus(27);
  143.         if(!DQ) x=0;
  144.         else x=1;
  145.         Delayus(250);
  146.         DQ=1;
  147.         return x;
  148. }

  149. //讀DS18B20函數
  150. uchar Read_DS18B20(void)
  151. {
  152.         uchar i=0,Dat=0;
  153.         for(i=0;i<8;i++)
  154.         {
  155.                 DQ=1;
  156.                 DQ=0;
  157.                 Dat>>=1;
  158.                 DQ=1;
  159.                 if(DQ) Dat |= 0x80;
  160.                 DQ=1;
  161.                 Delayus(30);
  162.         }
  163.         return Dat;
  164. }

  165. //寫DS18B20函數
  166. void Write_DS18B20(uchar Dat)
  167. {
  168.         uchar i=0;
  169.         for(i=0;i<8;i++)//循環8次,寫入一個字節
  170.         {
  171.                 DQ=1;//未發送前的狀態
  172.                 Dat >>= 1;//將要傳送的最低位放入CY
  173.                 DQ=0;//將總線拉低,產生寫時序
  174.                 DQ=CY;//將要傳送的位狀態送到總線上
  175.                 Delayus(30);//延時50us,即保持總線狀態,待DS18B20采樣
  176.                 DQ=1;//恢復期,總線置1
  177.         }
  178. }

  179. //取溫度函數
  180. void GetTemp(void)//獲取溫度函數
  181. {
  182.         uchar a=0,b=0;
  183.         TR0=0;
  184.         Init_DS18B20();
  185.         Write_DS18B20(0xcc);//跳過ROM
  186.         Write_DS18B20(0x44);//開啟溫度轉換
  187.         Init_DS18B20();
  188.         Write_DS18B20(0xcc);//跳過ROM
  189.         Write_DS18B20(0xbe);//讀暫存器
  190.         a=Read_DS18B20();//讀取高速暫存字節0,溫度低8位
  191.         b=Read_DS18B20();//讀取高速暫存字節1,溫度高8位
  192.         Temp=b;
  193.         Temp<<=8;
  194.         Temp=Temp|a;//將高、低位溫度編碼合在一起
  195.         if(b>=8)//判斷溫度值是否為負,如果溫度高字節大于等于8說明溫度值為負
  196.         {
  197.                 Temp=~Temp+1;//將補碼轉換成原碼
  198.                 TempFlag=1;//溫度標志為1,表示溫度為負
  199.         }
  200.         else
  201.         {
  202.                 TempFlag=0;//溫度標志為0,表示溫度為正
  203.         }
  204.         Temp=Temp*0.0625*10+0.5;//將溫度編碼轉換成溫度值  放大10倍  加0.5是為了四舍五入
  205.         TR0=1;
  206. }

  207. //初始化外部中斷INT0和定時器T0
  208. void InitT0(void)
  209. {
  210.         EA=1;
  211.         ET0=1;
  212.         TMOD=0x02;//T0工作于定時、方式2
  213.         TH0=256-250;//250us定時
  214.         TL0=256-250;
  215.         TR0=1;//啟動定時器
  216. }

  217. //T0定時器中斷服務函數
  218. void T0Serv() interrupt 1
  219. {
  220.         if(!PulseStatus)//如果當前處于PWM波高電平段         PulseStatus:PWM波狀態,0高電平 1低電平
  221.         {
  222.                 if(HPulseNum--!=0)//如果高電平段延時計數不為0
  223.                 {
  224.                         if(MotoStatus!=0)//如果MotoStatus!=0(為0是停止狀態)
  225.                         {
  226.                                 if(MotoStatus==1)
  227.                                         {
  228.                                                 CWD;//順時針驅動直流電機
  229.                                         }
  230.                                         else//MotoStatus=1(逆時針)
  231.                                         {
  232.                                                 CCWD;//逆時針驅動直流電機
  233.                                         }
  234.                         }
  235.                 }
  236.                 else//高電平段延時計數為0
  237.                 {                               
  238.                         PulseStatus=!PulseStatus;//取反PWM波電平狀態
  239.                         LPulseNum=100-NumChange; //裝載低電平段延時計數,為低電平段延時做準備
  240.                 }
  241.         }
  242.         else//當前處于PWM波低電平段
  243.         {
  244.                 //如果低電平段延時計數不為0
  245.                 if(LPulseNum--!=0)
  246.                 {
  247.                         Stop;//停止驅動直流電機
  248.                 }
  249.                 //低電平段延時計數為0
  250.                 else
  251.                 {       
  252.                         PulseStatus=!PulseStatus;         //取反PWM波電平狀態
  253.                         HPulseNum=NumChange;                //裝載高電平段延時計數,為高電平段延時做準備
  254.                 }
  255.         }
  256. }

  257. void MotoControl()
  258. {
  259.         if((!TempFlag)&(Temp>300)) //正的溫度且大于30℃
  260.         {
  261.                 MotoStatus=1;
  262.                 NumChange=Temp-300;
  263.                 if(NumChange>=100) NumChange=100;//控制上限
  264.         }

  265.         if((!TempFlag)&(Temp<=300)&(Temp>=250))
  266.         {
  267.                 MotoStatus=0;
  268.                 NumChange=0;
  269.         }
  270.         if((Temp<250)|(TempFlag))
  271.         {
  272. ……………………

  273. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
任務5 數字溫度控制器.rar (71.55 KB, 下載次數: 66)



評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:414264 發表于 2018-10-30 16:35 | 只看該作者
為什么仿真不對 有錯誤?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 超碰成人免费 | 日韩伦理一区二区三区 | av在线一区二区 | 国产精品一区在线播放 | 日韩久草 | 久久a久久 | 国产一区二区精品在线观看 | 黄色在线免费观看 | 激情婷婷 | 成年人在线观看视频 | 日韩影院在线 | 国产 日韩 欧美 在线 | 97av视频在线观看 | caoporn免费| 91色综合| 精品九九| 99色综合 | 国产一区在线免费观看 | 在线成人 | 亚洲免费人成在线视频观看 | 日韩在线观看中文字幕 | 国产一区二区视频免费在线观看 | 国产九九精品 | 视频在线一区二区 | 欧美综合自拍 | 国产精品一区二区不卡 | 一区二区三区免费观看 | 日韩图区 | av一二三四 | 欧美福利视频 | 久久99网 | 日本激情视频网 | 久久精品国产亚洲 | 91精品国产色综合久久 | 成年免费大片黄在线观看岛国 | 中文字幕综合 | 国产欧美日韩综合精品一区二区 | 国产精品久久国产精品 | 亚洲a网 | 亚洲va欧美va天堂v国产综合 | 国产探花在线精品一区二区 |