找回密码
 立即注册
楼主: 晓飛飛

简简单单做个USB温度传感器

  [复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 2024-6-29 17:47:37 | 显示全部楼层
传感器接哪里了?原理图没有啊。

点评

网络标号“SENSOR”和“GND”之间  详情 回复 发表于 2024-6-29 19:01
回复 支持 反对

使用道具 举报 送花

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

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-6-29 19:01:30 | 显示全部楼层
liuzon*** 发表于 2024-6-29 17:47
传感器接哪里了?原理图没有啊。

网络标号“SENSOR”和“GND”之间
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

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

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-6-29 19:06:18 | 显示全部楼层
Tui*** 发表于 2024-6-29 16:40
楼主你好!按照你的程序在屠龙刀上运行,用串口打印输出,显示不稳定,随机会出现一个不正常的数据,请指教 ...

是不是还开了其它中断,里面有长周期程序段影响了Timer1中断及时进入?另外,9600波特率发送ASCII码字符串也是比较慢的,建议提高波特率试试。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 2024-6-30 08:51:07 | 显示全部楼层
晓*** 发表于 2024-6-29 19:01
网络标号“SENSOR”和“GND”之间

好,设计完美!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 2024-6-30 17:22:42 | 显示全部楼层
本帖最后由 Tuier 于 2024-6-30 17:26 编辑
晓*** 发表于 2024-6-29 19:06
是不是还开了其它中断,里面有长周期程序段影响了Timer1中断及时进入?另外,9600波特率发送ASCII码字符 ...

用的是USB_CDC串口功能,自适应波特率。
工程只是单独读取NST1001程序,没有其它程序,没有其它中断。
提高波特率仍然无效。

点评

那唯一的区别就是我直接发送的是二进制数据,你用的是printf函数,下面是我的完整代码,你参考一下, 我上位机收到的数据曲线没有杂点和噪声非常干净,你再查查其它方面的问题吧。  详情 回复 发表于 2024-6-30 17:39
回复 支持 反对

使用道具 举报 送花

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

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-6-30 17:39:11 | 显示全部楼层
本帖最后由 晓飛飛 于 2024-7-1 12:09 编辑
Tui*** 发表于 2024-6-30 17:22
用的是USB_CDC串口功能,自适应波特率。
工程只是单独读取NST1001程序,没有其它程序,没有其它中断。
提 ...

那唯一的区别就是我直接发送的是二进制数据,你用的是printf函数,下面是我的完整代码,你参考一下,

我上位机收到的数据曲线没有杂点和噪声非常干净,你再查查其它方面的问题吧。
  1. #include <stdio.h>
  2. #include <intrins.h>
  3. #include "stc8h.h"
  4. #include "stc32_stc8_usb.h"
  5. //char *USER_DEVICEDESC = NULL;
  6. //char *USER_PRODUCTDESC = NULL;
  7. char *USER_STCISPCMD = "@STCISP#";
  8. sbit NST_PORT = P3^4;
  9. u8        cont;
  10. float temp_avg;
  11. float temp_sum;
  12. bit updata_flag;
  13. u8 out_buf[8];
  14. int temp_value;
  15. u16 temp_cont;
  16. void Timer1_Isr(void) interrupt 3
  17. {
  18.         static bit state;
  19.         static u8 loop;
  20.         if(++loop > 5)     //软定时器 产生50ms周期
  21.         {
  22.                 loop = 0;
  23.                 if(state)
  24.                 {
  25.                         state = 0;
  26.                         NST_PORT = 1;     //端口置高电平为传感器供电
  27.                         NOP10();                        
  28.                         TH0 = 0;          //清空计数器
  29.                         TL0 = 0;          //清空计数器                        
  30.                         TR0 = 1;          //启动计数
  31.                 }
  32.                 else
  33.                 {
  34.                         state = 1;
  35.                         NST_PORT = 0;      //端口置低电平 传感器断电
  36.                         TR0 = 0;
  37.                         temp_cont = (TH0 << 8) | TL0;
  38.                         temp_sum = (float)(temp_cont) *  0.0625 - 50.0625;           //解算温度      
  39.                         temp_value =  (int)(((temp_sum-30) * 0.005 + temp_sum)* 100);
  40.                         updata_flag = 1;               
  41.                 }
  42.         }                        
  43. }
  44. void Timer_Init(void)                //10毫秒@24.000MHz
  45. {
  46.         cont = 0;
  47.         temp_avg = 0.0;
  48.         temp_sum = 0;
  49.         updata_flag = 0;
  50.         
  51.         AUXR &= 0xBF;                        //定时器时钟12T模式
  52.         TMOD &= 0x0F;                        //设置定时器模式
  53.         TL1 = 0xE0;                                //设置定时初始值
  54.         TH1 = 0xB1;                                //设置定时初始值
  55.         TF1 = 0;                                //清除TF1标志
  56.         TR1 = 1;                                //定时器1开始计时
  57.         ET1 = 1;                                //使能定时器1中断        
  58.         
  59.         TMOD &= 0xF0;         
  60.         TMOD |= 0x04;                    //设置定时器0为外部计数模式  脉冲从T0引脚输入        
  61. }
  62. void main()
  63. {
  64.     EAXSFR();                //扩展寄存器访问使能
  65.    
  66.     P0M1 = 0x00;   P0M0 = 0x00;
  67.     P1M1 = 0x00;   P1M0 = 0x00;
  68.     P2M1 = 0x00;   P2M0 = 0x00;
  69.     P3M0 = 0x10;   P3M1 = 0x10;
  70.     P4M1 = 0x00;   P4M0 = 0x00;
  71.     P5M1 = 0x00;   P5M0 = 0x00;
  72.     P6M1 = 0x00;   P6M0 = 0x00;
  73.     P7M1 = 0x00;   P7M0 = 0x00;
  74.     P3PU = 0x10;      //打开P34上拉电阻,为传感器供电
  75.         usb_init();               //USB CDC 接口配置 已配置好时钟,无视ISP下载配置
  76.         Timer_Init();
  77.         EA = 1;
  78.          while (1)
  79.          {
  80.          if(DeviceState != DEVSTATE_CONFIGURED)  //等待USB完成配置
  81.             continue;
  82.         if (bUsbOutReady)
  83.         {
  84.             //USB_SendData(UsbOutBuffer,OutNumber);  //发送数据缓冲区,长度
  85.             usb_OUT_done();    //接收应答(固定格式)
  86.         }         
  87.                 if(updata_flag)
  88.                 {
  89.                         updata_flag = 0;
  90.                         out_buf[0] = 0xAA;
  91.                         out_buf[1] = 0x20;
  92.                         out_buf[2] = (u8)(temp_value >> 8);
  93.                         out_buf[3] = (u8)(temp_value & 0xff);
  94.                         out_buf[4] = (u8)(temp_cont >> 8);
  95.                         out_buf[5] = (u8)(temp_cont & 0xff);
  96.                         out_buf[6] = out_buf[0] ^ out_buf[1]  ^ out_buf[2] ^ out_buf[3] ^ out_buf[4] ^ out_buf[5];
  97.                         out_buf[7] = 0xFF;
  98.                         USB_SendData(&out_buf[0],8);
  99.                 }
  100.         }               
  101. }
复制代码



睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 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
回复 支持 反对

使用道具 举报 送花

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

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-6-30 22:53:17 | 显示全部楼层
Tui*** 发表于 2024-6-30 21:39
非常感谢楼主无私分享完整代码,从代码和对应的原理图分析可知,你只用一个IO口(P34)且使能内部上拉电阻 ...

客气了,欢迎常来交流
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 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;          //启动计数
                }
                        
        }              
}

点评

1,因为NST1001单次数据采集的典型周期是50ms,if和else里面的内容一个是启动供电和计数,一个是关闭供电和计数并处理温度值,一个小小的状态机而已,没有那个更好,都一样的,不过从正常逻辑来讲,应该是先启动供电  详情 回复 发表于 2024-7-1 11:51
回复 支持 反对

使用道具 举报 送花

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

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-7-1 11:51:06 | 显示全部楼层
本帖最后由 晓飛飛 于 2024-7-1 11:54 编辑
Tui*** 发表于 2024-7-1 08:16
楼主好,我将你的函数的if和else里内容对调,结果也正常,烦请楼主释惑!哪一个更好呢?
另,temp_sum = ( ...

1,因为NST1001单次数据采集的典型周期是50ms,if和else里面的内容一个是启动供电和计数,一个是关闭供电和计数并处理温度值,一个小小的状态机而已,没有那个更好,都一样的,不过从正常逻辑来讲,应该是先启动供电吧,你说呢?
2,至于代码中的注释,是没删干净的错误,因为这个代码是从我之前的产品代码中挑出来做为单独教程的。




睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:58 , Processed in 0.229169 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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