找回密码
 立即注册

QQ登录

只需一步,快速开始

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

温度采集系统的软件 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:397024 发表于 2018-9-14 15:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
100黑币
要求:基于51单片机,采用按键作为查询控制,通过电位器模拟温度信息,通过 AD 转换器将其转换,由单片机进行处理并将温度值显示在 LED
数码管上。


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

使用道具 举报

沙发
ID:359145 发表于 2018-9-14 20:57 | 只看该作者
你说的这些都有成熟的代码,把单片机AD,IO口用起来就行了,没有太多原创的东西所以就是花点时间

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:308437 发表于 2018-9-14 22:19 | 只看该作者
软件?我觉得你想找程序吧?
回复

使用道具 举报

地板
ID:155507 发表于 2018-9-15 15:44 | 只看该作者
温度采集系统


  1. /*************        本程序功能说明        **************

  2. 读ADC和测温度.

  3. 用STC的MCU的IO方式控制74HC595驱动8位数码管。

  4. 用户可以修改宏来选择时钟频率.

  5. 使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.

  6. 左边4位数码管显示ADC2接的电压基准TL431的读数, 右边4位数码管显示温度值, 分辨率0.1度.

  7. NTC使用1%精度的MF52 10K@25度C.

  8. 测温度时, 为了通用, 使用12位的ADC值, 使用对分查找表格来计算, 小数点后一位数是用线性插补来计算的.

  9. 所以, 测温度的ADC3进行4次ADC连续采样, 变成12位的ADC来计算温度.

  10. ******************************************/

  11. #define         MAIN_Fosc                22118400L        //定义主时钟

  12. #include        "STC15Fxxxx.H"

  13. /****************************** 用户定义宏 ***********************************/

  14. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒

  15. /*****************************************************************************/


  16. #define DIS_DOT                0x20
  17. #define DIS_BLACK        0x10
  18. #define DIS_                0x11





  19. /*************        本地常量声明        **************/
  20. u8 code t_display[]={                                                //标准字库
  21. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  22.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  23. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  24.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  25.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  26. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位码


  27. /*************        IO口定义        **************/
  28. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  29. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  30. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock


  31. /*************        本地变量声明        **************/

  32. u8         LED8[8];                //显示缓冲
  33. u8        display_index;        //显示位索引
  34. bit        B_1ms;                        //1ms标志

  35. u16        msecond;

  36. /*************        本地函数声明        **************/
  37. u16        get_temperature(u16 adc);
  38. u16        Get_ADC10bitResult(u8 channel);        //channel = 0~7



  39. /**********************************************/
  40. void main(void)
  41. {
  42.         u8        i;
  43.         u16        j;
  44.        
  45.         P0M1 = 0;        P0M0 = 0;        //设置为准双向口
  46.         P1M1 = 0;        P1M0 = 0;        //设置为准双向口
  47.         P2M1 = 0;        P2M0 = 0;        //设置为准双向口
  48.         P3M1 = 0;        P3M0 = 0;        //设置为准双向口
  49.         P4M1 = 0;        P4M0 = 0;        //设置为准双向口
  50.         P5M1 = 0;        P5M0 = 0;        //设置为准双向口
  51.         P6M1 = 0;        P6M0 = 0;        //设置为准双向口
  52.         P7M1 = 0;        P7M0 = 0;        //设置为准双向口

  53.         display_index = 0;
  54.         P1ASF = 0x0C;                //P1.2 P1.3做ADC
  55.         ADC_CONTR = 0xE0;        //90T, ADC power on
  56.        
  57.         AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload,
  58.         TH0 = (u8)(Timer0_Reload / 256);
  59.         TL0 = (u8)(Timer0_Reload % 256);
  60.         ET0 = 1;        //Timer0 interrupt enable
  61.         TR0 = 1;        //Tiner0 run
  62.         EA = 1;                //打开总中断
  63.        
  64.         for(i=0; i<8; i++)        LED8[i] = 0x10;        //上电消隐

  65.        
  66.         while(1)
  67.         {
  68.                 if(B_1ms)        //1ms到
  69.                 {
  70.                         B_1ms = 0;
  71.                         if(++msecond >= 300)        //300ms到
  72.                         {
  73.                                 msecond = 0;
  74.                                 j = Get_ADC10bitResult(2);        //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误
  75.                                
  76.                                 if(j < 1024)
  77.                                 {
  78.                                         LED8[0] = j / 1000;                //显示ADC值
  79.                                         LED8[1] = (j % 1000) / 100;
  80.                                         LED8[2] = (j % 100) / 10;
  81.                                         LED8[3] = j % 10;
  82.                                         if(LED8[0] == 0)        LED8[0] = DIS_BLACK;
  83.                                 }
  84.                                 else        //错误
  85.                                 {
  86.                                         for(i=0; i<4; i++)        LED8[i] = DIS_;
  87.                                 }
  88.                                

  89.                                 j = Get_ADC10bitResult(3);        //参数0~7,查询方式做一次ADC, 返回值就是结果, == 1024 为错误
  90.                                 j += Get_ADC10bitResult(3);
  91.                                 j += Get_ADC10bitResult(3);
  92.                                 j += Get_ADC10bitResult(3);

  93.                                 if(j < 1024*4)
  94.                                 {
  95.                                 /*
  96.                                         LED8[0] = j / 1000;                //显示ADC值
  97.                                         LED8[1] = (j % 1000) / 100;
  98.                                         LED8[2] = (j % 100) / 10;
  99.                                         LED8[3] = j % 10;
  100.                                         if(LED8[0] == 0)        LED8[0] = DIS_BLACK;
  101.                                 */
  102.                                         j =        get_temperature(j);        //计算温度值

  103.                                         if(j >= 400)        F0 = 0,        j -= 400;                //温度 >= 0度
  104.                                         else                        F0 = 1,        j  = 400 - j;        //温度 <  0度
  105.                                         LED8[4] = j / 1000;                //显示温度值
  106.                                         LED8[5] = (j % 1000) / 100;
  107.                                         LED8[6] = (j % 100) / 10 + DIS_DOT;
  108.                                         LED8[7] = j % 10;
  109.                                         if(LED8[4] == 0)        LED8[4] = DIS_BLACK;
  110.                                         if(F0)        LED8[4] = DIS_;                //显示-
  111.                                 }
  112.                                 else        //错误
  113.                                 {
  114.                                         for(i=0; i<8; i++)        LED8[i] = DIS_;
  115.                                 }
  116.                         }

  117.                 }
  118.         }
  119. }
  120. /**********************************************/

  121. //========================================================================
  122. // 函数: u16        Get_ADC10bitResult(u8 channel)
  123. // 描述: 查询法读一次ADC结果.
  124. // 参数: channel: 选择要转换的ADC.
  125. // 返回: 10位ADC结果.
  126. // 版本: V1.0, 2012-10-22
  127. //========================================================================
  128. u16        Get_ADC10bitResult(u8 channel)        //channel = 0~7
  129. {
  130.         ADC_RES = 0;
  131.         ADC_RESL = 0;

  132.         ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | channel;         //start the ADC
  133.         NOP(4);

  134.         while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
  135.         ADC_CONTR &= ~0x10;                //清除ADC结束标志
  136.         return        (((u16)ADC_RES << 2) | (ADC_RESL & 3));
  137. }


  138. //        MF52E 10K at 25, B = 3950, ADC = 12 bits
  139. u16 code temp_table[]={
  140.                 140,        //;-40        0
  141.                 149,        //;-39        1
  142.                 159,        //;-38        2
  143.                 168,        //;-37        3
  144.                 178,        //;-36        4
  145.                 188,        //;-35        5
  146.                 199,        //;-34        6
  147.                 210,        //;-33        7
  148.                 222,        //;-32        8
  149.                 233,        //;-31        9
  150.                 246,        //;-30        10
  151.                 259,        //;-29        11
  152.                 272,        //;-28        12
  153.                 286,        //;-27        13
  154.                 301,        //;-26        14
  155.                 317,        //;-25        15
  156.                 333,        //;-24        16
  157.                 349,        //;-23        17
  158.                 367,        //;-22        18
  159.                 385,        //;-21        19
  160.                 403,        //;-20        20
  161.                 423,        //;-19        21
  162.                 443,        //;-18        22
  163.                 464,        //;-17        23
  164.                 486,        //;-16        24
  165.                 509,        //;-15        25
  166.                 533,        //;-14        26
  167.                 558,        //;-13        27
  168.                 583,        //;-12        28
  169.                 610,        //;-11        29
  170.                 638,        //;-10        30
  171.                 667,        //;-9        31
  172.                 696,        //;-8        32
  173.                 727,        //;-7        33
  174.                 758,        //;-6        34
  175.                 791,        //;-5        35
  176.                 824,        //;-4        36
  177.                 858,        //;-3        37
  178.                 893,        //;-2        38
  179.                 929,        //;-1        39
  180.                 965,        //;0        40
  181.                 1003,        //;1        41
  182.                 1041,        //;2        42
  183.                 1080,        //;3        43
  184.                 1119,        //;4        44
  185.                 1160,        //;5        45
  186.                 1201,        //;6        46
  187.                 1243,        //;7        47
  188.                 1285,        //;8        48
  189.                 1328,        //;9        49
  190.                 1371,        //;10        50
  191.                 1414,        //;11        51
  192.                 1459,        //;12        52
  193.                 1503,        //;13        53
  194.                 1548,        //;14        54
  195.                 1593,        //;15        55
  196.                 1638,        //;16        56
  197.                 1684,        //;17        57
  198.                 1730,        //;18        58
  199.                 1775,        //;19        59
  200.                 1821,        //;20        60
  201.                 1867,        //;21        61
  202.                 1912,        //;22        62
  203.                 1958,        //;23        63
  204.                 2003,        //;24        64
  205.                 2048,        //;25        65
  206.                 2093,        //;26        66
  207.                 2137,        //;27        67
  208.                 2182,        //;28        68
  209.                 2225,        //;29        69
  210.                 2269,        //;30        70
  211.                 2312,        //;31        71
  212.                 2354,        //;32        72
  213.                 2397,        //;33        73
  214.                 2438,        //;34        74
  215.                 2479,        //;35        75
  216.                 2519,        //;36        76
  217.                 2559,        //;37        77
  218.                 2598,        //;38        78
  219.                 2637,        //;39        79
  220.                 2675,        //;40        80
  221.                 2712,        //;41        81
  222.                 2748,        //;42        82
  223.                 2784,        //;43        83
  224.                 2819,        //;44        84
  225.                 2853,        //;45        85
  226.                 2887,        //;46        86
  227.                 2920,        //;47        87
  228.                 2952,        //;48        88
  229.                 2984,        //;49        89
  230.                 3014,        //;50        90
  231.                 3044,        //;51        91
  232.                 3073,        //;52        92
  233.                 3102,        //;53        93
  234.                 3130,        //;54        94
  235.                 3157,        //;55        95
  236.                 3183,        //;56        96
  237.                 3209,        //;57        97
  238.                 3234,        //;58        98
  239.                 3259,        //;59        99
  240.                 3283,        //;60        100
  241.                 3306,        //;61        101
  242.                 3328,        //;62        102
  243.                 3351,        //;63        103
  244.                 3372,        //;64        104
  245.                 3393,        //;65        105
  246.                 3413,        //;66        106
  247.                 3432,        //;67        107
  248.                 3452,        //;68        108
  249.                 3470,        //;69        109
  250.                 3488,        //;70        110
  251.                 3506,        //;71        111
  252.                 3523,        //;72        112
  253.                 3539,        //;73        113
  254.                 3555,        //;74        114
  255.                 3571,        //;75        115
  256.                 3586,        //;76        116
  257.                 3601,        //;77        117
  258.                 3615,        //;78        118
  259.                 3628,        //;79        119
  260.                 3642,        //;80        120
  261.                 3655,        //;81        121
  262.                 3667,        //;82        122
  263.                 3679,        //;83        123
  264.                 3691,        //;84        124
  265.                 3702,        //;85        125
  266.                 3714,        //;86        126
  267.                 3724,        //;87        127
  268.                 3735,        //;88        128
  269.                 3745,        //;89        129
  270.                 3754,        //;90        130
  271.                 3764,        //;91        131
  272.                 3773,        //;92        132
  273.                 3782,        //;93        133
  274.                 3791,        //;94        134
  275.                 3799,        //;95        135
  276.                 3807,        //;96        136
  277.                 3815,        //;97        137
  278.                 3822,        //;98        138
  279.                 3830,        //;99        139
  280.                 3837,        //;100        140
  281.                 3844,        //;101        141
  282.                 3850,        //;102        142
  283.                 3857,        //;103        143
  284.                 3863,        //;104        144
  285.                 3869,        //;105        145
  286.                 3875,        //;106        146
  287.                 3881,        //;107        147
  288.                 3887,        //;108        148
  289.                 3892,        //;109        149
  290.                 3897,        //;110        150
  291.                 3902,        //;111        151
  292.                 3907,        //;112        152
  293.                 3912,        //;113        153
  294.                 3917,        //;114        154
  295.                 3921,        //;115        155
  296.                 3926,        //;116        156
  297.                 3930,        //;117        157
  298.                 3934,        //;118        158
  299.                 3938,        //;119        159
  300.                 3942        //;120        160
  301. };

  302. /********************  计算温度 ***********************************************/
  303. // 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
  304. // 为了通用, ADC输入为12bit的ADC值.
  305. // 电路和软件算法设计: Coody
  306. /**********************************************/

  307. #define                D_SCALE                10                //结果放大倍数, 放大10倍就是保留一位小数
  308. u16        get_temperature(u16 adc)
  309. {
  310.         u16        code *p;
  311.         u16        i;
  312.         u8        j,k,min,max;
  313.        
  314.         adc = 4096 - adc;        //Rt接地
  315.         p = temp_table;
  316.         if(adc < p[0])                return (0xfffe);
  317.         if(adc > p[160])        return (0xffff);
  318.        
  319.         min = 0;                //-40度
  320.         max = 160;                //120度

  321.         for(j=0; j<5; j++)        //对分查表
  322.         {
  323.                 k = min / 2 + max / 2;
  324.                 if(adc <= p[k])        max = k;
  325.                 else                        min = k;
  326.         }
  327.                  if(adc == p[min])        i = min * D_SCALE;
  328.         else if(adc == p[max])        i = max * D_SCALE;
  329.         else        // min < temp < max
  330.         {
  331.                 while(min <= max)
  332.                 {
  333.                         min++;
  334.                         if(adc == p[min])        {i = min * D_SCALE;        break;}
  335.                         else if(adc < p[min])
  336.                         {
  337.                                 min--;
  338.                                 i = p[min];        //min
  339.                                 j = (adc - i) * D_SCALE / (p[min+1] - i);
  340.                                 i = min;
  341.                                 i *= D_SCALE;
  342.                                 i += j;
  343.                                 break;
  344.                         }
  345.                 }
  346.         }
  347.         return i;
  348. }


  349. /**************** 向HC595发送一个字节函数 ******************/
  350. void Send_595(u8 dat)
  351. {               
  352.         u8        i;
  353.         for(i=0; i<8; i++)
  354.         {
  355.                 dat <<= 1;
  356.                 P_HC595_SER   = CY;
  357.                 P_HC595_SRCLK = 1;
  358.                 P_HC595_SRCLK = 0;
  359.         }
  360. }

  361. /********************** 显示扫描函数 ************************/
  362. void DisplayScan(void)
  363. {       
  364.         Send_595(~T_COM[display_index]);                                //输出位码
  365.         Send_595(t_display[LED8[display_index]]);        //输出段码

  366.         P_HC595_RCLK = 1;
  367.         P_HC595_RCLK = 0;                                                        //锁存输出数据
  368.         if(++display_index >= 8)        display_index = 0;        //8位结束回0
  369. }


  370. /********************** Timer0 1ms中断函数 ************************/
  371. void timer0 (void) interrupt TIMER0_VECTOR
  372. {
  373.         DisplayScan();        //1ms扫描显示一位
  374.         B_1ms = 1;                //1ms标志
  375. }

复制代码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:397024 发表于 2018-9-16 08:13 来自手机 | 只看该作者
mmssll 发表于 2018-9-14 20:57
你说的这些都有成熟的代码,把单片机AD,IO口用起来就行了,没有太多原创的东西所以就是花点时间

但我不太懂怎么跟电位器电压联系起来,我在网上搜的资料都是通过热敏电阻测电压测温度或者就是18b20直接测量温度
回复

使用道具 举报

6#
ID:397024 发表于 2018-9-16 08:14 来自手机 | 只看该作者
yousunny 发表于 2018-9-14 22:19
软件?我觉得你想找程序吧?

嗯  对啊
回复

使用道具 举报

7#
ID:397024 发表于 2018-9-16 08:15 来自手机 | 只看该作者
angmall 发表于 2018-9-15 15:44
温度采集系统

你有原理图吗,光看程序看不太懂,刚上完课
回复

使用道具 举报

8#
ID:398549 发表于 2018-9-16 09:56 | 只看该作者
用18B20
回复

使用道具 举报

9#
ID:398549 发表于 2018-9-16 09:57 | 只看该作者
用18B20是采集数字信号,你说的的电位器其实属于AD转换,属于采集模拟信号。
回复

使用道具 举报

10#
ID:397024 发表于 2018-9-17 00:49 来自手机 | 只看该作者
wlf512 发表于 2018-9-16 09:57
用18B20是采集数字信号,你说的的电位器其实属于AD转换,属于采集模拟信号。

也就是说先将18b20的数字信号用DA转换成模拟电压信号然后再用AD转成数字信号?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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