晓飛飛 发表于 2024-5-27 02:16:04

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

本帖最后由 晓飛飛 于 2024-5-27 02:17 编辑

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


142

/*
NST1001脉冲型温度传感器测试例程
本代码基于STC大学计划实验箱9.62运行
MCU型号:STC8H8K64U
IRC时钟频率:11.0592MHz
编写日期:2024-05-27
*/

#include "stc8h.h"

#define MAIN_Fosc 11059200L
sbit qian = P7^3;
sbit bai = P7^2;
sbit shi = P7^1;
sbit ge = P7^0;
sbit NST_IO = P3^4;
int tmp;
bit neg_flag;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay_ms(unsigned int ms)
{
      unsigned int i;
      do{
                i = MAIN_Fosc / 10000;
                while(--i);
      }while(--ms);
}

void Timer0_Init(void)
{
      TMOD &= 0xF0;         
      TMOD |= 0x04;    //设置定时器为外部计数模式脉冲从T0引脚输入
}

void Timer1_Isr(void) interrupt 3
{
      static char NST_sta;
      float tmp_float;
      switch(NST_sta)
      {
                case 0:
                        NST_sta++;
                        break;
                case 1:               
                        NST_IO = 1;
                        NST_sta++;
                        break;
                case 2:
                        NST_sta++;
                        break;
                case 3:
                        TH0 = 0;          //清空计数器
                        TL0 = 0;          //清空计数器      
                        TR0 = 1;
                        NST_sta++;
                        break;
                case 4:
                case 5:
                        NST_sta++;
                        break;
                case 6:
                        TR0 = 0;
                        TR1 = 0;                              
                        //P3PU = 0x00;      //为传感器断电
                  NST_IO = 0;
                        tmp_float = ((TH0 << 8) | TL0) *0.0625 - 50.0625;         ////
                        tmp = (int)(tmp_float * 10);
                        if (tmp < 0)
                        {
                              tmp = 0-tmp;
                              neg_flag = 1;
                        }
                        else
                        {
                              neg_flag = 0;
                        }
                        NST_sta = 0;                                                
                        break;
                default:
                        NST_sta = 0;
                        break;
      }                        
}

//测温定时器
void Timer1_Init(void)                //10毫秒@11.0592MHz
{
      AUXR &= 0xBF;                        //定时器时钟12T模式
      TMOD &= 0x0F;                        //设置定时器模式
      TL1 = 0x00;                              //设置定时初始值
      TH1 = 0xDC;                              //设置定时初始值
      TF1 = 0;                              //清除TF1标志
      //TR1 = 1;                              //定时器1开始计时
      ET1 = 1;                              //使能定时器1中断
}

//刷数码管
void Timer4_Isr(void) interrupt 20
{
      static char led_sta;
      switch(led_sta)
      {
                case 0:                        //显示小数点后一位
                        P6=table;
                        ge=0;shi=1;bai=1;qian=1;
                        led_sta++;
                break;
                case 1:                        //显示个位
                        P6=table[(tmp%100)/10] & 0x7f;   //加小数点
                        ge=1;shi=0;bai=1;
                        led_sta++;
                break;
                case 2:                        //显示十位
                        P6=table;
                        ge=1;shi=1;bai=0;
                        led_sta++;
                break;
                case 3:                        //显示负号
                        if(neg_flag) P6=0xbf;
                        else P6 = 0xff;
                        ge=1;shi=1;bai=1;qian=0;
                        led_sta=0;
                break;
                default:
                        led_sta=0;
                break;
      }
}

//刷屏定时器
void Timer4_Init(void)                //1毫秒@11.0592MHz
{
      T4T3M &= 0xDF;                        //定时器时钟12T模式
      T4L = 0x66;                              //设置定时初始值
      T4H = 0xFC;                              //设置定时初始值
      T4T3M |= 0x80;                        //定时器4开始计时
      IE2 |= 0x40;                        //使能定时器4中断
}

void main()
{
    EAXSFR();                //扩展寄存器访问使能
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;
      P3PU = 0x10;      //打开P34上拉电阻,为传感器供电
      Timer0_Init();      
      Timer1_Init();
      Timer4_Init();
      EA = 1;      
      while(1)
      {
                delay_ms(500);//测温周期
                TR1 = 1;                //启动测温
      }
}




页: [1]
查看完整版本: 简简单单用3个定时器搞定NST1001温度传感器+LED数码管