晓飛飛
发表于 2024-6-29 19:06:18
Tuier 发表于 2024-6-29 16:40
楼主你好!按照你的程序在屠龙刀上运行,用串口打印输出,显示不稳定,随机会出现一个不正常的数据,请指教 ...
是不是还开了其它中断,里面有长周期程序段影响了Timer1中断及时进入?另外,9600波特率发送ASCII码字符串也是比较慢的,建议提高波特率试试。
liuzonggong
发表于 2024-6-30 08:51:07
晓飛飛 发表于 2024-6-29 19:01
网络标号“SENSOR”和“GND”之间
好,设计完美!
Tuier
发表于 2024-6-30 17:22:42
本帖最后由 Tuier 于 2024-6-30 17:26 编辑
晓飛飛 发表于 2024-6-29 19:06
是不是还开了其它中断,里面有长周期程序段影响了Timer1中断及时进入?另外,9600波特率发送ASCII码字符 ...
用的是USB_CDC串口功能,自适应波特率。
工程只是单独读取NST1001程序,没有其它程序,没有其它中断。
提高波特率仍然无效。
晓飛飛
发表于 2024-6-30 17:39:11
本帖最后由 晓飛飛 于 2024-7-1 12:09 编辑
Tuier 发表于 2024-6-30 17:22
用的是USB_CDC串口功能,自适应波特率。
工程只是单独读取NST1001程序,没有其它程序,没有其它中断。
提 ...
那唯一的区别就是我直接发送的是二进制数据,你用的是printf函数,下面是我的完整代码,你参考一下,
我上位机收到的数据曲线没有杂点和噪声非常干净,你再查查其它方面的问题吧。
#include <stdio.h>
#include <intrins.h>
#include "stc8h.h"
#include "stc32_stc8_usb.h"
//char *USER_DEVICEDESC = NULL;
//char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
sbit NST_PORT = P3^4;
u8 cont;
float temp_avg;
float temp_sum;
bit updata_flag;
u8 out_buf;
int temp_value;
u16 temp_cont;
void Timer1_Isr(void) interrupt 3
{
static bit state;
static u8 loop;
if(++loop > 5) //软定时器 产生50ms周期
{
loop = 0;
if(state)
{
state = 0;
NST_PORT = 1; //端口置高电平为传感器供电
NOP10();
TH0 = 0; //清空计数器
TL0 = 0; //清空计数器
TR0 = 1; //启动计数
}
else
{
state = 1;
NST_PORT = 0; //端口置低电平 传感器断电
TR0 = 0;
temp_cont = (TH0 << 8) | TL0;
temp_sum = (float)(temp_cont) *0.0625 - 50.0625; //解算温度
temp_value =(int)(((temp_sum-30) * 0.005 + temp_sum)* 100);
updata_flag = 1;
}
}
}
void Timer_Init(void) //10毫秒@24.000MHz
{
cont = 0;
temp_avg = 0.0;
temp_sum = 0;
updata_flag = 0;
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xE0; //设置定时初始值
TH1 = 0xB1; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //使能定时器1中断
TMOD &= 0xF0;
TMOD |= 0x04; //设置定时器0为外部计数模式脉冲从T0引脚输入
}
void main()
{
EAXSFR(); //扩展寄存器访问使能
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M0 = 0x10; P3M1 = 0x10;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
P3PU = 0x10; //打开P34上拉电阻,为传感器供电
usb_init(); //USB CDC 接口配置 已配置好时钟,无视ISP下载配置
Timer_Init();
EA = 1;
while (1)
{
if(DeviceState != DEVSTATE_CONFIGURED)//等待USB完成配置
continue;
if (bUsbOutReady)
{
//USB_SendData(UsbOutBuffer,OutNumber);//发送数据缓冲区,长度
usb_OUT_done(); //接收应答(固定格式)
}
if(updata_flag)
{
updata_flag = 0;
out_buf = 0xAA;
out_buf = 0x20;
out_buf = (u8)(temp_value >> 8);
out_buf = (u8)(temp_value & 0xff);
out_buf = (u8)(temp_cont >> 8);
out_buf = (u8)(temp_cont & 0xff);
out_buf = out_buf ^ out_buf^ out_buf ^ out_buf ^ out_buf ^ out_buf;
out_buf = 0xFF;
USB_SendData(&out_buf,8);
}
}
}
Tuier
发表于 2024-6-30 21:39:45
晓飛飛 发表于 2024-6-30 17:39
那唯一的区别就是我直接发送的是二进制数据,你用的是printf函数,下面是我的完整代码,你参考一下,
我 ...
非常感谢楼主无私分享完整代码,从代码和对应的原理图分析可知,你只用一个IO口(P34)且使能内部上拉电阻,按此接线并烧录你的代码,结果显示正常,比较稳定。分析我原来的接线是用了2个IO口:一个是P33串10K的电阻到NST1001端口,作为上拉供电,另一个直接接P34端口作为计数通讯用(手册上的原理图),直接用你的程序就出现了偶尔采集数据不正常的现象。现在改成你的方案,能稳定采集温度数据了。你的方案节约了IO口,利用内部上拉电阻给器件供电断电,是一个很好方案,再次谢谢你的分享,让我们又学到了NST1001的使用知识.
晓飛飛
发表于 2024-6-30 22:53:17
Tuier 发表于 2024-6-30 21:39
非常感谢楼主无私分享完整代码,从代码和对应的原理图分析可知,你只用一个IO口(P34)且使能内部上拉电阻 ...
客气了,欢迎常来交流
Tuier
发表于 2024-7-1 08:16:19
本帖最后由 Tuier 于 2024-7-1 08:19 编辑
晓飛飛 发表于 2024-6-30 22:53
客气了,欢迎常来交流
楼主好,我将你的函数的if和else里内容对调,结果也正常,烦请楼主释惑!哪一个更好呢?
另,temp_sum = (float)(temp_cont) *0.0625 - 50.0625; //10次采集值累加。这句好像没有采集10次呢!?,望求解。
void Timer1_Isr(void) interrupt 3
{
static bit flag50ms;
static u8 flag10ms;
flag10ms++;
if(flag10ms > 5) //软定时器 产生50ms周期
{
flag10ms = 0;
if(flag50ms)
{
flag50ms = 0;
NST1001_DQ = 0; //端口置低电平 传感器断电
TR0 = 0;
temp_cont = (TH0 << 8) | TL0;
temp_sum = (float)(temp_cont) *0.0625 - 50.0625; //10次采集值累加
updata_flag = 1;
}
else
{
flag50ms = 1;
NST1001_DQ = 1; //端口置高电平为传感器供电
NOP10();
TH0 = 0; //清空计数器
TL0 = 0; //清空计数器
TR0 = 1; //启动计数
}
}
}
晓飛飛
发表于 2024-7-1 11:51:06
本帖最后由 晓飛飛 于 2024-7-1 11:54 编辑
Tuier 发表于 2024-7-1 08:16
楼主好,我将你的函数的if和else里内容对调,结果也正常,烦请楼主释惑!哪一个更好呢?
另,temp_sum = ( ...
1,因为NST1001单次数据采集的典型周期是50ms,if和else里面的内容一个是启动供电和计数,一个是关闭供电和计数并处理温度值,一个小小的状态机而已,没有那个更好,都一样的,不过从正常逻辑来讲,应该是先启动供电吧,你说呢?
2,至于代码中的注释,是没删干净的错误,因为这个代码是从我之前的产品代码中挑出来做为单独教程的。
Tuier
发表于 2024-7-1 15:49:35
晓飛飛 发表于 2024-7-1 11:51
1,因为NST1001单次数据采集的典型周期是50ms,if和else里面的内容一个是启动供电和计数,一个是关闭供电 ...
{:5_332:}
ldj7501
发表于 2024-7-1 16:14:41
那么多引脚,有点浪费了{:4_165:}
页:
1
2
3
4
5
6
7
8
[9]
10
11
12