简简单单用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]