找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8068|回复: 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, 下载次数: 236)
2、仿真图.zip (69.53 KB, 下载次数: 223)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶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 单片机教程网

快速回复 返回顶部 返回列表