晓飛飛 发表于 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
查看完整版本: 简简单单做个USB温度传感器