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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+PT100+ADC0832測溫程序,含Proteus仿真圖

  [復制鏈接]
跳轉到指定樓層
樓主
PT100測溫仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h> //包含_nop_()函數定義的頭文件
  3. typedef unsigned char uchar;
  4. typedef unsigned int  uint;
  5. sbit SDA1=128;//串行數據輸入,對應595的14腳SER
  6. sbit SCL1=129;//移位寄存器時鐘輸入,對應595的11腳SCK
  7. sbit SCL2=130;//存儲寄存器時鐘輸入,對應595的12腳RCK
  8. sbit SDA2=131;//串行數據輸入,對應595的14腳SER
  9. sbit SCL3=132;//移位寄存器時鐘輸入,對應595的11腳SCK
  10. sbit SCL4=133;//存儲寄存器時鐘輸入,對應595的12腳RCK
  11. //ADC0832端口引腳定義
  12. sbit CS=P1^0;//將CS位定義為P3.4引腳
  13. sbit CLK=P1^1;//將CLK位定義為P1.0引腳
  14. sbit DIO=P1^2;//將DIO位定義為P1.1引腳
  15. sbit k1=161;//加按鍵
  16. sbit k2=162;//減按鍵
  17. sbit k3=160;//設置按鍵
  18. sbit beep=163;//蜂鳴器
  19. uchar aa=60,bb=10,num;
  20. //以下是LCD1602驅動程序
  21. void delay1000(uint aaaaaa)
  22. {
  23.         uint bbbbbb,cccccc;
  24.         for(bbbbbb=aaaaaa;bbbbbb>0;bbbbbb--)
  25.                 for(cccccc=110;cccccc>0;cccccc--);
  26. }
  27. void delay(uint z)
  28. {
  29.         uint x,y;
  30.         for(x=100;x>1;x--)
  31.                 for(y=z;y>1;y--);
  32. }
  33. void in(uchar dddddd)
  34. {
  35.         uchar eeeeee;
  36.         for(eeeeee=0;eeeeee<8;eeeeee++)   //循環8次,剛好移完8位
  37.         {
  38.               dddddd<<=1;
  39.                   SCL1=CY;
  40.                   SDA1=1;        //先將移位寄存器控制引腳置為低   
  41.               _nop_();
  42.                   _nop_();
  43.               SDA1=0;
  44.         }
  45. }
  46. void out()
  47. {
  48.         SCL2=0;   //先將存儲寄存器引腳置為低
  49.         _nop_();
  50.         SCL2=1;    //再置為高,產生移位時鐘上升沿,上升沿時移位寄存器的數據進入數據存儲寄存器,更新顯示數據。
  51.         _nop_();
  52.         SCL2=0;
  53. }
  54. void in1(uchar ffffff)
  55. {
  56.         uchar gggggg;
  57.         for(gggggg=0;gggggg<8;gggggg++)   //循環8次,剛好移完8位
  58.         {
  59.               ffffff<<=1;
  60.                   SCL3=CY;
  61.                   SDA2=1;        //先將移位寄存器控制引腳置為低   
  62.               _nop_();
  63.                   _nop_();
  64.               SDA2=0;
  65.         }
  66. }
  67. void out1()
  68. {
  69.         SCL4=0;   //先將存儲寄存器引腳置為低
  70.         _nop_();
  71.         SCL4=1;    //再置為高,產生移位時鐘上升沿,上升沿時移位寄存器的數據進入數據存儲寄存器,更新顯示數據。
  72.         _nop_();
  73.         SCL4=0;
  74. }
  75. void write_com(uchar hhhhhh)
  76. {
  77.         in(248);//再傳段碼
  78.         out();
  79.         delay1000(2);//延遲時間2ms以內
  80.         in1(hhhhhh);  //再傳段碼
  81.         out1();
  82.         delay1000(2);             //延遲時間2ms以內
  83.         in(252);//再傳段碼
  84.         out();
  85.         delay1000(2);//延遲時間2ms以內
  86.         in(248);//再傳段碼
  87.         out();
  88.         delay1000(2);//延遲時間2ms以內
  89. }
  90. void write_date(uchar iiiiii)
  91. {
  92.         in(249);//再傳段碼
  93.         out();
  94.         delay1000(2);//延遲時間2ms以內
  95.         in1(iiiiii);  //再傳段碼
  96.         out1();
  97.         delay1000(2);             //延遲時間2ms以內
  98.         in(253);//再傳段碼
  99.         out();
  100.         delay1000(2);//延遲時間2ms以內
  101.         in(249);//再傳段碼
  102.         out();
  103.         delay1000(2);//延遲時間2ms以內
  104. }
  105. //LCD1602液晶初始化子函數
  106. void init_LCD1602()
  107. {
  108.     write_com(56);
  109.         write_com(12);
  110.         write_com(6);
  111.         write_com(128);
  112.         write_com(1);
  113.         write_com(0xc0);
  114.         write_date('T');
  115.         write_date('H');
  116.         write_date('=');
  117.         write_date(48+aa/100);
  118.         write_date(48+aa%100/10);
  119.         write_date(48+aa%10);
  120.         write_date(' ');
  121.         write_date(' ');
  122.         write_date('T');
  123.         write_date('L');
  124.         write_date('=');
  125.         write_date(48+bb/100);
  126.         write_date(48+bb%100/10);
  127.         write_date(48+bb%10);
  128. }
  129. //ADC0832模數轉換芯片采集子函數
  130. uchar A_D()
  131. {
  132.         uchar aaa,bbb;
  133.         CS=1; //一個轉換周期開始
  134.         CLK=0; //為第一個脈沖作準備
  135.         CS=0; //CS置0,片選有效
  136.         DIO=1; //DIO置1,規定的起始信號
  137.         CLK=1; //第一個脈沖
  138.         CLK=0; //第一個脈沖的下降沿,此前DIO必須是高電平
  139.         DIO=1; //DIO置1, 通道選擇信號
  140.         CLK=1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
  141.         CLK=0; //第二個脈沖下降沿
  142.         DIO=0; //DI置0,選擇通道0
  143.         CLK=1; //第三個脈沖
  144.         CLK=0; //第三個脈沖下降沿
  145.         DIO=1; //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
  146.         CLK=1; //第四個脈沖
  147.         for(aaa=0;aaa<8;aaa++) //高位在前
  148.         {
  149.                 CLK=1; //第四個脈沖
  150.                 CLK=0;
  151.                 bbb<<=1; //將下面儲存的低位數據向右移
  152.                 bbb|=(uchar)DIO; //將輸出數據DIO通過或運算儲存在dat最低位
  153.         }
  154.         CS=1; //片選無效
  155.         return bbb; //將讀書的數據返回
  156. }
  157. //按鍵掃描子函數
  158. void key()
  159. {        
  160.         if(k3==0)//設置按鍵
  161.         {
  162.                 delay(10);
  163.                 if(k3==0)
  164.                 {                                                        //設置位置設定
  165.                         while(k3==0);
  166.                         num++;
  167.                         if(num==1)                  // 無設置位置
  168.                         {
  169.                                 write_com(0xc0+5);//液晶第二行第4個位置
  170.                                 write_com(0x0f);//光標閃爍
  171.                         }
  172.                         if(num==2)//光標閃爍
  173.                         {
  174.                                 write_com(0xc0+13);                  
  175.                         }
  176.                         if(num==3)//正常模式
  177.                         {
  178.                                 num=0;//num值清0
  179.                                 write_com(0x0c);//光標不閃爍                  
  180.                         }        
  181.                 }        
  182.         }        
  183.         if(k1==0)
  184.         {
  185.                 delay(10);
  186.                 if(k1==0)
  187.                 {
  188.                         if(num==1)
  189.                         {
  190.                                 aa++;
  191.                                 if(aa>110)
  192.                                         aa=bb+10;
  193.                                 write_com(0xc5);
  194.                                 write_date(48+aa%10);
  195.                                 write_com(0xc3);
  196.                                 write_date(48+aa/100);
  197.                                 write_com(0xc4);
  198.                                 write_date(48+aa%100/10);
  199.                         }
  200.                         if(num==2)
  201.                         {
  202.                                 bb++;                          //bbbbb1>aaaaa1時  是個錯誤,這里避免此情況發生
  203.                                 if(bb>=aa)
  204.                                         bb=aa-10;
  205.                                 write_com(0xc0+13);
  206.                                 write_date(48+bb%10);
  207.                                 write_com(0xc0+11);
  208.                                 write_date(48+bb/100);
  209.                                 write_com(0xc0+12);
  210.                                 write_date(48+bb%100/10);
  211.                         }        
  212.                 }        
  213.                 while(k1==0);
  214.         }
  215.         if(k2==0)
  216.         {
  217.                 delay(10);
  218.                 if(k2==0)
  219.                 {
  220.                         if(num==1)
  221.                         {
  222.                                 aa--;                         //aaaaa1<bbbbb1時  是個錯誤,這里避免此情況發生
  223.                                 if(aa<=bb)
  224.                                         aa=aa+10;
  225.                                 write_com(0xc5);
  226.                                 write_date(48+aa%10);
  227.                                 write_com(0xc3);
  228.                                 write_date(48+aa/100);
  229.                                 write_com(0xc4);
  230.                                 write_date(48+aa%100/10);
  231.                         }
  232.                         if(num==2)
  233.                         {        
  234.                                 if(bb>0)
  235.                                         bb--;
  236.                                 if(bb==0)
  237.                                         bb=0;
  238.                                 write_com(0xc0+13);
  239.                                 write_date(48+bb%10);
  240.                                 write_com(0xc0+11);
  241.                                 write_date(48+bb/100);
  242.                                 write_com(0xc0+12);
  243.                                 write_date(48+bb%100/10);
  244.                         }        
  245.                 }        
  246.                 while(k2==0);
  247.         }
  248. }
  249. void display()//u=2.55+T/100, 2.55反映在AD上為0x83
  250. {
  251.           uchar aaaa,bbbb,cccc; //儲存A/D轉換后的值
  252.     uchar tab[4];
  253.         aaaa=A_D(); //進行A/D轉換
  254.         aaaa=aaaa-0x83;
  255.     bbbb=aaaa*2-4;
  256.         if(bbbb<=110)
  257.         {
  258.                  bbbb=bbbb-2;
  259.                 tab[3]=bbbb/100;
  260.                  tab[2]=bbbb/10-tab[3]*10;
  261.                  tab[1]=bbbb%10;
  262.                  tab[0]=cccc%5*2;
  263.                 write_com(0x80);
  264.                 write_date('T');
  265.                 write_date('=');
  266.                 write_date(48+tab[3]);
  267.                 write_date(48+tab[2]);
  268.                 write_date(48+tab[1]);
  269.                 write_date('.');
  270.                 write_date(48+tab[0]);
  271.                 if(bbbb>aa)
  272.                 {
  273.                         beep=0;
  274.                 }               
  275.                 else
  276.                         beep=1;
  277.                 if(bbbb<bb)
  278.                 {
  279.                         beep=0;
  280.                 }               
  281.                 else
  282.                         beep=1;
  283.         }
  284.         else
  285.         {
  286.                   bbbb=256-bbbb;
  287.               tab[3]=11;
  288.               tab[2]=bbbb/10;
  289.               tab[1]=bbbb%10;
  290.               tab[0]=cccc%5*2;
  291.                 write_com(0x80);
  292.                 write_date('T');
  293.                 write_date('=');
  294.                 write_date('-');
  295.                 write_date(48+tab[2]);
  296.                 write_date(48+tab[1]);
  297.                 write_date('.');
  298.                 write_date(48+tab[0]);
  299.                
  300.         }
  301. }
  302. //主函數
  303. void main()
  304. {
  305.         init_LCD1602(); //將液晶初始化
  306.         while(1)
  307.         {
  308.                 if(num==0)
  309.                 {
  310.                         display();
  311.                 }
  312.                 else
  313.                         beep=1;                        
  314.                 key();        
  315.         }
  316. }
復制代碼

所有資料51hei提供下載:
1、源程序.zip (32.46 KB, 下載次數: 242)
2、仿真圖.zip (69.53 KB, 下載次數: 229)


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

使用道具 舉報

沙發
ID:421308 發表于 2019-7-13 12:30 | 只看該作者
謝謝分享
回復

使用道具 舉報

板凳
ID:427459 發表于 2019-8-21 19:47 | 只看該作者
謝謝分享 但是我下載了仿真圖打不開,,,,尷尬 我的是protues8.6
回復

使用道具 舉報

地板
ID:603234 發表于 2019-8-24 05:33 | 只看該作者
961134467 發表于 2019-8-21 19:47
謝謝分享 但是我下載了仿真圖打不開,,,,尷尬 我的是protues8.6

網上可以下載8.8
回復

使用道具 舉報

5#
ID:442274 發表于 2019-9-3 20:24 | 只看該作者
好東西 試試
回復

使用道具 舉報

6#
ID:377803 發表于 2019-9-12 15:18 | 只看該作者
如果單片機用本身帶AD的,是不是就不用ADC0832了,我正好有幾片STC12C5202AD的單片機,該怎么改這個程序呢。
回復

使用道具 舉報

7#
ID:243394 發表于 2019-9-12 17:53 | 只看該作者
為何只能顯示偶數的溫度?
回復

使用道具 舉報

8#
ID:896842 發表于 2021-3-26 15:13 | 只看該作者
樓主寫的很棒,感謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人亚洲性情网站www在线观看 | 日本久久精 | 日韩精品一区二区三区在线播放 | 三级免费网 | 精品国产91乱码一区二区三区 | 一本色道精品久久一区二区三区 | 国产欧美日韩视频 | 卡通动漫第一页 | 日韩精品中文字幕一区二区三区 | 久久精品亚洲 | 亚洲精品一区二区三区蜜桃久 | 精品美女 | 精品粉嫩超白一线天av | 91中文字幕在线观看 | 精品伊人 | 亚洲欧美激情四射 | 午夜精品久久久久久久久久久久久 | 美女国内精品自产拍在线播放 | 国产精品久久久久久久毛片 | 91精品国产91 | 2018天天干天天操 | 毛片高清 | 亚洲成色777777在线观看影院 | 亚洲自拍偷拍免费视频 | 在线观看av网站永久 | 视频三区| 国产成人综合一区二区三区 | 欧美一区二 | 91网站在线播放 | 亚洲色在线视频 | 久久久精品视 | 亚洲日韩中文字幕一区 | 日韩成人一区 | 久久一二区 | 久久999 | 国产精品久久久久久久免费观看 | 99久久婷婷国产综合精品 | 一级毛片色一级 | 午夜影院在线视频 | 国产91在线视频 | 青青草在线视频免费观看 |