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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機熱電偶變送器proteus仿真就動一下就沒反應了?

[復制鏈接]
跳轉到指定樓層
樓主
proteus仿真就動一下就沒反應了 求助啊
主要做熱電偶變送器

程序還有一部分沒編完
/*2019年5月13日*/
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. /*宏定義*/
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. /*串口、變量定義,位聲明*/
  7. sbit ds18b20_io=P1^1;//18b20輸入端口
  8. sbit tlc_clk=P1^2; //2543CLK端口
  9. sbit tlc_din=P1^3; //2543DIN端口
  10. sbit tlc_dout=P1^4; //2543DOUT端口
  11. sbit tlc_cs=P1^5; //2543片選端口
  12. sbit max485_1=P3^0 ; //485??端口
  13. sbit max485_2=P3^1 ; //485??端口
  14. sbit max485_src=P3^4 ; //485使能端口

  15. sbit E=P2^0 ;  //1602EN端口
  16. sbit RW=P2^1 ;  //1602RW端口
  17. sbit RS=P2^2 ;  //1602RS端口
  18. /*鍵盤口定義*/
  19. /*鍵盤口定義*/
  20. /*鍵盤口定義*/
  21. /*鍵盤口定義*/
  22. /*各函數聲明*/
  23.    void delay(uchar i);   //延時函數
  24.    void ds_init();       //18b20初始化函數
  25.    bit bitRead();     //18b20位讀取
  26.    uchar byteRead();   //18b20字節讀取
  27.    void writeByte(uchar dat);//向18B20寫入一字節數據
  28.    void sendChangeCmd();  //向18b20發送溫度轉換命令
  29.    void sendReadCmd();   //向18b2發送溫度讀取命令
  30.    uint getTmpValue();   //向18b2讀取溫度
  31.    void AD2543_ini();        //2543初始化程序
  32.    uint Read2543(unsigned char port); //2543讀取程序
  33.    void WaitNus(uint x);            //延時x微秒
  34.    void BUSYFLAG(void);        //忙標志查詢,忙時一直查詢
  35.    void writeCommand(uchar command);   //寫命令字(地址)
  36.    void writeData(uchar DATA);     //寫控制字
  37.    void LCDINT(void);        //LCD初始化函數
  38.    uint filtration(uint a,uint b,uint c);  //濾波函數

  39. /*各數組定義*/
  40.     code uint TP_DATA[61][2]={{0,0},{100,397},{200,789},{300,1203},{400,1612},{500,2023},{600,2436},
  41.             {700,2851},{800,3267},{900,3682},{1000,4055},{1100,4468},{1200,4879},
  42.          {1300,5288},{1400,5694},{1500,6138},{1600,6540},{1700,6941},{1800,7340},
  43.          {1900,7739},{2000,8138},{2100,8539},{2200,8940},{2300,9343},{2400,9747},
  44.          {2500,10153},{2600,10562},{2700,10971},{2800,11382},{2900,11795},{3000,12209},
  45.          {3100,12624},{3200,13040},{3300,13457},{3400,13874},{3500,14293},{3600,14713},
  46.          {3700,15133},{3800,15554},{3900,15975},{4000,16397},{4100,16820},{4200,17243},
  47.          {4300,17667},{4400,18091},{4500,18516},{4600,18941},{4700,19366},{4800,19792},
  48.          {4900,20218},{5000,20644},{5100,21071},{5200,21497},{5300,21924},{5400,22350},
  49.          {5500,22776},{5600,23203},{5700,23269},{5800,24055},{5900,24480},{6000,24905}};



  50.     /*函數部分*/   
  51.    void main()     //主函數
  52.    {
  53.   LCDINT();      /*各芯片初始化*/
  54.   ds_init();
  55.   AD2543_ini();

  56.   TMOD=0x01;    //設置定時器0為工作方式1
  57.   TH0=(65536-50000)/256;
  58.   TL0=(65536-50000)%256;
  59.   EA=1;     //開總中斷
  60.   ET0=1;     //開定時器0中斷
  61.   TR0=1;     //啟動定時器0
  62.   while(1)
  63.    {;}
  64.   
  65.    }

  66. /*延時函數,延時i毫秒 */
  67. void delay(uchar i)
  68. {
  69.   uchar j,k;
  70.   for(j=i;j>0;j--)
  71.   {
  72.    for(k=125;k>0;k--);
  73.   }
  74. }

  75. /*18b20初始化函數*/
  76. void ds_init()
  77. {
  78.   uint i;
  79.   ds18b20_io=0;
  80.   i=103;
  81.   while(i>0);i--;
  82.   ds18b20_io=1;
  83.   i=4;
  84.   while(i>0);i--;
  85. }
  86. /*18b20位讀取*/
  87. bit bitRead()
  88. {
  89.    uint i;
  90.      bit b;
  91.   ds18b20_io=0;
  92.      i++;
  93.      ds18b20_io = 1;
  94.      i++; i++;
  95.         b = ds18b20_io;
  96.         i = 8;
  97.         while(i>0) i--;
  98.         return b;
  99. }
  100. /*字節讀取*/
  101. unsigned char readByte()
  102.     {
  103.         uint i;
  104.         uchar j, dat;
  105.         dat = 0;
  106.         for(i=0; i<8; i++)
  107.          {
  108.             j = bitRead();
  109.             dat = (j << 7) | (dat >> 1);
  110.         }
  111.         return dat;
  112.     }

  113. /*向DS18B20寫入一字節數據*/
  114. void writeByte(uchar dat)
  115.   {
  116.      uint i;
  117.      uchar j;
  118.      bit b;
  119.      for(j = 0; j < 8; j++)
  120.       {
  121.          b = dat & 0x01;  //取最后一位
  122.          dat >>= 1;         
  123.          if(b)      //寫"1", 讓低電平持續2個小延時, 高電平持續8個小延時
  124.           {
  125.              ds18b20_io = 0;
  126.              i++; i++;
  127.              ds18b20_io = 1;
  128.              i = 8;
  129.     while(i>0) i--;
  130.          }
  131.          else     //寫"0", 讓低電平持續8個小延時, 高電平持續2個小延時
  132.           {
  133.              ds18b20_io = 0;
  134.              i = 8; while(i>0) i--;
  135.              ds18b20_io = 1;
  136.              i++; i++;
  137.          }
  138.      }
  139. }
  140. /*向18b20發送溫度轉換命令*/
  141. void sendChangeCmd()
  142. {
  143.   ds_init();    //初始化DS18B20, 無論什么命令, 首先都要發起初始化
  144.   delay(1);    //延時1ms, 因為DS18B20會拉低DQ 60~240us作為應答信號
  145.   writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
  146.   writeByte(0x44); //寫入溫度轉換命令字 Convert T
  147. }
  148. /*向18b2發送溫度讀取命令*/
  149. void sendReadCmd()
  150.   {
  151.      ds_init();
  152.      delay(1);
  153.      writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
  154.      writeByte(0xbe); //寫入讀取數據令字 Read Scratchpad
  155. }
  156.   /*獲取當前溫度值*/
  157. uint getTmpValue()
  158.   {
  159.      uint ds18b20_value;
  160.   float t;
  161.   uchar low, high;
  162.   sendReadCmd();
  163.    low = readByte();      //連續讀取兩個字節數據
  164.   high = readByte();
  165.    ds18b20_value = high;
  166.   ds18b20_value <<= 8;
  167.    ds18b20_value |= low;
  168.   t=ds18b20_value*0.0625;
  169.   ds18b20_value=t*10+0.5;
  170.   return ds18b20_value;
  171.    }
  172.    /*2543初始化函數*/
  173.    void AD2543_ini()         
  174. {
  175.   tlc_cs=1;
  176.      tlc_cs=0;
  177. }
  178.    /*2543讀取函數*/
  179.    unsigned int Read2543(unsigned char port)        //port為準備讀取的端口
  180. {
  181. uint ad=0,n;//變量ad為返回值,n為臨時變量(用于端口操作)
  182. uchar i;

  183. tlc_clk=0;      //clk先給0,避免出錯
  184. tlc_cs=0;       //片選,0有效
  185. n=port;           //用n來操作端口port,目的是寫2次端口地址,這樣回來的才是真正的端口ad值
  186. n<<=4;          //先偏移4,讓地址到高位
  187. for(i=0;i<12;i++)   //輸入12位端口地址(其實前4位是地址,后8位都是0)
  188.          {
  189.            tlc_din=(bit)(n&0x80);  //高位(第8位)輸出。(串口模式)
  190.            tlc_clk=1;  
  191.            tlc_clk=0;
  192.            n<<=1;       //左移1位。利用循環逐位輸出
  193.          }
  194. tlc_cs=1;        //關閉片選
  195.            {_nop_();_nop_();_nop_();_nop_();}         //緩沖一下
  196.          {_nop_();_nop_();_nop_();_nop_();} //緩沖
  197.                  
  198. tlc_cs=0;  //再次片選
  199. n=port;     //再次寫端口地址
  200. n<<=4;
  201. for(i=0;i<12;i++)
  202.          {
  203.            tlc_din=(bit)(n&0x80);
  204.            tlc_clk=1;
  205.            tlc_clk=0;
  206.            n<<=1;
  207.          }
  208. tlc_cs=1;   //停止
  209.            {_nop_();_nop_();_nop_();_nop_();}
  210.          {_nop_();_nop_();_nop_();_nop_();}

  211. tlc_cs=0;                 //片選。開始讀取數據
  212. for(i=0;i<12;i++)     //12位循環
  213.          {
  214.          ad<<=1;         //先左移1位
  215.            if(tlc_dout) ad|=0x01;  //判斷:如AD_OUT為1,則ad低位賦值1
  216.            tlc_clk=1;
  217.            tlc_clk=0;
  218.          }
  219. tlc_cs=1;             //結束讀數據
  220.          
  221. return(ad);           //返回值ad
  222. }

  223. /*LCD1602程序*/
  224. void WaitNus(uint x)//延時 x us
  225. {

  226.   unsigned char j;
  227.   
  228.   while(x--)
  229.   
  230.    {
  231.     for(j=0;j<12;j++)
  232.   
  233.      {;}
  234.   
  235.    }

  236. }
  237. /*忙標志判斷*/
  238. void BUSYFLAG(void)

  239. {

  240.   uchar temp;
  241.   
  242.   P0=0xff;
  243.   
  244.   RS=1;
  245.   
  246.   RW=1;
  247.   
  248.   while(1)

  249.   {
  250.   
  251.    E=1;
  252.    
  253.    temp=P0; //讀狀態字
  254.    
  255.    E=0;
  256.    
  257.    if ((temp&0x80)==0)
  258.    
  259.    break; //判斷忙標志是否為0
  260.   
  261.   }

  262. }
  263. /*寫命令字 地址*/
  264. void writeCommand(uchar command)
  265. {

  266.   BUSYFLAG();
  267.   
  268.   RS=0;
  269.   
  270.   RW=0;
  271.   
  272.   E=1;
  273.   
  274.   P0=command;
  275.   
  276.   E=0;

  277. }
  278. /*寫控制字*/
  279. void writeData(uchar DATA)
  280. {

  281.   BUSYFLAG();
  282.   RS=1;
  283.   
  284.   RW=0;
  285.   
  286.   E=1;
  287.   
  288.   P0=DATA;
  289.   
  290.   E=0;

  291. }
  292. /*lcd初始化*/
  293. void LCDINT(void)
  294. {

  295.   delay(15);////延時 x ms
  296.   
  297.   writeCommand(0x30);//8位
  298.   
  299.   delay(4);////延時 x ms
  300.   
  301.   writeCommand(0x30);
  302.   
  303.   WaitNus(100);////延時 x us
  304.   
  305.   writeCommand(0x30);
  306.   
  307.   writeCommand(0x38);//兩行顯示模式
  308.   
  309.   writeCommand(0x01);//清屏
  310.   
  311.   writeCommand(0x06);//畫面不動
  312.   
  313.   writeCommand(0x0c);//光標設置
  314.   
  315.   writeCommand(0x80);//顯示首址

  316. }

  317. /*終值濾波函數*/
  318. uint filtration (uint a,uint b,uint c)
  319. {
  320.   uint mid;
  321.   if((a<b&&a>c)||(a<c&&a>b))
  322.    {mid=a;}
  323.   else if((b<a&&b>c)||(b<c&&b>a))
  324.    {mid=b;}
  325.   else
  326.    {mid=c;}
  327.   return mid;
  328. }  

  329. /*中斷函數*/
  330. void RUN(void) interrupt 0
  331. {
  332.   

  333.   uint a,b,c;   //臨時變量
  334.   uint Tmp,V, Vchg;
  335.   uint i=0;     
  336.   a=getTmpValue();     // 采集18b20的溫度數據
  337.   b=getTmpValue();   
  338.   c=getTmpValue();
  339.   Tmp=filtration (a,b,c);    // 調用中值濾波函數
  340.       
  341.   a=Read2543(0); // 采集2543電勢數據        
  342.   b=Read2543(0);        
  343.   c=Read2543(0);
  344.   
  345.   V=filtration (a,b,c)+0.5;    // 調用中值濾波函數
  346.   while(Tmp>TP_DATA[i][0])
  347.    {i++;}
  348.       
  349.   Vchg=Tmp*(float)(TP_DATA[i][1]-TP_DATA[i-1][1])/(TP_DATA[i][0]-TP_DATA[i-1][0])+TP_DATA[i-1][0];
  350.   
  351.   V=V/200.7*1000+Vchg;
  352.   i=0;
  353.   while(Tmp>TP_DATA[i][1])
  354.    {i++;}
  355.       
  356.   Tmp=TP_DATA[i][0]-(float)(TP_DATA[i][1]-V)*(TP_DATA[i][0]-TP_DATA[i-1][0])/(TP_DATA[i][1]-TP_DATA[i-1][1]); //溫度的十倍
  357.          
  358.          
  359.   writeCommand(0);        
  360.   writeData(Tmp%100);        
  361.   writeCommand(0);        
  362.   writeData(Tmp%10);
  363.   writeCommand(0);        
  364.   writeData(Tmp%100); // 送顯(待優化)   
  365.      
  366. }
復制代碼

  //按鍵功能 485通信功能 顯示優化


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人精品一区二区男人看 | 五月天国产视频 | 伊人久久精品一区二区三区 | 久久久精品一区二区三区 | 精品久久久一区 | 亚洲 欧美 综合 | 日本久久久久久 | 成人在线一区二区 | 日本一区二区三区在线观看 | 国产成人综合久久 | 羞羞视频网站免费观看 | 第四色狠狠 | 99久久精品免费看国产四区 | 91精品国产色综合久久 | 精品福利一区二区三区 | 免费一区二区 | 亚洲天堂一区二区 | 天天色天天射天天干 | 久久久久国产精品一区二区 | 欧美精品乱码久久久久久按摩 | 久久久精品一区二区 | 久久偷人 | 亚洲国产精品91 | 成人在线精品视频 | 欧美午夜精品久久久久久浪潮 | 精品国产乱码久久久久久影片 | 日本不卡在线视频 | 91久久久www播放日本观看 | 国产欧美一区二区三区久久手机版 | 一级黄色毛片 | 午夜免费精品视频 | 国产一区免费视频 | 久久av一区 | 久久久久国 | 中文字幕欧美日韩一区 | 狠狠爱免费视频 | 婷婷成人在线 | 精品国产免费人成在线观看 | 国产精品一区二区久久久久 | 国产精品成人在线播放 | 国产黄色在线观看 |