找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5154|回复: 4
打印 上一主题 下一主题
收起左侧

单片机+ADC0832热电阻PT100测温程序+Proteus仿真

  [复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit cs=P1^2;
  6. sbit clk=P1^0;
  7. sbit di=P1^1;
  8. uchar num,num1,i,a,b,c,e,f,g;
  9. int wendu;
  10. sbit we = P2^7;        //位定义数码管位选锁存器接口
  11. sbit du = P2^6;        //位定义数码管段选锁存器接口

  12. sbit pay_plus=P1^4;            
  13. sbit pay_minus=P1^3;        
  14. sbit confirm=P1^5;           


  15. sbit LED=P1^6;

  16. int TimerCount=0,time_count=0;
  17. int L_set_wendu=0;
  18. int H_set_wendu=20;
  19. bit   confirm_scan=1;
  20. bit   pay_plus_scan=1;
  21. bit   pay_minus_scan=1;
  22. //数码管段选表
  23. uchar code leddata[]={

  24.                 0x3F,  //"0"
  25.                 0x06,  //"1"
  26.                 0x5B,  //"2"
  27.                 0x4F,  //"3"
  28.                 0x66,  //"4"
  29.                 0x6D,  //"5"
  30.                 0x7D,  //"6"
  31.                 0x07,  //"7"
  32.                 0x7F,  //"8"
  33.                 0x6F,  //"9"
  34.                 0x40,  //"-"
  35.                 0x00,  //熄灭
  36.                 0x00  //自定义

  37.                          };
  38. void delay(unsigned long x)
  39. {
  40.         uchar y;
  41.         for(;x>0;x--)
  42.                 for(y=110;y>0;y--);
  43. }
  44. uchar ADC0832()
  45. {
  46.         cs=1;
  47.         clk=0;
  48.         cs=0;
  49.         di=1;
  50.                   
  51.         clk=1;   
  52.         clk=0;
  53.         di=1;

  54.         clk=1;
  55.         clk=0;
  56.         di=0;

  57.         clk=1;
  58.         clk=0;
  59.         di=1;
  60.         for(i=0;i<8;i++)
  61.         {
  62.                 clk=1;   
  63.                 clk=0;
  64.                 num=num<<1;  
  65.                 num|=(uchar)di;
  66.         }
  67.         cs=1;      
  68.         return num;        
  69. }

  70. int SG=0;
  71. void Key()
  72. {
  73.    
  74.   if(confirm!=confirm_scan)
  75.                 {               
  76.                         if(confirm==0)  //下降沿
  77.                         {   SG++;
  78. //                                step++;        
  79.                  if(SG>=3)
  80.                                             SG=0;
  81.                         }
  82.                        confirm_scan=confirm;               
  83.                 }
  84. }

  85. void Timer0_Init(void)
  86. {
  87.         TMOD |= 0x01;  
  88.     TH0=(65536-50000)/256;
  89.         TL0=(65536-50000)%256;
  90.         EA = 1;
  91.         ET0 = 1;
  92.         TR0 = 1;
  93. }

  94. void main()
  95. {
  96.         pay_plus=1;            
  97.     pay_minus=1;        
  98.     confirm=1;  
  99.         Timer0_Init();
  100.         while(1)
  101.         {Key();
  102.                 ADC0832();
  103.                 if(num<=38)
  104.                         wendu=num-69;
  105.                 if(num>38&&num<=70)
  106.                         wendu=num-70;
  107.                 if(num>70)
  108.                         wendu=num-71;
  109.         if(SG==0)
  110.         {
  111.         if(wendu>=0)
  112.                 {
  113.                         a=wendu/100;
  114.                         b=wendu%100/10;
  115.                         c=wendu%10;
  116.                         if(a>0)
  117.                         {
  118.                                 P0 = 0xfd;//1111 1101  只选通第二位数码管
  119.                                 we = 1;        //打开位选
  120.                                 we = 0;        //关闭位选
  121.                                 
  122.                                 P0 = leddata[a]; //显示2
  123.                                 du = 1;//打开段选
  124.                                 du = 0;        //关闭段选
  125.                                 delay(2);//延时
  126.                         }
  127.                         if(a!=0||b>0)
  128.                         {
  129.                                 P0 = 0xfb;// 1111 1011只选通第三位数码管
  130.                                 we = 1;        //打开位选
  131.                                 we = 0;        //关闭位选
  132.                                 
  133.                                 P0 = leddata[b]; //显示3
  134.                                 du = 1;//打开段选
  135.                                 du = 0;        //关闭段选
  136.                                 delay(2);//延时
  137.                         }
  138.                         P0 = 0xf7;//1111 0111  只选通第四位数码管
  139.                         we = 1;        //打开位选
  140.                         we = 0;        //关闭位选
  141.                         
  142.                         P0 = leddata[c]; //显示4
  143.                         du = 1;//打开段选
  144.                         du = 0;        //关闭段选
  145.                         delay(2);//延时
  146.                 }
  147.         }
  148.         
  149.         if(SG==1)    //设定上限报警
  150.         {            
  151.                             P0 = 0xfe;//1111 0111  只选通第二位数码管
  152.                                 we = 1;        //打开位选
  153.                                 we = 0;        //关闭位选
  154.                                 
  155.                                 P0 = 0x76; //显示2
  156.                                 du = 1;//打开段选
  157.                                 du = 0;        //关闭段选
  158.                                 delay(2);//延时

  159.           if(pay_minus!=pay_minus_scan)   //减少
  160.         {               
  161.                                 if(pay_minus==0)  //下降沿
  162.                                 {   H_set_wendu--;
  163.                                        
  164.                
  165.                            }
  166.                                 pay_minus_scan=pay_minus;               
  167.         }
  168.                 if(pay_plus!=pay_plus_scan)       //增加
  169.                         {               
  170.                                 if(pay_plus==0)  //下降沿
  171.                                 {  
  172.                                         H_set_wendu++;        
  173.                                                                
  174.                                 }                                       
  175.         pay_plus_scan=pay_plus;               
  176.                         }
  177.                
  178.                         
  179.                 if(H_set_wendu>=0)
  180.                 {
  181.                         e=H_set_wendu/100;
  182.                         f=H_set_wendu%100/10;
  183.                         g=H_set_wendu%10;
  184.                         if(e>0)
  185.                         {
  186.                                 P0 = 0xfd;//1111 1101  只选通第二位数码管
  187.                                 we = 1;        //打开位选
  188.                                 we = 0;        //关闭位选
  189.                                 
  190.                                 P0 = leddata[e]; //显示2
  191.                                 du = 1;//打开段选
  192.                                 du = 0;        //关闭段选
  193.                                 delay(2);//延时
  194.                         }
  195.                         if(e!=0||f>0)
  196.                         {
  197.                                 P0 = 0xfb;// 1111 1011只选通第三位数码管
  198.                                 we = 1;        //打开位选
  199.                                 we = 0;        //关闭位选
  200.                                 
  201.                                 P0 = leddata[f]; //显示3
  202.                                 du = 1;//打开段选
  203.                                 du = 0;        //关闭段选
  204.                                 delay(2);//延时
  205.                         }
  206.                         P0 = 0xf7;//1111 0111  只选通第四位数码管
  207.                         we = 1;        //打开位选
  208.                         we = 0;        //关闭位选
  209.                         
  210.                         P0 = leddata[g]; //显示4
  211.                         du = 1;//打开段选
  212.                         du = 0;        //关闭段选
  213.                         delay(2);//延时
  214.                 }
  215.                
  216.                

  217.                
  218.                
  219.                
  220.         }
  221.                
  222.         
  223.         if(SG==2)  //设定下限报警
  224.         {      
  225.                 P0 = 0xfe;//1111 0111  只选通第二位数码管
  226.                                 we = 1;        //打开位选
  227.                                 we = 0;        //关闭位选
  228.                                 
  229.                                 P0 = 0X38; //显示2
  230.                                 du = 1;//打开段选
  231.                                 du = 0;        //关闭段选
  232.                                 delay(2);//延时
  233.                 if( time_count>=2)
  234.                 {
  235.              if(pay_minus!=pay_minus_scan)   //减少金额
  236.                         {               
  237.                                 if(pay_minus==0)  //下降沿
  238.                                 {     L_set_wendu--;
  239. //                                   pay_price_shi--;        
  240. //                                if(pay_price_shi==0)
  241. //                                        pay_price_shi=0;                                                                                       
  242. //                                }
  243.                                 
  244.                         } pay_minus_scan=pay_minus;               
  245. }
  246.                 if(pay_plus!=pay_plus_scan)       //增加金额
  247.                         {               
  248.                                 if(pay_plus==0)  //下降沿
  249.                                 {   L_set_wendu++;
  250. //                                        pay_price_shi++;               
  251. //                                        if(pay_price_shi>=10)
  252. //                                                pay_price_shi=10;                                       
  253.                                 }                                       
  254.                                 pay_plus_scan=pay_plus;               
  255.                         }
  256.                 }
  257.         
  258.         
  259.                         
  260.   
  261.                         if(L_set_wendu>=0)
  262.                 {
  263.                         e=L_set_wendu/100;
  264.                         f=L_set_wendu%100/10;
  265.                         g=L_set_wendu%10;
  266.                         if(a>0)
  267.                         {
  268.                                 P0 = 0xfd;//1111 1101  只选通第二位数码管
  269.                                 we = 1;        //打开位选
  270.                                 we = 0;        //关闭位选
  271.                                 
  272.                                 P0 = leddata[e]; //显示2
  273.                                 du = 1;//打开段选
  274.                                 du = 0;        //关闭段选
  275.                                 delay(2);//延时
  276.                         }
  277.                         if(f!=0||g>0)
  278.                         {
  279.                                 P0 = 0xfb;// 1111 1011只选通第三位数码管
  280.                                 we = 1;        //打开位选
  281.                                 we = 0;        //关闭位选
  282.                                 
  283.                                 P0 = leddata[f]; //显示3
  284.                                 du = 1;//打开段选
  285.                                 du = 0;        //关闭段选
  286.                                 delay(2);//延时
  287.                         }
  288.                         P0 = 0xf7;//1111 0111  只选通第四位数码管
  289.                         we = 1;        //打开位选
  290.                         we = 0;        //关闭位选
  291.                         
  292.                         P0 = leddata[g]; //显示4
  293.                         du = 1;//打开段选
  294.                         du = 0;        //关闭段选
  295.                         delay(2);//延时
  296.                 }
  297.                         
  298.         }
  299.         
  300.         
  301.         if((H_set_wendu<=wendu)||(L_set_wendu>=wendu))
  302.         {
  303.         if(TimerCount>=20)  //1秒
  304.         {TimerCount=0;
  305.          LED=!LED;
  306.         }
  307. //        delay(2000);//延时
  308. //        LED=1;
  309.         }
  310.         
  311. //        if((H_set_wendu>=wendu)||(L_set_wendu<=wendu))
  312. //        {
  313. //         LED=0;
  314. //        }
  315. //                else
  316. //                {
  317. //                        num1=abs(wendu);
  318. //                        a=num1/100;
  319. //                        b=num1%100/10;
  320. //                        c=num1%10;
  321. //                        if(num1>9)
  322. //                        {
  323. //                                P0 = 0xfd;//1111 1101  只选通第二位数码管
  324. //                                we = 1;        //打开位选
  325. //                                we = 0;        //关闭位选
  326. //                                
  327. //                                P0 = leddata[10]; //显示2
  328. //                                du = 1;//打开段选
  329. //                                du = 0;        //关闭段选
  330. //                                delay(2);//延时
  331. //                        }
  332. //                        else
  333. //                        {
  334. //                                P0 = 0xfb;// 1111 1011只选通第三位数码管
  335. //                                we = 1;        //打开位选
  336. //                                we = 0;        //关闭位选
  337. //                                
  338. //                                P0 = leddata[10]; //显示3
  339. //                                du = 1;//打开段选
  340. //                                du = 0;        //关闭段选
  341. //                                delay(2);//延时
  342. //                        }
  343. //                        if(a>0)
  344. //                        {
  345. //                                P0 = 0xfd;//1111 1101  只选通第二位数码管
  346. //                                we = 1;        //打开位选
  347. //                                we = 0;        //关闭位选
  348. //                                
  349. //                                P0 = leddata[a]; //显示2
  350. //                                du = 1;//打开段选
  351. //                                du = 0;        //关闭段选
  352. //                                delay(2);//延时
  353. //                        }
  354. //                        if(a!=0||b>0)
  355. //                        {
  356. //                                P0 = 0xfb;// 1111 1011只选通第三位数码管
  357. //                                we = 1;        //打开位选
  358. //                                we = 0;        //关闭位选
  359. //                                
  360. //                                P0 = leddata[b]; //显示3
  361. //                                du = 1;//打开段选
  362. //                                du = 0;        //关闭段选
  363. //                                delay(2);//延时
  364. //                        }
  365. //                        P0 = 0xf7;//1111 0111  只选通第四位数码管
  366. //                        we = 1;        //打开位选
  367. //                        we = 0;        //关闭位选
  368. //                        
  369. //                        P0 = leddata[c]; //显示4
  370. //                        du = 1;//打开段选
  371. //                        du = 0;        //关闭段选
  372. //                        delay(2);//延时
  373. //                }
  374.         }
  375. }
  376.         
  377. void TIM0_IRQHandler(void)  interrupt 1   
  378. {
  379.    TH0=(65536-50000)/256;
  380.    TL0=(65536-50000)%256;
  381.          TimerCount++;
  382.           time_count++;   
  383. }
复制代码

所有资料51hei提供下载:
pt100.rar (167.74 KB, 下载次数: 126)


评分

参与人数 1黑币 +15 收起 理由
531313893 + 15 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:854995 发表于 2020-12-7 17:14 | 只看该作者
电路图不完整吧
回复

使用道具 举报

板凳
ID:867138 发表于 2021-1-11 16:52 | 只看该作者
请问大大:
ADC0832();
                if(num<=38)
                        wendu=num-69;
                if(num>38&&num<=70)
                        wendu=num-70;
                if(num>70)
                        wendu=num-71;
这一段代码是什么意思?adc输出的num再进行这一次转换变成温度值是什么原理?和adc0832的原理有关吗?谢谢!
回复

使用道具 举报

地板
ID:896842 发表于 2021-3-31 20:46 | 只看该作者
这个测温有范围吗
回复

使用道具 举报

5#
ID:77126 发表于 2021-6-28 15:22 | 只看该作者
谢谢楼主分享,下来好好学习!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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