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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

模擬糧倉溫度檢測報警系統設計

[復制鏈接]
跳轉到指定樓層
樓主
這是我們的免試題目,有仿真原理圖,源代碼沒希望能給大家提供幫助


仿真文件下載:
模擬糧倉溫度檢測報警系統-董曉臣.rar (115.09 KB, 下載次數: 59)

源程序:
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #include <math.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit RW = P2^1;          //定義LCD的讀、寫選擇端
  7. sbit RS = P2^0;           //定義LCD的數據、命令選擇端
  8. sbit EN = P2^2;                 //定義LCD的使能信號端
  9. sbit DS = P3^5;                 //定義DS18B20的IO口





  10. sbit L=P1^3;                 //綠燈
  11. sbit H=P1^4;                 //紅燈
  12. sbit LS=P3^4;                 //蜂鳴器
  13. sbit k1=P2^7;                 //顯示64位的ROM
  14. sbit k2=P2^6;                 //顯示當前溫度
  15. sbit k3=P2^3;                 //顯示溫度上限及下線,并支持調節
  16. sbit k4=P2^4;                 //        上限加
  17. sbit k5=P2^5;                  //        下限減
  18. uchar k=2;                         //當前溫度顯示標志位
  19. uchar table0[] = " Current Temp : ";         //當前溫度
  20. uchar table1[] = " -- ROM CODE -- ";         //顯示DS18B20的ROM
  21. uchar table2[] = "ALARM TEMP Hi Lo";         //顯示上下限溫度
  22. uchar table3[] = "Hi:    Lo:      ";
  23. uchar table4[] = {0,0,0,0,0,0,0,0};
  24. uchar tempHL[] = { 40, 10};                                 //上下限溫度的初始值                                                                                   
  25. void delayms(uint ms)     //延時函數1
  26. {
  27.     uint i;
  28.     while(ms--)
  29.         {
  30.                 for(i=0;i<120;i++);
  31.         }
  32. }



  33. void writecom(uchar com)  //寫地址,也就是顯示的數據的位置
  34. {
  35.         RS = 0;                 
  36.         P0 = com;
  37.         EN = 1;
  38.         delayms(1);
  39.         EN = 0;
  40. }
  41. void writedata(uchar dat) //寫數據,也就是顯示的數據
  42. {
  43.         RS = 1;
  44.         P0 = dat;
  45.         EN = 1;
  46.         delayms(1);
  47.         EN = 0;
  48. }
  49. void init()                   //LCD初始化
  50. {
  51.         RW = 0;
  52.         writecom(0x38);          //16*2顯示,5*7點陣
  53.         writecom(0x0c);
  54.         writecom(0x06);
  55.         writecom(0x01);   //清除LCD的顯示內容
  56. }

  57. void writestring(uchar * str, uchar length)           //寫數據的過度函數。length:長度
  58. {
  59.     uchar i;
  60.     for(i = 0; i < length; i++)
  61.     {
  62.          writedata(str[i]);
  63.      }
  64. }
  65. void delay(uint num)        //延時函數
  66. {
  67.   while( --num );
  68. }

  69. DSinit(void)        //初始化ds1820  
  70. {  
  71.      DS= 1;      //DS復位
  72.      delay(8);    //稍做延時
  73.      DS= 0;      //將DS拉低
  74.      delay(90);   //精確延時 大于 480u
  75.      DS= 1;       //拉高總線
  76.      delay(110);
  77.      DS= 1;

  78. }

  79. uchar read_bit(void)     //讀一位(bit)
  80. {
  81. uchar i;
  82. DS= 0;                      //將DS拉低開始讀時間隙
  83. DS= 1;                         // then return high
  84. for (i=0; i<3; i++);         // 延時15μs
  85. return(DS);                         // 返回 DS線上的電平值
  86. }

  87. uchar readbyte()        // 讀一個字節  
  88. {
  89. uchar i = 0;
  90. uchar dat = 0;
  91. for (i=0;i<8;i++)
  92. {                                  // 讀取字節,每次讀取一個字節
  93. if(read_bit()) dat|=0x01<<i;           // 然后將其左移
  94.     delay(4);
  95.   }
  96.     return (dat);
  97. }

  98. void write_bit(char bitval)       //寫一位  
  99. {
  100. DS= 0;                                        // 將DS拉低開始寫時間隙
  101. if(bitval==1) DS=1;          // 如果寫1,DS返回高電平
  102. delay(5);                                       // 在時間隙內保持電平值,
  103. DS= 1;                      // delay函數每次循環延時16μs,因此delay(5) = 104μs
  104. }        

  105. void writebyte(uchar dat)  //寫一個字節
  106. {
  107.   uchar i = 0;
  108.   uchar temp;
  109.    for (i=0; i<8; i++)         // 寫入字節, 每次寫入一位
  110.    {

  111.    temp = dat>>i;                 
  112.    temp &= 0x01;                 
  113.    write_bit(temp);

  114.   }
  115.   delay(5);
  116. }         
  117. void sendchangecmd()           //DS18B20?開始獲取溫度并轉換
  118. {
  119.     DSinit();                         //DS18B20復位
  120.     delayms(1);                       
  121.     writebyte(0xcc);           //寫跳過讀ROM指令
  122.     writebyte(0x44);           //寫溫度轉換指令
  123. }

  124. void sendreadcmd()                   //讀取寄存器中存儲的溫度數據
  125. {
  126.     DSinit();                           //DS18B20復位
  127.     delayms(1);
  128.     writebyte(0xcc);            //寫跳過讀ROM指令
  129.     writebyte(0xbe);            //讀取暫存器的內容
  130. }         

  131. int gettmpvalue()
  132. {
  133.     uint tmpvalue;
  134.     float t;
  135.     uchar low, high;
  136.     sendreadcmd();                   //讀取寄存器中存儲的溫度數據
  137.     low = readbyte();            //讀取低八位
  138.     high = readbyte();           //讀取高八位
  139.     tmpvalue = high;
  140.     tmpvalue <<= 8;                   //高八位左移八位
  141.     tmpvalue |= low;       //兩個字節組合為1個字
  142.     t = tmpvalue * 0.0625 * 100;   //分辨率為0.0625,在此將值擴大100倍
  143.     return t;
  144. }

  145. void display(int v)            //顯示子函數
  146. {
  147.     uchar i;
  148.     uchar datas[] = {0, 0, 0, 0, 0, 0, 0, 0};  //定義緩存數組datas
  149.     uint tmp = abs(v);                                                   //abs是求絕對值函數
  150.     datas[0] = tmp % 10000 / 1000;
  151.     datas[1] = tmp % 1000 / 100;
  152.     datas[2] = tmp % 100 / 10;
  153.     datas[3] = tmp % 10;
  154.         datas[4] = 80;                                                //空格的前30的ASCALL碼
  155.         datas[5] = 175;                                                //溫度符號的前30的ASCALL碼
  156.         datas[6] = 19;                                                //C的前30的ASCALL碼
  157.     writecom(0xc0+3);
  158.     if(v < 0)                                  //當V小于0則輸出負號
  159.     {
  160.         writestring("- ", 2);
  161.    }
  162.     else
  163.     {
  164.        writestring("+ ", 2);          //當V大于0則輸出正號
  165.     }
  166.     for(i = 0; i != 7; i++)
  167.     {
  168.         writedata('0'+datas[i]);   //顯示溫度
  169.         if(i == 1)
  170.         {
  171.            writedata('.');                  //顯示溫度的小數點
  172.         }
  173.     }

  174. }

  175. void Read_RomCord()                   //讀取64位序列碼
  176. {
  177.      unsigned char j;
  178.      DSinit();
  179.      writebyte(0x33);      // 讀序列碼的操作
  180.      for (j = 0; j < 8; j++)
  181.          {
  182.           table4[j] = readbyte();
  183.          }
  184. }

  185. void Disp_RomCode()                           //數據轉換與顯示
  186. {
  187.    uchar j,i;
  188.    writecom(0xc0);         //LCD第二行初始位置
  189.    for(j=0;j<8;j++)
  190.    {
  191.     i=((table4[j]&0xf0)>>4);
  192.     if(i>9)
  193.      { i=i+0x37;}
  194.     else{i=i+0x30;}         
  195.     writedata(i);        //高位數顯示
  196.     i=(table4[j]&0x0f);
  197.     if(i>9)
  198.      {i=i+0x37;}
  199.     else {i=i+0x30;}         
  200.     writedata(i);        //低位數顯示
  201.    }
  202. }

  203. void lcd_display()                 //按鍵掃描
  204. {
  205.   uchar i,m;
  206.   uchar hl[]={0, 0, 0, 0, 0};
  207.   if(k1 == 0) k = 1;
  208.   if(k2 == 0) k = 2;                                                                                                                                                                                          
  209.   if(k3 == 0) k = 3;
  210.   if(tempHL[0]<=gettmpvalue()/100)
  211.        delayms(100),LS=!LS,H=~H;
  212.   else
  213.        LS=1,H=1;
  214.   if(m==1)
  215. {
  216.           if(tempHL[1]>=gettmpvalue()/100)
  217.                delayms(100),LS=!LS,L=~L;
  218.           else
  219.                LS=1,L=1;
  220.   }
  221.   switch(k)
  222.   {
  223.         case 1:                                                       //顯示64位的ROM
  224.                    writecom(0x01);
  225.                    writecom(0x80);
  226.                    writestring(table1, 16);
  227.                    Read_RomCord();           //讀取64位序列碼
  228.                    Disp_RomCode();                 //顯示64位序列
  229.                    delayms(500);                         //溫度轉換時間需要750ms以上
  230.                    break;
  231.         case 2:                                                 //顯示當前溫度
  232.                    delayms(750);                         //溫度轉換時間需要750ms以上
  233.                    sendchangecmd();
  234.                    writecom(0x01);
  235.                    writecom(0x80);
  236.                    writestring(table0, 16);
  237.                    display(gettmpvalue());
  238.                    break;
  239.         case 3:                                                     //顯示溫度上限及下線,并支持調節
  240.                    writecom(0x80);
  241.                    writestring(table2, 16);
  242.                    writecom(0xC0);
  243.                    writestring(table3, 16);
  244.                    if(k4==0) {tempHL[0]++;if(m==1) tempHL[1]++;if(m==0){tempHL[1]--;if(tempHL[1]==0)m=1;}delayms(100);}
  245.                    if(k5==0) {tempHL[0]--;if(m==0) tempHL[1]++;if(m==1){tempHL[1]--;if(tempHL[1]==0)m=0;}delayms(100);}
  246.                    hl[0]=tempHL[0]/10;
  247.                    hl[1]=tempHL[0]%10;
  248.                    if(m==1) hl[2]=80;
  249.                    if(m==0) hl[2]=128;
  250.                    hl[3]=tempHL[1]/10;
  251.                    hl[4]=tempHL[1]%10;
  252.                    writecom(0xC0+4);
  253.                    for(i = 0; i != 2; i++)
  254.                     {
  255.                         writedata('0'+hl[i]);        //顯示上限溫度
  256.                          }
  257.                    writecom(0xC0+11);
  258.                    for(i = 2; i != 5; i++)
  259.                     {
  260.                         writedata('0'+hl[i]);         //顯示下限溫度
  261.                          }
  262.                    break;
  263.   }
  264. }
  265. void main()
  266. {
  267.     sendchangecmd();                        //讀取寄存器中存儲的溫度數據
  268.     init();                                                //LCD初始化
  269.     writecom(0x80);                                //選擇LCD第一行
  270.     writestring(table0, 16);        //顯示當前溫度的英文字母
  271.     while(1)
  272.     {
  273.         lcd_display();                         //掃描按鍵
  274.     }
  275. }
復制代碼


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2016-12-6 17:00 | 只看該作者
你這個壓縮包里面有程序啊.
回復

使用道具 舉報

板凳
ID:154229 發表于 2016-12-12 20:24 | 只看該作者
好棒好棒!!!
回復

使用道具 舉報

地板
ID:154229 發表于 2016-12-12 20:32 | 只看該作者
可是黑幣不夠 = =
回復

使用道具 舉報

5#
ID:154229 發表于 2016-12-12 20:54 | 只看該作者
請問又沒有什么元件介紹什么的啊。謝謝拉
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品免费在线 | 黑人精品欧美一区二区蜜桃 | 福利视频1000| 国产精品久久久久永久免费观看 | 国产视频福利在线观看 | 日本久久一区二区三区 | 超碰免费观看 | 亚洲三区在线观看 | 成人欧美一区二区三区在线播放 | 日韩三级在线观看 | 成人av片在线观看 | 欧美日韩精品一区 | 精品久久久久久久 | 日韩视频免费在线 | 国产精品福利网站 | 国产精品大片在线观看 | 日韩电影中文字幕在线观看 | 成人欧美一区二区三区在线观看 | 99久久精品国产麻豆演员表 | 国产97在线看 | 黄色片网站在线观看 | 在线免费观看视频你懂的 | 亚洲国产精品激情在线观看 | 毛片网站在线观看 | 亚洲精品综合 | 色www精品视频在线观看 | 91av导航| 视频一区二区中文字幕 | 国产精品久久av | 免费亚洲婷婷 | 国产日韩av一区二区 | 国产91精品网站 | 亚洲精品视频在线看 | 久久专区| 欧美一级大片 | 亚洲中午字幕 | 99在线免费观看 | 天天碰日日操 | 欧美一级片在线观看 | 亚洲黄色一级 | 日本污视频 |