找回密码
 立即注册
查看: 652|回复: 0

简简单单用3个定时器搞定NST1001温度传感器+LED数码管

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-5-27 02:16:04 | 显示全部楼层 |阅读模式
本帖最后由 晓飛飛 于 2024-5-27 02:17 编辑

之前的一篇帖子介绍了USB接口的温度传感器,这次在STC大学计划实验箱9.62上写个测试例程,方便大家参考。
传感器直接插到OLED的预留位置,用到单片机的P3.4口,也就是Timer0的外部输入端T0。
代码中使用Timer4配置为1kHz的16位自动装载定时器,中断用于刷LED
使用Timer0作为传感器脉冲计数
使用Timer1作为传感器采集流程状态机
请不要说我浪费定时器,例程而已,放那不用才叫浪费,这里就是综合演示定时器的不同用法。

微信图片_20240527020918.jpg


  1. /*
  2. NST1001脉冲型温度传感器测试例程
  3. 本代码基于STC大学计划实验箱9.62运行
  4. MCU型号:STC8H8K64U
  5. IRC时钟频率:11.0592MHz
  6. 编写日期:2024-05-27
  7. */
  8. #include "stc8h.h"
  9. #define MAIN_Fosc 11059200L
  10. sbit qian = P7^3;
  11. sbit bai = P7^2;
  12. sbit shi = P7^1;
  13. sbit ge = P7^0;
  14. sbit NST_IO = P3^4;
  15. int tmp;
  16. bit neg_flag;
  17. unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  18. void delay_ms(unsigned int ms)
  19. {
  20.         unsigned int i;
  21.         do{
  22.                 i = MAIN_Fosc / 10000;
  23.                 while(--i);
  24.         }while(--ms);
  25. }
  26. void Timer0_Init(void)
  27. {
  28.         TMOD &= 0xF0;         
  29.         TMOD |= 0x04;    //设置定时器为外部计数模式  脉冲从T0引脚输入
  30. }
  31. void Timer1_Isr(void) interrupt 3
  32. {
  33.         static char NST_sta;
  34.         float tmp_float;
  35.         switch(NST_sta)
  36.         {
  37.                 case 0:
  38.                         NST_sta++;
  39.                         break;
  40.                 case 1:               
  41.                         NST_IO = 1;
  42.                         NST_sta++;
  43.                         break;
  44.                 case 2:
  45.                         NST_sta++;
  46.                         break;
  47.                 case 3:
  48.                         TH0 = 0;          //清空计数器
  49.                         TL0 = 0;          //清空计数器        
  50.                         TR0 = 1;
  51.                         NST_sta++;
  52.                         break;
  53.                 case 4:
  54.                 case 5:
  55.                         NST_sta++;
  56.                         break;
  57.                 case 6:
  58.                         TR0 = 0;
  59.                         TR1 = 0;                                
  60.                         //P3PU = 0x00;      //为传感器断电
  61.                     NST_IO = 0;
  62.                         tmp_float = ((TH0 << 8) | TL0) *  0.0625 - 50.0625;           ////
  63.                         tmp = (int)(tmp_float * 10);
  64.                         if (tmp < 0)
  65.                         {
  66.                                 tmp = 0-tmp;
  67.                                 neg_flag = 1;
  68.                         }
  69.                         else
  70.                         {
  71.                                 neg_flag = 0;
  72.                         }
  73.                         NST_sta = 0;                                                
  74.                         break;
  75.                 default:
  76.                         NST_sta = 0;
  77.                         break;
  78.         }                        
  79. }
  80. //测温定时器
  81. void Timer1_Init(void)                //10毫秒@11.0592MHz
  82. {
  83.         AUXR &= 0xBF;                        //定时器时钟12T模式
  84.         TMOD &= 0x0F;                        //设置定时器模式
  85.         TL1 = 0x00;                                //设置定时初始值
  86.         TH1 = 0xDC;                                //设置定时初始值
  87.         TF1 = 0;                                //清除TF1标志
  88.         //TR1 = 1;                                //定时器1开始计时
  89.         ET1 = 1;                                //使能定时器1中断
  90. }
  91. //刷数码管
  92. void Timer4_Isr(void) interrupt 20
  93. {
  94.         static char led_sta;
  95.         switch(led_sta)
  96.         {
  97.                 case 0:                        //显示小数点后一位
  98.                         P6=table[tmp % 10];
  99.                         ge=0;shi=1;bai=1;qian=1;
  100.                         led_sta++;
  101.                 break;
  102.                 case 1:                        //显示个位
  103.                         P6=table[(tmp%100)/10] & 0x7f;   //加小数点
  104.                         ge=1;shi=0;bai=1;
  105.                         led_sta++;
  106.                 break;
  107.                 case 2:                        //显示十位
  108.                         P6=table[tmp/100];
  109.                         ge=1;shi=1;bai=0;
  110.                         led_sta++;
  111.                 break;
  112.                 case 3:                        //显示负号
  113.                         if(neg_flag) P6=0xbf;
  114.                         else P6 = 0xff;
  115.                         ge=1;shi=1;bai=1;qian=0;
  116.                         led_sta=0;
  117.                 break;
  118.                 default:
  119.                         led_sta=0;
  120.                 break;
  121.         }
  122. }
  123. //刷屏定时器
  124. void Timer4_Init(void)                //1毫秒@11.0592MHz
  125. {
  126.         T4T3M &= 0xDF;                        //定时器时钟12T模式
  127.         T4L = 0x66;                                //设置定时初始值
  128.         T4H = 0xFC;                                //设置定时初始值
  129.         T4T3M |= 0x80;                        //定时器4开始计时
  130.         IE2 |= 0x40;                        //使能定时器4中断
  131. }
  132. void main()
  133. {
  134.     EAXSFR();                //扩展寄存器访问使能
  135.     P0M0 = 0x00; P0M1 = 0x00;
  136.     P1M0 = 0x00; P1M1 = 0x00;
  137.     P2M0 = 0x00; P2M1 = 0x00;
  138.     P3M0 = 0x00; P3M1 = 0x00;
  139.     P4M0 = 0x00; P4M1 = 0x00;
  140.     P5M0 = 0x00; P5M1 = 0x00;
  141.     P6M0 = 0x00; P6M1 = 0x00;
  142.     P7M0 = 0x00; P7M1 = 0x00;
  143.         P3PU = 0x10;      //打开P34上拉电阻,为传感器供电
  144.         Timer0_Init();        
  145.         Timer1_Init();
  146.         Timer4_Init();
  147.         EA = 1;        
  148.         while(1)
  149.         {
  150.                 delay_ms(500);  //测温周期
  151.                 TR1 = 1;                //启动测温
  152.         }
  153. }
复制代码





睁开眼睛做场梦~~~
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:12 , Processed in 0.613252 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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