- STC15单片机
- 实验名称:使用NTC电阻测量温度
- 实验内容:
- 使用NTC电阻测量温度并显示在数码管上
- 读取DS18B20模块测量温度参考比较
- 实验器材:
- STC15W408AS_DIP16 x1
- DS18B20 x1
- TM1637数码管 x1
- 1%精度 热敏电阻NTC-MF52-103/3435 10K 3435±1 x1
- 金属膜电阻 1/4W 1% 五色环 10千欧 10K x1
- 在STC15单片机上使用NTC(10K)电阻测量温度的基本方法:
- 电压-->电阻-->温度
- 1、先有一个准确且稳定的参考电压,外部可以用TL431A,内部可以使用STC15系列芯片自带的Bang Gap电压;
- 2、如果用Bang Gap基准电压,则需要使用第九通道读取Bang Gap电压相对于当前MCU供电电压VDD的ADC读数,然后计算出MCU供电电压VDD;
- 3、有了Bang Gap电压,再读取NTC电阻电压的ADC读数,就可以计算出NTC电阻当前电压;
- 4、有了NTC电阻电压,MCU供电电压VDD,就可以得到参考电阻(10k)的电压,就可以计算出NTC电阻当前的阻值;
- 5、有了NTC电阻当前的阻值,查找温度与NTC电阻阻值对应关系表,就可以得到温度值;
- 实验心得:
- 1、使用Bang Gap基准电压,必须使用芯片内部IRC时钟;
- 2、下载HEX时,需要勾选"在程序区的结束处添加重要测试参数"选项,才可在程序中读取Bang Gap基准电压;
- 3、温度与NTC电阻阻值对应关系表,可用二分法查找提高速度;
- 4、查表得到的温度精度只到整数位,可以用相邻阻值区间估算小数位以提高准确度;
- 5、STC15W408AS的代码空间仅8k,存不了字体数据,不适合使用液晶屏显示输出;
- 6、芯片的Band Gap基准电压bdg_voltage可以视为常量,加电后读取一次即可;
- */
- #include "config.h"
- #include "delay.h"
- #include "ds18b20.h"
- #include "adc.h"
- #include "ntc.h"
- #include "uart.h"
- #include "TM1637.h"
- bit timer_flag_200ms = 0; //200ms定时触发标志位
- bit timer_flag_1s = 0; //1s定时触发标志位
- bit timer_flag_5s = 0; //5s定时触发标志位
- bit timer_flag_10s = 0; //10s定时触发标志位
- uint16 timer_count = 0;
- int8 pdata sbuf[20] = {0}; //字符串缓冲区
- void Timer0Init(void);
- void English_Font_test(void);
- void UART_Cmd_Handler(uint8 *buf, uint8 len);
- void DS18B20_Update_Show(void);
- void NTC_Update_Show(void);
- uint8 binarySearch(uint16 *nums, uint8 len, int16 target);
- //主函数
- void main(void)
- {
- uint8 pdata uart_cmd_buf[64] = {0};
- //设置STC15W408AS单片机端口为标准模式
- Config_Port();
- //串口初始化,波特率9600
- UART_Config_1(9600);
-
- //定时器0设置,1ms循环
- Timer0Init();
- //ADC功能初始化
- ADC_Init();
- //启动DS18B20
- DS18B20_Start();
- // 事件处理循环
- while(1)
- {
- UART_Cmd_Check(&uart_cmd_buf, sizeof(uart_cmd_buf)-1);
-
- if (timer_flag_10s) //每隔10s执行以下分支
- {
- printf("\r\n>timer_count %06u seconds.\r\n", 10*++timer_count);
- timer_flag_10s = 0;
- NTC_Update_Show();
- DS18B20_Update_Show();
- }
-
- }
- }
- #define T1MS (65536-FOSC/1000) //1T模式,1ms
- //#define T1MS (65536-FOSC/12/1000) //12T模式,1ms
- void Timer0Init(void) //1毫秒@22.1184MHz
- {
- AUXR |= 0x80; //定时器0为1T模式
- // AUXR &= 0x7f; //定时器0为12T模式
- TMOD = 0x00; //设置定时器为模式0(16位自动重装载)
- TL0 = T1MS; //初始化计时值
- TH0 = T1MS >> 8;
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- EA = 1;
- }
- /* T0中断服务函数,实现系统定时处理 */
- void Timer0_Interrupt_Service() interrupt 1
- {
- static uint8 cnt_ms = 0; // 毫秒计数器
- static uint8 cnt_200ms = 0; // 200毫秒计数器
- static uint8 cnt_sec = 0; // 秒计数器
-
- //定时200ms
- if (++cnt_ms >= 200)
- {
- cnt_ms = 0;
- timer_flag_200ms = 1;
- cnt_200ms++;
- }
- //定时1s
- if (cnt_200ms >= 5)
- {
- cnt_200ms = 0;
- timer_flag_1s = 1;
- if(255 > cnt_sec) cnt_sec++;
- else cnt_sec = 0;
- //定时5s
- if (0 == cnt_sec % 5)
- {
- timer_flag_5s = 1;
- }
- //定时10s
- if (0 == cnt_sec % 10)
- {
- timer_flag_10s = 1;
- }
- }
- UART_Rxd_Monitor(1); //串口接收监控
- }
- /* 串口动作函数,根据接收到的命令帧执行响应的动作
- buf-接收到的命令帧指针,len-命令帧长度 */
- void UART_Cmd_Handler(uint8 *buf, uint8 len)
- {
- printf("\r\n>cmd recv: [%s] (len = %bu)\r\n", buf, len);
- if(0 == strncmp("debug on", buf, 8))
- {
- DEBUG_MODE = 1;
- printf(">cmd exec: debug on\r\n");
- }
- else if(0 == strncmp("debug off", buf, 9))
- {
- DEBUG_MODE = 0;
- printf(">cmd exec: debug off\r\n");
- }
- else
- {
- printf(">cmd unrecognized.\r\n");
- }
- }
- void DS18B20_Update_Show(void)
- {
- bit sign = 0;
- int16 val = 0;
- int8 slen = 0;
- //printf(">>>DS18B20: read...\r\n");
- val = DS18B20_Read();
-
- if(0 > val)
- {
- val *= -1;
- sign = 1;
- }
-
- val %= 1000;
- if(sign)
- {
- sbuf[slen++] = '-';
- }
- //整数部分转换为字符串
- slen += sprintf(sbuf+slen, "%d.%d c", val / 10, val % 10);
- //添加字符串结束符
- sbuf[slen++] = '\0';
- printf(">>>DS18B20 : %s\r\n", sbuf);
- }
- void NTC_Update_Show(void)
- {
- int16 ntc_t = 0;
- uint8 a, b, c;
- ntc_t = NTC_ReadT();
- sprintf(sbuf, "%4.1f", (float)ntc_t/10);
- printf(">>>NTC_T : %s c\r\n", sbuf);
- //TM1637数码管显示测试
- if(' ' == sbuf[0]) a = 22;
- else if('-' == sbuf[0]) a = 21;
- else a = sbuf[0] - '0';
- b = sbuf[1] - '0';
- c = sbuf[3] - '0';
- // 使用TM1637数码管模块显示NTC温度,最后一位显示字母c表示℃
- TM1637_Display(a, b, c, 12);
- }
复制代码 完整代码及资料:
uart_ntc10k_STC15W408AS.zip
(440.95 KB, 售价: 2 E币)
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|