找回密码
 立即注册

QQ登录

只需一步,快速开始

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

NTC测温代码移植到STC8H单片机

[复制链接]
跳转到指定楼层
楼主
在下小白,试了很久搞不明白,我用TM1650驱动数码管,ADC数值显示总是停留在000,好像没有采集到数据,请各位大哥指导一下,下面是NTC温度显示的官方例程,移植到STC8H1K08怎么修改,10位ADC用P3.6口通道14
4
  1. /* --- STC MCU Limited ------------------------------------------------*/
  2. /* --- STC 1T Series MCU Demo Programme -------------------------------*/

  3. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  4. /*---------------------------------------------------------------------*/


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

  6. 本例程基于STC8H8K64U为主控芯片的实验箱8进行编写测试,STC8G、STC8H系列芯片可通用参考.

  7. 读ADC和测温度.

  8. 用STC的MCU的IO方式驱动8位数码管。

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

  10. 右边4位数码管显示温度值, 分辨率0.1度.

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

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

  13. 下载时, 选择时钟 24MHZ (用户可自行修改频率).

  14. ******************************************/

  15. #include    "reg51.h"       //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
  16. #include    "intrins.h"

  17. #define     MAIN_Fosc       24000000L   //定义主时钟

  18. typedef     unsigned char   u8;
  19. typedef     unsigned int    u16;
  20. typedef     unsigned long   u32;

  21. //手动输入声明"reg51.h"头文件里面没有定义的寄存器
  22. sfr TH2  = 0xD6;
  23. sfr TL2  = 0xD7;
  24. sfr IE2   = 0xAF;
  25. sfr INT_CLKO = 0x8F;
  26. sfr AUXR = 0x8E;
  27. sfr AUXR1 = 0xA2;
  28. sfr P_SW1 = 0xA2;
  29. sfr P_SW2 = 0xBA;
  30. sfr S2CON = 0x9A;
  31. sfr S2BUF = 0x9B;

  32. sfr ADC_CONTR = 0xBC;   //带AD系列
  33. sfr ADC_RES   = 0xBD;   //带AD系列
  34. sfr ADC_RESL  = 0xBE;   //带AD系列
  35. sfr ADCCFG = 0xde;

  36. sfr P4   = 0xC0;
  37. sfr P5   = 0xC8;
  38. sfr P6   = 0xE8;
  39. sfr P7   = 0xF8;
  40. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  41. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  42. sfr P0M1 = 0x93;
  43. sfr P0M0 = 0x94;
  44. sfr P2M1 = 0x95;
  45. sfr P2M0 = 0x96;
  46. sfr P3M1 = 0xB1;
  47. sfr P3M0 = 0xB2;
  48. sfr P4M1 = 0xB3;
  49. sfr P4M0 = 0xB4;
  50. sfr P5M1 = 0xC9;
  51. sfr P5M0 = 0xCA;
  52. sfr P6M1 = 0xCB;
  53. sfr P6M0 = 0xCC;
  54. sfr P7M1 = 0xE1;
  55. sfr P7M0 = 0xE2;

  56. sbit P00 = P0^0;
  57. sbit P01 = P0^1;
  58. sbit P02 = P0^2;
  59. sbit P03 = P0^3;
  60. sbit P04 = P0^4;
  61. sbit P05 = P0^5;
  62. sbit P06 = P0^6;
  63. sbit P07 = P0^7;
  64. sbit P10 = P1^0;
  65. sbit P11 = P1^1;
  66. sbit P12 = P1^2;
  67. sbit P13 = P1^3;
  68. sbit P14 = P1^4;
  69. sbit P15 = P1^5;
  70. sbit P16 = P1^6;
  71. sbit P17 = P1^7;
  72. sbit P20 = P2^0;
  73. sbit P21 = P2^1;
  74. sbit P22 = P2^2;
  75. sbit P23 = P2^3;
  76. sbit P24 = P2^4;
  77. sbit P25 = P2^5;
  78. sbit P26 = P2^6;
  79. sbit P27 = P2^7;
  80. sbit P30 = P3^0;
  81. sbit P31 = P3^1;
  82. sbit P32 = P3^2;
  83. sbit P33 = P3^3;
  84. sbit P34 = P3^4;
  85. sbit P35 = P3^5;
  86. sbit P36 = P3^6;
  87. sbit P37 = P3^7;
  88. sbit P40 = P4^0;
  89. sbit P41 = P4^1;
  90. sbit P42 = P4^2;
  91. sbit P43 = P4^3;
  92. sbit P44 = P4^4;
  93. sbit P45 = P4^5;
  94. sbit P46 = P4^6;
  95. sbit P47 = P4^7;
  96. sbit P50 = P5^0;
  97. sbit P51 = P5^1;
  98. sbit P52 = P5^2;
  99. sbit P53 = P5^3;
  100. sbit P54 = P5^4;
  101. sbit P55 = P5^5;
  102. sbit P56 = P5^6;
  103. sbit P57 = P5^7;


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

  105. #define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
  106. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒

  107. /*****************************************************************************/


  108. #define DIS_DOT     0x20
  109. #define DIS_BLACK   0x10
  110. #define DIS_        0x11


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

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


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

  120. u8  LED8[8];        //显示缓冲
  121. u8  display_index;  //显示位索引
  122. bit B_1ms;          //1ms标志

  123. u16 msecond;

  124. /*************  本地函数声明    **************/
  125. u16 get_temperature(u16 adc);
  126. u16 Get_ADC12bitResult(u8 channel); //channel = 0~15

  127. /**********************************************/
  128. void main(void)
  129. {
  130.     u8  i;
  131.     u16 j;

  132.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  133.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  134.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  135.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  136.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  137.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  138.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  139.     P1M1 = 0x08;   P1M0 = 0x00;   //设置 P1.3 为 ADC 输入口

  140.     display_index = 0;
  141.                 P_SW2 |= 0x80;
  142.                 ADCTIM = 0x3f;                //设置 ADC 内部时序,ADC采样时间建议设最大值
  143.                 P_SW2 &= 0x7f;
  144.                 ADCCFG = 0x2f;                //设置 ADC 时钟为系统时钟/2/16/16
  145.                 ADC_CONTR = 0x80; //使能 ADC 模块

  146.     AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
  147.     TH0 = (u8)(Timer0_Reload / 256);
  148.     TL0 = (u8)(Timer0_Reload % 256);
  149.     ET0 = 1;    //Timer0 interrupt enable
  150.     TR0 = 1;    //Tiner0 run
  151.     EA = 1;     //打开总中断

  152.     for(i=0; i<8; i++)  LED8[i] = 0x10; //上电消隐

  153.     while(1)
  154.     {
  155.         if(B_1ms)   //1ms到
  156.         {
  157.             B_1ms = 0;
  158.             if(++msecond >= 300)    //300ms到
  159.             {
  160.                 msecond = 0;

  161.                 j = Get_ADC12bitResult(3);  //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误

  162.                 if(j < 4096)
  163.                 {
  164.                 /*
  165.                     LED8[0] = j / 1000;     //显示ADC值
  166.                     LED8[1] = (j % 1000) / 100;
  167.                     LED8[2] = (j % 100) / 10;
  168.                     LED8[3] = j % 10;
  169.                     if(LED8[0] == 0)    LED8[0] = DIS_BLACK;
  170.                 */
  171.                     j = get_temperature(j); //计算温度值

  172.                     if(j >= 400)    F0 = 0, j -= 400;       //温度 >= 0度
  173.                     else            F0 = 1, j  = 400 - j;   //温度 <  0度
  174.                     LED8[4] = j / 1000;     //显示温度值
  175.                     LED8[5] = (j % 1000) / 100;
  176.                     LED8[6] = (j % 100) / 10 + DIS_DOT;
  177.                     LED8[7] = j % 10;
  178.                     if(LED8[4] == 0)    LED8[4] = DIS_BLACK;
  179.                     if(F0)  LED8[4] = DIS_;     //显示-
  180.                 }
  181.                 else    //错误
  182.                 {
  183.                     for(i=0; i<8; i++)  LED8[i] = DIS_;
  184.                 }
  185.             }
  186.         }
  187.     }
  188. }
  189. /**********************************************/

  190. //========================================================================
  191. // 函数: u16 Get_ADC12bitResult(u8 channel)
  192. // 描述: 查询法读一次ADC结果.
  193. // 参数: channel: 选择要转换的ADC.
  194. // 返回: 12位ADC结果.
  195. // 版本: V1.0, 2012-10-22
  196. //========================================================================
  197. u16 Get_ADC12bitResult(u8 channel)  //channel = 0~15
  198. {
  199.     ADC_RES = 0;
  200.     ADC_RESL = 0;

  201.     ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    //启动 AD 转换
  202.     _nop_();
  203.     _nop_();
  204.     _nop_();
  205.     _nop_();

  206.     while((ADC_CONTR & 0x20) == 0)  ;   //wait for ADC finish
  207.     ADC_CONTR &= ~0x20;     //清除ADC结束标志
  208.     return  (((u16)ADC_RES << 8) | ADC_RESL);
  209. }


  210. //  MF52E 10K at 25, B = 3950, ADC = 12 bits
  211. u16 code temp_table[]={
  212.         140,    //;-40  0
  213.         149,    //;-39  1
  214.         159,    //;-38  2
  215.         168,    //;-37  3
  216.         178,    //;-36  4
  217.         188,    //;-35  5
  218.         199,    //;-34  6
  219.         210,    //;-33  7
  220.         222,    //;-32  8
  221.         233,    //;-31  9
  222.         246,    //;-30  10
  223.         259,    //;-29  11
  224.         272,    //;-28  12
  225.         286,    //;-27  13
  226.         301,    //;-26  14
  227.         317,    //;-25  15
  228.         333,    //;-24  16
  229.         349,    //;-23  17
  230.         367,    //;-22  18
  231.         385,    //;-21  19
  232.         403,    //;-20  20
  233.         423,    //;-19  21
  234.         443,    //;-18  22
  235.         464,    //;-17  23
  236.         486,    //;-16  24
  237.         509,    //;-15  25
  238.         533,    //;-14  26
  239.         558,    //;-13  27
  240.         583,    //;-12  28
  241.         610,    //;-11  29
  242.         638,    //;-10  30
  243.         667,    //;-9   31
  244.         696,    //;-8   32
  245.         727,    //;-7   33
  246.         758,    //;-6   34
  247.         791,    //;-5   35
  248.         824,    //;-4   36
  249.         858,    //;-3   37
  250.         893,    //;-2   38
  251.         929,    //;-1   39
  252.         965,    //;0    40
  253.         1003,   //;1    41
  254.         1041,   //;2    42
  255.         1080,   //;3    43
  256.         1119,   //;4    44
  257.         1160,   //;5    45
  258.         1201,   //;6    46
  259.         1243,   //;7    47
  260.         1285,   //;8    48
  261.         1328,   //;9    49
  262.         1371,   //;10   50
  263.         1414,   //;11   51
  264.         1459,   //;12   52
  265.         1503,   //;13   53
  266.         1548,   //;14   54
  267.         1593,   //;15   55
  268.         1638,   //;16   56
  269.         1684,   //;17   57
  270.         1730,   //;18   58
  271.         1775,   //;19   59
  272.         1821,   //;20   60
  273.         1867,   //;21   61
  274.         1912,   //;22   62
  275.         1958,   //;23   63
  276.         2003,   //;24   64
  277.         2048,   //;25   65
  278.         2093,   //;26   66
  279.         2137,   //;27   67
  280.         2182,   //;28   68
  281.         2225,   //;29   69
  282.         2269,   //;30   70
  283.         2312,   //;31   71
  284.         2354,   //;32   72
  285.         2397,   //;33   73
  286.         2438,   //;34   74
  287.         2479,   //;35   75
  288.         2519,   //;36   76
  289.         2559,   //;37   77
  290.         2598,   //;38   78
  291.         2637,   //;39   79
  292.         2675,   //;40   80
  293.         2712,   //;41   81
  294.         2748,   //;42   82
  295.         2784,   //;43   83
  296.         2819,   //;44   84
  297.         2853,   //;45   85
  298.         2887,   //;46   86
  299.         2920,   //;47   87
  300.         2952,   //;48   88
  301.         2984,   //;49   89
  302.         3014,   //;50   90
  303.         3044,   //;51   91
  304.         3073,   //;52   92
  305.         3102,   //;53   93
  306.         3130,   //;54   94
  307.         3157,   //;55   95
  308.         3183,   //;56   96
  309.         3209,   //;57   97
  310.         3234,   //;58   98
  311.         3259,   //;59   99
  312.         3283,   //;60   100
  313.         3306,   //;61   101
  314.         3328,   //;62   102
  315.         3351,   //;63   103
  316.         3372,   //;64   104
  317.         3393,   //;65   105
  318.         3413,   //;66   106
  319.         3432,   //;67   107
  320.         3452,   //;68   108
  321.         3470,   //;69   109
  322.         3488,   //;70   110
  323.         3506,   //;71   111
  324.         3523,   //;72   112
  325.         3539,   //;73   113
  326.         3555,   //;74   114
  327.         3571,   //;75   115
  328.         3586,   //;76   116
  329.         3601,   //;77   117
  330.         3615,   //;78   118
  331.         3628,   //;79   119
  332.         3642,   //;80   120
  333.         3655,   //;81   121
  334.         3667,   //;82   122
  335.         3679,   //;83   123
  336.         3691,   //;84   124
  337.         3702,   //;85   125
  338.         3714,   //;86   126
  339.         3724,   //;87   127
  340.         3735,   //;88   128
  341.         3745,   //;89   129
  342.         3754,   //;90   130
  343.         3764,   //;91   131
  344.         3773,   //;92   132
  345.         3782,   //;93   133
  346.         3791,   //;94   134
  347.         3799,   //;95   135
  348.         3807,   //;96   136
  349.         3815,   //;97   137
  350.         3822,   //;98   138
  351.         3830,   //;99   139
  352.         3837,   //;100  140
  353.         3844,   //;101  141
  354.         3850,   //;102  142
  355.         3857,   //;103  143
  356.         3863,   //;104  144
  357.         3869,   //;105  145
  358.         3875,   //;106  146
  359.         3881,   //;107  147
  360.         3887,   //;108  148
  361.         3892,   //;109  149
  362.         3897,   //;110  150
  363.         3902,   //;111  151
  364.         3907,   //;112  152
  365.         3912,   //;113  153
  366.         3917,   //;114  154
  367.         3921,   //;115  155
  368.         3926,   //;116  156
  369.         3930,   //;117  157
  370.         3934,   //;118  158
  371.         3938,   //;119  159
  372.         3942    //;120  160
  373. };

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

  379. #define     D_SCALE     10      //结果放大倍数, 放大10倍就是保留一位小数
  380. u16 get_temperature(u16 adc)
  381. {
  382.     u16 code *p;
  383.     u16 i;
  384.     u8  j,k,min,max;

  385.     adc = 4096 - adc;   //Rt接地
  386.     p = temp_table;
  387.     if(adc < p[0])      return (0xfffe);
  388.     if(adc > p[160])    return (0xffff);

  389.     min = 0;        //-40度
  390.     max = 160;      //120度

  391.     for(j=0; j<5; j++)  //对分查表
  392.     {
  393.         k = min / 2 + max / 2;
  394.         if(adc <= p[k]) max = k;
  395.         else            min = k;
  396.     }
  397.          if(adc == p[min])  i = min * D_SCALE;
  398.     else if(adc == p[max])  i = max * D_SCALE;
  399.     else    // min < temp < max
  400.     {
  401.         while(min <= max)
  402.         {
  403.             min++;
  404.             if(adc == p[min])   {i = min * D_SCALE; break;}
  405.             else if(adc < p[min])
  406.             {
  407.                 min--;
  408.                 i = p[min]; //min
  409.                 j = (adc - i) * D_SCALE / (p[min+1] - i);
  410.                 i = min;
  411.                 i *= D_SCALE;
  412.                 i += j;
  413.                 break;
  414.             }
  415.         }
  416.     }
  417.     return i;
  418. }

  419. /********************** 显示扫描函数 ************************/
  420. void DisplayScan(void)
  421. {   
  422.                 P7 = ~T_COM[7-display_index];
  423.                 P6 = ~t_display[LED8[display_index]];
  424.     if(++display_index >= 8)    display_index = 0;  //8位结束回0
  425. }


  426. /********************** Timer0 1ms中断函数 ************************/
  427. void timer0 (void) interrupt 1
  428. {
  429.     DisplayScan();  //1ms扫描显示一位
  430.     B_1ms = 1;      //1ms标志
  431. }
复制代码


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

使用道具 举报

沙发
ID:829223 发表于 2023-9-21 16:59 | 只看该作者
没有TM1650驱动文件
回复

使用道具 举报

板凳
ID:213173 发表于 2023-9-21 20:24 | 只看该作者
直接把TM1650代码加进去,替换原来的数码管显示函数。TM1650驱动端口按实际硬件电路定义。另外定时器改为5ms中断为宜。
  1. /* --- STC MCU Limited ------------------------------------------------*/
  2. /* --- STC 1T Series MCU Demo Programme -------------------------------*/

  3. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  4. /*---------------------------------------------------------------------*/


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

  6. 本例程基于STC8H8K64U为主控芯片的实验箱8进行编写测试,STC8G、STC8H系列芯片可通用参考.

  7. 读ADC和测温度.

  8. 用STC的MCU的IO方式驱动8位数码管。

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

  10. 右边4位数码管显示温度值, 分辨率0.1度.

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

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

  13. 下载时, 选择时钟 24MHZ (用户可自行修改频率).

  14. ******************************************/

  15. #include    "reg51.h"       //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
  16. #include    "intrins.h"

  17. #define     MAIN_Fosc       24000000L   //定义主时钟

  18. typedef     unsigned char   u8;
  19. typedef     unsigned int    u16;
  20. typedef     unsigned long   u32;

  21. //手动输入声明"reg51.h"头文件里面没有定义的寄存器
  22. sfr TH2  = 0xD6;
  23. sfr TL2  = 0xD7;
  24. sfr IE2   = 0xAF;
  25. sfr INT_CLKO = 0x8F;
  26. sfr AUXR = 0x8E;
  27. sfr AUXR1 = 0xA2;
  28. sfr P_SW1 = 0xA2;
  29. sfr P_SW2 = 0xBA;
  30. sfr S2CON = 0x9A;
  31. sfr S2BUF = 0x9B;

  32. sfr ADC_CONTR = 0xBC;   //带AD系列
  33. sfr ADC_RES   = 0xBD;   //带AD系列
  34. sfr ADC_RESL  = 0xBE;   //带AD系列
  35. sfr ADCCFG = 0xde;

  36. sfr P4   = 0xC0;
  37. sfr P5   = 0xC8;
  38. sfr P6   = 0xE8;
  39. sfr P7   = 0xF8;
  40. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  41. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  42. sfr P0M1 = 0x93;
  43. sfr P0M0 = 0x94;
  44. sfr P2M1 = 0x95;
  45. sfr P2M0 = 0x96;
  46. sfr P3M1 = 0xB1;
  47. sfr P3M0 = 0xB2;
  48. sfr P4M1 = 0xB3;
  49. sfr P4M0 = 0xB4;
  50. sfr P5M1 = 0xC9;
  51. sfr P5M0 = 0xCA;
  52. sfr P6M1 = 0xCB;
  53. sfr P6M0 = 0xCC;
  54. sfr P7M1 = 0xE1;
  55. sfr P7M0 = 0xE2;

  56. sbit P00 = P0^0;
  57. sbit P01 = P0^1;
  58. sbit P02 = P0^2;
  59. sbit P03 = P0^3;
  60. sbit P04 = P0^4;
  61. sbit P05 = P0^5;
  62. sbit P06 = P0^6;
  63. sbit P07 = P0^7;
  64. sbit P10 = P1^0;
  65. sbit P11 = P1^1;
  66. sbit P12 = P1^2;
  67. sbit P13 = P1^3;
  68. sbit P14 = P1^4;
  69. sbit P15 = P1^5;
  70. sbit P16 = P1^6;
  71. sbit P17 = P1^7;
  72. sbit P20 = P2^0;
  73. sbit P21 = P2^1;
  74. sbit P22 = P2^2;
  75. sbit P23 = P2^3;
  76. sbit P24 = P2^4;
  77. sbit P25 = P2^5;
  78. sbit P26 = P2^6;
  79. sbit P27 = P2^7;
  80. sbit P30 = P3^0;
  81. sbit P31 = P3^1;
  82. sbit P32 = P3^2;
  83. sbit P33 = P3^3;
  84. sbit P34 = P3^4;
  85. sbit P35 = P3^5;
  86. sbit P36 = P3^6;
  87. sbit P37 = P3^7;
  88. sbit P40 = P4^0;
  89. sbit P41 = P4^1;
  90. sbit P42 = P4^2;
  91. sbit P43 = P4^3;
  92. sbit P44 = P4^4;
  93. sbit P45 = P4^5;
  94. sbit P46 = P4^6;
  95. sbit P47 = P4^7;
  96. sbit P50 = P5^0;
  97. sbit P51 = P5^1;
  98. sbit P52 = P5^2;
  99. sbit P53 = P5^3;
  100. sbit P54 = P5^4;
  101. sbit P55 = P5^5;
  102. sbit P56 = P5^6;
  103. sbit P57 = P5^7;
  104. //根据实际电路定义TM1650端口
  105. sbit CLK = P3^7;
  106. sbit DIO = P3^6;
  107. /****************************** 用户定义宏 ***********************************/
  108. #define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
  109. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒
  110. /*****************************************************************************/
  111. #define DIS_DOT     0x20
  112. #define DIS_BLACK   0x10
  113. #define DIS_        0x11
  114. /*************  本地常量声明    **************/
  115. u8 code t_display[]={                       //标准字库
  116. //   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  117.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  118. //black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
  119.     0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  120.     0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
  121. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
  122. /*************  本地变量声明    **************/
  123. u8  LED8[8];        //显示缓冲
  124. u8  display_index;  //显示位索引
  125. bit B_1ms;          //1ms标志
  126. u8  BL = 1;          //亮度等级
  127. u16 msecond;

  128. /*************  本地函数声明    **************/
  129. u16 get_temperature(u16 adc);
  130. u16 Get_ADC12bitResult(u8 channel); //channel = 0~15

  131. void Delay_us(u16 i);
  132. void Init1650(void);
  133. void Start1650(void);
  134. void Ask1650(void);
  135. void Stop1650(void);
  136. void WrByte1650(u8 oneByte);
  137. u8 Scan_Key(void);
  138. void Set1650(u8 add,u8 dat);

  139. /**********************************************/
  140. void main(void)
  141. {
  142.     u8  i;
  143.     u16 j;

  144.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  145.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  146.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  147.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  148.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  149.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  150.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  151.     P1M1 = 0x08;   P1M0 = 0x00;   //设置 P1.3 为 ADC 输入口

  152.     display_index = 0;
  153.         P_SW2 |= 0x80;
  154.         ADCTIM = 0x3f;                //设置 ADC 内部时序,ADC采样时间建议设最大值
  155.         P_SW2 &= 0x7f;
  156.         ADCCFG = 0x2f;                //设置 ADC 时钟为系统时钟/2/16/16
  157.         ADC_CONTR = 0x80; //使能 ADC 模块

  158.     AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
  159.     TH0 = (u8)(Timer0_Reload / 256);
  160.     TL0 = (u8)(Timer0_Reload % 256);
  161.     ET0 = 1;    //Timer0 interrupt enable
  162.     TR0 = 1;    //Tiner0 run
  163.     EA = 1;     //打开总中断
  164.         Init1650();//初始化1650
  165.     for(i=0; i<8; i++)  LED8[i] = 0x10; //上电消隐

  166.     while(1)
  167.     {
  168.         if(B_1ms)   //1ms到
  169.         {
  170.             B_1ms = 0;
  171.             if(++msecond >= 300)    //300ms到
  172.             {
  173.                 msecond = 0;

  174.                 j = Get_ADC12bitResult(3);  //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误

  175.                 if(j < 4096)
  176.                 {
  177.                 /*
  178.                     LED8[0] = j / 1000;     //显示ADC值
  179.                     LED8[1] = (j % 1000) / 100;
  180.                     LED8[2] = (j % 100) / 10;
  181.                     LED8[3] = j % 10;
  182.                     if(LED8[0] == 0)    LED8[0] = DIS_BLACK;
  183.                 */
  184.                     j = get_temperature(j); //计算温度值

  185.                     if(j >= 400)    F0 = 0, j -= 400;       //温度 >= 0度
  186.                     else            F0 = 1, j  = 400 - j;   //温度 <  0度
  187.                     LED8[4] = j / 1000;     //显示温度值
  188.                     LED8[5] = (j % 1000) / 100;
  189.                     LED8[6] = (j % 100) / 10 + DIS_DOT;
  190.                     LED8[7] = j % 10;
  191.                     if(LED8[4] == 0)    LED8[4] = DIS_BLACK;
  192.                     if(F0)  LED8[4] = DIS_;     //显示-
  193.                 }
  194.                 else    //错误
  195.                 {
  196.                     for(i=0; i<8; i++)  LED8[i] = DIS_;
  197.                 }
  198.             }
  199.         }
  200.     }
  201. }
  202. /**********************************************/

  203. //========================================================================
  204. // 函数: u16 Get_ADC12bitResult(u8 channel)
  205. // 描述: 查询法读一次ADC结果.
  206. // 参数: channel: 选择要转换的ADC.
  207. // 返回: 12位ADC结果.
  208. // 版本: V1.0, 2012-10-22
  209. //========================================================================
  210. u16 Get_ADC12bitResult(u8 channel)  //channel = 0~15
  211. {
  212.     ADC_RES = 0;
  213.     ADC_RESL = 0;

  214.     ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    //启动 AD 转换
  215.     _nop_();
  216.     _nop_();
  217.     _nop_();
  218.     _nop_();

  219.     while((ADC_CONTR & 0x20) == 0)  ;   //wait for ADC finish
  220.     ADC_CONTR &= ~0x20;     //清除ADC结束标志
  221.     return  (((u16)ADC_RES << 8) | ADC_RESL);
  222. }


  223. //  MF52E 10K at 25, B = 3950, ADC = 12 bits
  224. u16 code temp_table[]={
  225.         140,    //;-40  0
  226.         149,    //;-39  1
  227.         159,    //;-38  2
  228.         168,    //;-37  3
  229.         178,    //;-36  4
  230.         188,    //;-35  5
  231.         199,    //;-34  6
  232.         210,    //;-33  7
  233.         222,    //;-32  8
  234.         233,    //;-31  9
  235.         246,    //;-30  10
  236.         259,    //;-29  11
  237.         272,    //;-28  12
  238.         286,    //;-27  13
  239.         301,    //;-26  14
  240.         317,    //;-25  15
  241.         333,    //;-24  16
  242.         349,    //;-23  17
  243.         367,    //;-22  18
  244.         385,    //;-21  19
  245.         403,    //;-20  20
  246.         423,    //;-19  21
  247.         443,    //;-18  22
  248.         464,    //;-17  23
  249.         486,    //;-16  24
  250.         509,    //;-15  25
  251.         533,    //;-14  26
  252.         558,    //;-13  27
  253.         583,    //;-12  28
  254.         610,    //;-11  29
  255.         638,    //;-10  30
  256.         667,    //;-9   31
  257.         696,    //;-8   32
  258.         727,    //;-7   33
  259.         758,    //;-6   34
  260.         791,    //;-5   35
  261.         824,    //;-4   36
  262.         858,    //;-3   37
  263.         893,    //;-2   38
  264.         929,    //;-1   39
  265.         965,    //;0    40
  266.         1003,   //;1    41
  267.         1041,   //;2    42
  268.         1080,   //;3    43
  269.         1119,   //;4    44
  270.         1160,   //;5    45
  271.         1201,   //;6    46
  272.         1243,   //;7    47
  273.         1285,   //;8    48
  274.         1328,   //;9    49
  275.         1371,   //;10   50
  276.         1414,   //;11   51
  277.         1459,   //;12   52
  278.         1503,   //;13   53
  279.         1548,   //;14   54
  280.         1593,   //;15   55
  281.         1638,   //;16   56
  282.         1684,   //;17   57
  283.         1730,   //;18   58
  284.         1775,   //;19   59
  285.         1821,   //;20   60
  286.         1867,   //;21   61
  287.         1912,   //;22   62
  288.         1958,   //;23   63
  289.         2003,   //;24   64
  290.         2048,   //;25   65
  291.         2093,   //;26   66
  292.         2137,   //;27   67
  293.         2182,   //;28   68
  294.         2225,   //;29   69
  295.         2269,   //;30   70
  296.         2312,   //;31   71
  297.         2354,   //;32   72
  298.         2397,   //;33   73
  299.         2438,   //;34   74
  300.         2479,   //;35   75
  301.         2519,   //;36   76
  302.         2559,   //;37   77
  303.         2598,   //;38   78
  304.         2637,   //;39   79
  305.         2675,   //;40   80
  306.         2712,   //;41   81
  307.         2748,   //;42   82
  308.         2784,   //;43   83
  309.         2819,   //;44   84
  310.         2853,   //;45   85
  311.         2887,   //;46   86
  312.         2920,   //;47   87
  313.         2952,   //;48   88
  314.         2984,   //;49   89
  315.         3014,   //;50   90
  316.         3044,   //;51   91
  317.         3073,   //;52   92
  318.         3102,   //;53   93
  319.         3130,   //;54   94
  320.         3157,   //;55   95
  321.         3183,   //;56   96
  322.         3209,   //;57   97
  323.         3234,   //;58   98
  324.         3259,   //;59   99
  325.         3283,   //;60   100
  326.         3306,   //;61   101
  327.         3328,   //;62   102
  328.         3351,   //;63   103
  329.         3372,   //;64   104
  330.         3393,   //;65   105
  331.         3413,   //;66   106
  332.         3432,   //;67   107
  333.         3452,   //;68   108
  334.         3470,   //;69   109
  335.         3488,   //;70   110
  336.         3506,   //;71   111
  337.         3523,   //;72   112
  338.         3539,   //;73   113
  339.         3555,   //;74   114
  340.         3571,   //;75   115
  341.         3586,   //;76   116
  342.         3601,   //;77   117
  343.         3615,   //;78   118
  344.         3628,   //;79   119
  345.         3642,   //;80   120
  346.         3655,   //;81   121
  347.         3667,   //;82   122
  348.         3679,   //;83   123
  349.         3691,   //;84   124
  350.         3702,   //;85   125
  351.         3714,   //;86   126
  352.         3724,   //;87   127
  353.         3735,   //;88   128
  354.         3745,   //;89   129
  355.         3754,   //;90   130
  356.         3764,   //;91   131
  357.         3773,   //;92   132
  358.         3782,   //;93   133
  359.         3791,   //;94   134
  360.         3799,   //;95   135
  361.         3807,   //;96   136
  362.         3815,   //;97   137
  363.         3822,   //;98   138
  364.         3830,   //;99   139
  365.         3837,   //;100  140
  366.         3844,   //;101  141
  367.         3850,   //;102  142
  368.         3857,   //;103  143
  369.         3863,   //;104  144
  370.         3869,   //;105  145
  371.         3875,   //;106  146
  372.         3881,   //;107  147
  373.         3887,   //;108  148
  374.         3892,   //;109  149
  375.         3897,   //;110  150
  376.         3902,   //;111  151
  377.         3907,   //;112  152
  378.         3912,   //;113  153
  379.         3917,   //;114  154
  380.         3921,   //;115  155
  381.         3926,   //;116  156
  382.         3930,   //;117  157
  383.         3934,   //;118  158
  384.         3938,   //;119  159
  385.         3942    //;120  160
  386. };

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

  392. #define     D_SCALE     10      //结果放大倍数, 放大10倍就是保留一位小数
  393. u16 get_temperature(u16 adc)
  394. {
  395.     u16 code *p;
  396.     u16 i;
  397.     u8  j,k,min,max;

  398.     adc = 4096 - adc;   //Rt接地
  399.     p = temp_table;
  400.     if(adc < p[0])      return (0xfffe);
  401.     if(adc > p[160])    return (0xffff);

  402.     min = 0;        //-40度
  403.     max = 160;      //120度

  404.     for(j=0; j<5; j++)  //对分查表
  405.     {
  406.         k = min / 2 + max / 2;
  407.         if(adc <= p[k]) max = k;
  408.         else            min = k;
  409.     }
  410.          if(adc == p[min])  i = min * D_SCALE;
  411.     else if(adc == p[max])  i = max * D_SCALE;
  412.     else    // min < temp < max
  413.     {
  414.         while(min <= max)
  415.         {
  416.             min++;
  417.             if(adc == p[min])   {i = min * D_SCALE; break;}
  418.             else if(adc < p[min])
  419.             {
  420.                 min--;
  421.                 i = p[min]; //min
  422.                 j = (adc - i) * D_SCALE / (p[min+1] - i);
  423.                 i = min;
  424.                 i *= D_SCALE;
  425.                 i += j;
  426.                 break;
  427.             }
  428.         }
  429.     }
  430.     return i;
  431. }

  432. /********************** 显示扫描函数 ************************/
  433. void DisplayScan(void)
  434. {
  435.         u8 i;
  436.         for(i=0;i<4;i++)
  437.         {//显存地址:0x68,0x6A,0x6C,0x6E,
  438. //                Set1650(0x68+(i*2),t_display[LED8[i]]);
  439.                 Set1650(0x68+(i*2),t_display[LED8[i+4]]);
  440.         }
  441. }
  442. /********************** Timer0 1ms中断函数 ************************/
  443. void timer0 (void) interrupt 1
  444. {
  445.     DisplayScan();  //1ms扫描显示一位
  446.     B_1ms = 1;      //1ms标志
  447. }
  448. /****************************************************************/

  449. void Delay_us(u16 i)//us延时 12M环境 一个_nop_() 0.086us
  450. {
  451.         for(;i>0;i--)
  452.         {
  453.                 _nop_();_nop_();_nop_();_nop_();_nop_();
  454.         }
  455. }


  456. //显示命令格式:空位  亮度等级位   7/8段位  空位  开关位
  457. //显示命令格式: 0    1   1   1     1/0     0 0    1/0

  458. void Init1650()//初始化1650
  459. {
  460.         Set1650(0x48,0x71); //7级亮度 开显示
  461. }

  462. void Start1650(void)//开始信号
  463. {
  464.         CLK = 1;
  465.         DIO = 1;
  466.         Delay_us(5);
  467.         DIO = 0;
  468. }

  469. void Ask1650(void) //应答ACK信号
  470. {
  471.         u8 timeout = 1;
  472.         CLK = 1;
  473.         Delay_us(5);
  474.         CLK = 0;
  475.         while((DIO)&&(timeout<=100))
  476.         {
  477.                 timeout++;
  478.         }
  479.         Delay_us(5);
  480.         CLK = 0;
  481. }

  482. void Stop1650(void) //停止信号
  483. {
  484.         CLK = 1;
  485.         DIO = 0;
  486.         Delay_us(5);
  487.         DIO = 1;
  488. }

  489. void WrByte1650(u8 oneByte)//写一个字节高位在前,低位在后
  490. {
  491.         u8 i;
  492.         CLK = 0;
  493.         Delay_us(1);
  494.         for(i=0;i<8;i++)
  495.         {
  496.                 oneByte <<= 1;
  497.                 DIO = CY;
  498.                 CLK = 0;
  499.                 Delay_us(5);
  500.                 CLK = 1;
  501.                 Delay_us(5);
  502.                 CLK = 0;
  503.         }
  504. }
  505. /*
  506. u8 Scan_Key(void)  // 按键扫描
  507. {
  508.         u8 i;
  509.         u8 rekey;
  510.         Start1650();//开始
  511.         WrByte1650(0x49);//读按键命令
  512.         Ask1650();//应答
  513.         //DIO = 1;
  514.         for(i=0;i<8;i++)
  515.         {
  516.                 CLK = 1;
  517.                 rekey = rekey<<1;
  518.                 if(DIO)rekey++;
  519.                 Delay_us(5);
  520.                 CLK = 0;
  521.         }
  522.         Ask1650();//应答
  523.         Stop1650();//停止
  524.         return(rekey);
  525. }
  526. */
  527. void Set1650(u8 add,u8 dat) //数码管显示,写显存必须从高地址开始写
  528. {
  529.     Start1650();     //开始
  530.     WrByte1650(add); //写地址
  531.     Ask1650();       //应答
  532.     WrByte1650(dat); //写数据
  533.     Ask1650();       //应答
  534.     Stop1650();      //停止
  535. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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