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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

AT89C51單片機程序與仿真錯誤

[復制鏈接]
跳轉到指定樓層
樓主
ID:160550 發表于 2017-1-11 11:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
能不能幫忙看一下,,謝謝大家了仿真軟件是proteus,要求是實現超過上限溫度與下限溫度時警報電機運行

51.rar

28.6 KB, 下載次數: 7

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

使用道具 舉報

沙發
ID:161477 發表于 2017-1-12 16:04 | 只看該作者
kile文件打不開
回復

使用道具 舉報

板凳
ID:160550 發表于 2017-1-12 19:44 | 只看該作者
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #include<intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define ulint unsigned long int
  7. uchar code table0[]={                                                                                  //歡迎界面
  8.                      0xa0,0x57,0x65,0x6c,0x63,0x6f,0x6d,0x65,
  9.                                          0xa0,0x74,0x6f,0xa0,0x75,0x65,0x73,0xa0,
  10.                                          0xa0,0xa0,0x74,0x68,0x65,0x72,0x6d,0x6f,
  11.                                          0x6d,0x65,0x74,0x65,0x72,0x21,0xa0,0xa0};
  12. uchar table1[]={0x6d,0x61,0x78,0x3a,0x00,0x00,0x00,0xa0,         //存儲報警值
  13.                 0x6d,0x69,0x6e,0x3a,0x00,0x00,0x00,};
  14. uchar table2[]={                                                                                  //存儲溫度
  15.                 0x54,0x4d,0x50,0x54,0x3a,
  16.                                 0x00,0x00,0x00,0x00,0xa5,0x00,0x00,0x43};
  17. uchar code table3[]={                                                                          //提醒設定報警值
  18.                 0xa0,0x50,0x6c,0x65,0x61,0x73,0x65,0xa0,
  19.                                 0xa0,0x63,0x68,0x61,0x72,0x67,0x65,0xa0,
  20.                                 0xa0,0xa0,0xa0,0x79,0x6f,0x75,0x72,0xa0,
  21.                                 0x63,0x61,0x72,0x64,0x21,0xa0,0xa0,0xa0};

  22. uchar table4[]={                                                                             //輸入界面
  23.                 0x50,0x6c,0x65,0x61,0x73,0x65,0xa0,0x69,
  24.                                 0x6e,0x70,0x75,0x74,0x3a};
  25. sbit E=P3^7;
  26. sbit RW=P3^6;
  27. sbit RS=P3^5;
  28. sbit flag=P1^7;
  29. sbit dec=P3^0;
  30. sbit inc=P3^1;
  31. sbit ok_max=P3^2;
  32. sbit ok_min=P3^4;
  33. sbit out=P2^1;
  34. sbit DQ=P2^3;
  35. sbit beep=P2^2;
  36. uchar p,tflag;
  37. uint tvalue;

  38. /*****************延時函數**********************/

  39. void delay_18B20(unsigned int i)
  40. {
  41.         while(i--);
  42. }

  43. /**********ds18b20初始化函數**********************/

  44. void Init_DS18B20(void)
  45. {
  46.          unsigned char x=0;
  47.          DQ = 1;          //DQ復位
  48.          delay_18B20(8);  //稍做延時
  49.          DQ = 0;          //單片機將DQ拉低
  50.          delay_18B20(80); //精確延時 大于 480us
  51.          DQ = 1;          //拉高總線
  52.          delay_18B20(14);
  53.          x=DQ;            //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  54.          delay_18B20(20);
  55. }

  56. /***********ds18b20讀一個字節**************/  

  57. unsigned char ReadOneChar(void)
  58. {
  59.         unsigned char i=0;
  60.         unsigned char dat = 0;
  61.         for (i=8;i>0;i--)
  62.          {
  63.                   DQ = 0; // 給脈沖信號
  64.                   dat>>=1;
  65.                   DQ = 1; // 給脈沖信號
  66.                   if(DQ)
  67.                   dat|=0x80;
  68.                   delay_18B20(4);
  69.          }
  70.          return(dat);
  71. }

  72. /*************ds18b20寫一個字節****************/  

  73. void WriteOneChar(unsigned char dat)
  74. {
  75.          unsigned char i=0;
  76.          for (i=8; i>0; i--)
  77.          {
  78.                   DQ = 0;
  79.                  DQ = dat&0x01;
  80.             delay_18B20(5);
  81.                  DQ = 1;
  82.             dat>>=1;
  83. }
  84. }

  85. /**************讀取ds18b20當前溫度************/

  86. unsigned int ReadTemperature(void)
  87. {        unsigned char tl,th;
  88.           float t;
  89.         Init_DS18B20();
  90.         WriteOneChar(0xCC);            // 跳過讀序號列號的操作
  91.         WriteOneChar(0x44);         // 啟動溫度轉換

  92.         delay_18B20(80);       // 這個延時很重要
  93.         Init_DS18B20();
  94.         WriteOneChar(0xCC);         //跳過讀序號列號的操作
  95.         WriteOneChar(0xBE);         //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  96.         delay_18B20(80);

  97.         tl=ReadOneChar();            //讀取溫度值低位
  98.         th=ReadOneChar();                   //讀取溫度值高位
  99.         tvalue=th;
  100.     tvalue<<=8;
  101.     tvalue=tvalue|tl;
  102.     if(tvalue<0x0fff)                   //判斷正負
  103.       {
  104.            tflag=0;                                                //符號標記位
  105.            table2[5]=0xa0;                                //存儲'+'號
  106.            }
  107.     else
  108.       {
  109.            tvalue=~tvalue+1;                         //負數取反加一
  110.          tflag=1;
  111.              table2[5]=0x2d;                        //存儲'-'號
  112.        }
  113.      t=tvalue*(0.0625);
  114.          tvalue=t*100;                                   //溫度值擴大100倍,精確到2位小數
  115.         return(tvalue);
  116. }

  117. /*************處理當前溫度******************/
  118. void show1(void);

  119. void DeelTemperatre(uint t)
  120. {
  121.      table2[6]=t/10000+0x30;
  122.          if(table2[6]==0x30)                           //百位為0,就消隱
  123.             {
  124.                  table2[6]=0xa0;
  125.                 }
  126.          table2[7]=t%10000/1000+0x30;                //十位
  127.          table2[8]=t%1000/100+0x30;                        //個位
  128.          table2[10]=t%100/10+0x30;                        //小數位
  129.          table2[11]=t%10+0x30;  
  130. }

  131. /****************警告函數*******************/
  132. void warn(uchar s,uchar led)
  133. {
  134.             uchar i,j,k;i=s;
  135.          P2=~(led);
  136.          for(k=0;k<20;k++)
  137.          {for(j=0;j<200;j++)//喇叭發聲的時間循環,改變大小可以改變發聲時間長短
  138.           {
  139.             delay_18B20(i);      //參數決定發聲的頻率,估算值,可以自行更改參數并
  140.             beep=!beep;
  141.           }
  142.           }
  143.          P2=0xff;
  144.          beep=1;
  145. }

  146. /******************報警處理函數**************/

  147. void deal(uint fuzhi)
  148.   {
  149.    uchar t1,th,tl,i;
  150.    char t1_c,th_c,tl_c,th_s,tl_s;
  151.    t1=fuzhi/100;
  152.    if(table2[5]==0x2d)                                                         //存儲實際溫度換成有符號數實際溫度
  153.     {                                                                                         //符號位為'-'換成負數
  154.           t1_c=t1;
  155.           t1_c=~t1_c;
  156.         }
  157.    else
  158.     {
  159.           t1_c=t1;
  160.         }
  161.    
  162.    th=(table1[5]-0x30)*10+(table1[6]-0x30);                        //存儲上限溫度換成有符號數溫度
  163.    if(table1[4]==0x2d)
  164.     {
  165.           th_c=th;
  166.           th_c=~th_c;
  167.           th_s=th_c-2;                                                                          //設置第二高溫度報警線
  168.         }
  169.    else
  170.     {
  171.           th_c=th;
  172.           th_s=th_c-2;
  173.         }
  174.    
  175.    tl=(table1[13]-0x30)*10+(table1[14]-0x30);                   //存儲下限溫度換成有符號數溫度
  176.    if(table1[12]==0x2d)
  177.     {
  178.           tl_c=tl;
  179.           tl_c=~tl_c;
  180.           tl_s=tl_c+2;
  181.         }
  182.    else
  183.     {
  184.           tl_c=tl;
  185.           tl_s=tl_c+2;                                                                                //設置低二道報警線溫度
  186.         }


  187.    if(t1_c>=th_s&&t1_c<th_c)                                                         //大于第二高上限值小于最高上限,進行預報警
  188.     {
  189.           warn(20,0x80);                                                                         //控制預報警聲音,點亮指示燈
  190.           out=1;
  191.         }
  192.    else if(t1_c>=th_c)                                                                         //高于最高上限
  193.     {
  194.           warn(40,0x40);                                                                         //先報警
  195.           out=0;                                                                                         //自動開發動機
  196.         }
  197.    else if(t1_c<=tl_s&&t1_c>tl_c)                                                  //進行預報警
  198.     {
  199.           warn(20,0x20);
  200.           out=1;
  201.         }
  202.    else if(t1_c<=tl_c)
  203.     {
  204.           warn(40,0x10);
  205.           out=0;
  206.         }
  207.         else
  208.          {
  209.            i=5;                                                                                                  //利用顯示延時
  210.            while(i--)
  211.            {
  212.             DeelTemperatre(ReadTemperature());
  213.         show1();
  214.                 out=1;
  215.            }
  216.          }
  217.   }

  218. /*************************LCD顯示****************************/

  219. /**********************延時函數***********************/
  220. void delay0()
  221. {
  222.   uint a,b;
  223.   for(a=0;a<600;a++)
  224.   for(b=0;b<600;b++);
  225. }

  226. void delay1()
  227. {
  228. uint e;
  229. for(e=100;e>0;e--);
  230. }
  231. void delay2()
  232. {
  233. uint a,b;
  234. for(a=0;a<100;a++)
  235. for(b=0;b<100;b++);
  236. }

  237. /***********************判忙函數*********************/
  238. void busy()
  239. {
  240. do
  241. {
  242.   P1=0xff;
  243.   RS=0;
  244.   RW=1;
  245.   E=0;
  246.   E=1;
  247. }while(flag);
  248. }

  249. /*************功能:寫函數**********************************/
  250. /*********入口參數:con=1代表寫指令,con=0代表寫數據,com代表數據
  251. /*********出口參數:無;
  252. **********************************************************/                          
  253. void write(uchar con,uchar com)
  254. {
  255.   busy();
  256.   RS=con;
  257.   RW=0;
  258.   E=1;
  259.   P1=com;
  260.   E=0;
  261. }

  262. /***********************lcd初始化**********************/
  263. void init()
  264. {
  265.   write(0,0x01);
  266.   write(0,0x38);
  267.   write(0,0x0c);
  268. }

  269. /***********************顯示歡迎界面********************/
  270. void show0()
  271. {
  272.   uint i;
  273.   write(0,0x80);
  274.   for(i=0;i<16;i++)
  275.   write(1,table0[i]);
  276.   busy();
  277.   write(0,0xc0);
  278.   for(i=16;i<32;i++)
  279.   write(1,table0[i]);
  280.   busy();
  281.   delay0();
  282. }

  283. /***********************顯示溫度界面*********************/
  284. void show1()
  285. {
  286.   uint i,j;
  287.   write(0,0x01);
  288.   write(0,0x80);
  289.   for(i=0;i<15;i++)
  290.   write(1,table1[i]);
  291.   busy();
  292.   write(0,0xc0);
  293.   for(j=0;j<13;j++)
  294.   write(1,table2[j]);
  295.   busy();
  296.   delay0();
  297. }

  298. /*************************改值函數******************************/
  299. void input()
  300. {
  301.   uchar i,sign=0,k=0;
  302.   char t=0,z=0;
  303.   ok_max=1;                                      //上限值確認鍵
  304.   ok_min=1;                                          //下限值確認鍵
  305.   write(0,0x01);                          //清屏指令
  306.   while(ok_max==1&&ok_min==1)  //當確認鍵按下,結束循環
  307.   {
  308.      inc=1;
  309.          dec=1;
  310.          if(inc==0)                                   //加一鍵按下
  311.          {
  312.           delay2();                                   //去抖動
  313.           if(inc==0)
  314.            {
  315.             if(t<99)                           //設定最高上限為99
  316.                 {
  317.                 if(t>=0)                           //對符號數進行處理,大于0,保持不變
  318.              {
  319.                   t++;
  320.                   sign=0xa0;                        //溫度顯示標志位
  321.                   }
  322.                 else{
  323.                    if(t==-1)                         //小于0,首先判斷是否等于-1,因為再加一為0,消‘-’符號位
  324.                       {
  325.                           t++;
  326.                           k--;                                 //k為負數的絕對值
  327.                           sign=0xa0;
  328.                           }
  329.                         else{                                  //不為-1,前面要加符號位‘-’
  330.                              t++;
  331.                              k--;
  332.                              sign=0x2d;
  333.                                  }
  334.                     }
  335.                   }
  336.                   else ; //大于99不再增加
  337.             }
  338.          }
  339.          if(dec==0)                                            //減一確認鍵按下
  340.          {
  341.            delay2();                                                //去抖動
  342.            if(dec==0)
  343.            {
  344.             if(t<=-20);                                     //設定下限為-20
  345.             else{
  346.               if(t<=0)
  347.                  {t--;
  348.                           k++;
  349.                   sign=0x2d;
  350.                      }
  351.               else
  352.                {
  353.                         t--;
  354.                         sign=0xa0;
  355.                     }
  356.              }
  357.            }
  358.          }
  359.    if(t<=0){z=t;t=k;}                           //t<=0,取絕對值
  360.    write(0,0x80);
  361.    for(i=0;i<13;i++)
  362.    write(1,table4[i]);                                //顯示提醒輸入界面
  363.    busy();
  364.    write(0,0xc0);
  365.    write(1,sign);                                        //將設定的值顯示
  366.    write(1,t/100%10+0x30);
  367.    write(1,t/10%10+0x30);
  368.    write(1,t%10+0x30);
  369.    write(1,0x43);
  370.    busy();
  371.    if(z<0)t=z;
  372.    delay1();
  373.    }
  374.    if(t<0)t=~t+1;
  375.    p=t;
  376.    if(ok_max==0)                                                //存儲上限值
  377.    {
  378.      table1[6]=p%10+0x30;
  379.      table1[5]=p/10%10+0x30;
  380.      table1[4]=sign;}
  381.    else{                                                                //存儲下限值
  382.                    table1[14]=p%10+0x30;
  383.         table1[13]=p/10%10+0x30;
  384.         table1[12]=sign;
  385.    }
  386.   }

  387. /******************外部中斷0函數*******************/
  388. void Exter1(void) interrupt 2
  389. {
  390.   EX1=0;
  391.   input();
  392.   EX1=1;
  393. }


  394. void main()
  395. {
  396.   uchar l,i=5;
  397.   init();
  398.   show0();
  399.   delay2();
  400.   input();
  401.   EA=1;
  402.   EX1=1;
  403.   IT1=1;
  404.   while(1)
  405.   {
  406.    out=1;                                 //電動機開關關閉
  407.    DeelTemperatre(ReadTemperature());         //去溫度值
  408.    show1();
  409.    deal(ReadTemperature());                                 //溫度處理
  410.    while(i--)                                                         //利用顯示延時
  411.     {
  412.           DeelTemperatre(ReadTemperature());
  413.       show1();
  414.       deal(ReadTemperature());
  415.         }
  416.   }
  417. }     
復制代碼
  
回復

使用道具 舉報

地板
ID:160550 發表于 2017-1-12 19:45 | 只看該作者

程序在這里,不知道哪里出了錯,這是原理圖

0.png (65.6 KB, 下載次數: 11)

0.png
回復

使用道具 舉報

5#
ID:161477 發表于 2017-1-16 21:37 | 只看該作者
你在proteus仿真溫度檢測得到么?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片高清 | 91九色网站| 91九色在线观看 | 97人人干| 日韩精品久久久久 | 四虎影院新网址 | 久久久免费电影 | 日韩中文字幕高清 | 国产精品精品视频一区二区三区 | 99热播精品| 久久综合九色综合欧美狠狠 | 精品在线观看一区二区 | 国产精品久久久久久久岛一牛影视 | 欧美男人天堂 | 天天躁日日躁aaaa视频 | av在线一区二区 | 精品国产一区二区三区久久 | 国产精品久久久久一区二区 | www.788.com色淫免费 | 激情网五月天 | 欧美日韩国产一区 | 亚洲深夜福利 | 正在播放国产精品 | 欧美乱做爰xxxⅹ久久久 | 成人免费视频网站在线看 | 97超碰在线免费 | 在线第一页 | 一区二区手机在线 | 一a一片一级一片啪啪 | 欧美a区| 一区在线免费视频 | 欧美日韩免费一区二区三区 | 中文字幕精品一区 | 国产高清精品一区二区三区 | 超碰网址 | 亚洲精品国产a久久久久久 午夜影院网站 | 亚洲一区播放 | 国产午夜精品一区二区三区四区 | a级毛片免费高清视频 | 精品国产乱码久久久久久闺蜜 | 久久久久久久久久久久久久国产 |