找回密码
 立即注册
查看: 1401|回复: 0

基于STC15W408AS单片机设计的NTC温度传感器检测报警控制继电器电路开源资料

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-17 16:39:04

43

主题

7

回帖

253

积分

中级会员

积分
253
发表于 2023-6-15 13:37:21 | 显示全部楼层 |阅读模式
【简要说明】
尺寸:长79mmX宽50mmX高22mm
、主要芯片:STC15W408AS
、工作电压:直流6~24
、支持:UATR接口下载程序
【板子特点】
1、6V~24V宽电压输入;
2、具有电源指示功能;
3继电器输出最大支持220V 10A
43位数码管显示;
5、双按键温度可调;
测量温度范围0~99度
7、采用螺旋端子压接,接线可靠方便扩展;
8、供电具有防反接保护。电路工作稳定可靠;
9工作环境:湿度小于80% ,温度 -0度至50

标注.jpg
接线.jpg
下载.jpg
应用举例.bmp
6.jpg
7.jpg

/********************************************************************
<span]/********************************************************************
<span]                            宏定义
*********************************************************************/
<span]*********************************************************************/
<span]#include<STC15W408AS.h>                 //库文件
#include<intrins.h>
<span]#include<intrins.h>
<span]#define uchar unsigned char//宏定义无符号字符型
#define]#define]#define ADC_POWER   0x80            //ADC 电源控制位
#define]#define]#define ADC_START   0x08            //ADC 开始转换控制位
#define]#define]#define ADC_SPEEDL  0x20            //420 个时钟周期转换一次
#define]#define]#define ADC_SPEEDHH 0x60            //840 个时钟周期转换一次

<span]
<span]typedef unsigned char  INT8U;
typedef]typedef]#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
#define]#define]#define WD2        0xa5
char]char]/********************************************************************
]]*********************************************************************/
code]code]code uint  wendu[106][2]={//温度与电阻阻值对应关系表格
0,3274,//0度对应阻值32.74k
<span]0,3274,//0度对应阻值32.74k
<span]1,3111,//1度对应阻值31.11k
2,2957,//2度对应阻值29.57k
<span]2,2957,//2度对应阻值29.57k
<span]3,2812,//
4,2674,//
<span]4,2674,//
<span]5,2545,
6,2422,
<span]6,2422,
<span]7,2306,
8,2196,
<span]8,2196,
<span]9,2092,
10,1993,
<span]10,1993,
<span]11,1900,
12,1811,
<span]12,1811,
<span]13,1728,
14,1648,
<span]14,1648,
<span]15,1573,
16,1501,
<span]16,1501,
<span]17,1433,
18,1369,
<span]18,1369,
<span]19,1308,
20,1250,
<span]20,1250,
<span]21,1194,
22,1142,
<span]22,1142,
<span]23,1092,
24,1045,
<span]24,1045,
<span]25,1000,//25度对应阻值10k               
26,957,//26度对应阻值9.57k
<span]26,957,//26度对应阻值9.57k
<span]27,916,
28,877,
<span]28,877,
<span]29,840,
30,805,
<span]30,805,
<span]31,771,
32,739,
<span]32,739,
<span]33,709,
34,679,
<span]34,679,
<span]35,652,
36,625,
<span]36,625,
<span]37,600,
38,576,
<span]38,576,
<span]39,553,
40,531,
<span]40,531,
<span]41,510,
42,490,
<span]42,490,
<span]43,471,
44,453,
<span]44,453,
<span]45,435,
46,418,
<span]46,418,
<span]47,402,
48,387,
<span]48,387,
<span]49,372,
50,358,
<span]50,358,
<span]51,345,
52,332,
<span]52,332,
<span]53,320,
54,308,
<span]54,308,
<span]55,297,
56,286,
<span]56,286,
<span]57,276,
58,266,
<span]58,266,
<span]59,256,
60,247,
<span]60,247,
<span]61,238,
62,230,
<span]62,230,
<span]63,222,
64,214,
<span]64,214,
<span]65,207,
66,199,
<span]66,199,
<span]67,193,
68,186,
<span]68,186,
<span]69,180,
70,174,
<span]70,174,
<span]71,168,
72,162,
<span]72,162,
<span]73,157,
74,]74,]75,        147,
76,]76,]77,        137,
78,]78,]79,        128,
80,]80,]81,        120,
82,]82,]83,        113,
84,]84,]85,        106,
86,]86,]87,        99,//87度对应阻值0.99k
88,]88,]89,        93,
90,]90,]91,        88,
92,]92,]93,        82,
94,]94,]95,        78,
96,]96,]97,        73,
98,]98,]99,        69,
100,67,
<span]100,67,
<span]101,65,
102,63,
<span]102,63,
<span]103,61,
104,59,
<span]104,59,
<span]105,58//105度对应阻值0.58k
]]
};]};]/********************************************************************
]]*********************************************************************/
bit]bit]uchar y=0,smg2=0,s1=0,s2=0,ii=0;
uint]uint]sbit aj1=P5^4;
sbit]sbit]sbit out=P3^4;
sbit]sbit]sbit L2=P3^6;//数码管位控制
sbit]sbit]sbit dp=P3^3;//小数点
bit]bit]uchar trg=0,trg_1=0,cont=0,cont_1=0;
uchar]uchar]/********************************************************************
]]*********************************************************************/
union]union]{
]]    INT8U  un_temp8[2];
}my_unTemp16;
<span]}my_unTemp16;
<span]
INT8U]INT8U]void Byte_Program(INT16U add, INT8U ch);  //字节编程,调用前需打开IAP 功能
void]void]void IAP_Disable();                       //关闭IAP 功能
/********************************************************************
<span]/********************************************************************
<span]                         AD转换初始化程序
*********************************************************************/
<span]*********************************************************************/
<span]void InitADC()
{
<span]{
<span]   P1ASF = 0x80;          //设置P1.7口AD转换,必须加
]]   P1M1=0X80;        //设置P1.7口为开漏模式,使用AD功能
]]    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打开AD电源,转换周期210
]]    _nop_();
<span]<span]}
/********************************************************************
<span]/********************************************************************
<span]                         AD转换控制程序
*********************************************************************/
<span]*********************************************************************/
<span]uchar ADCRead(uchar px)          //转换输出的数据 (PX为通道口)
{
<span]{
<span]    ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//开始转换
]]    _nop_();                                                //延时一个机器周期
]]    _nop_();                                                //延时一个机器周期
]]    ADC_CONTR &= ~ADC_FLAG;         //关闭AD转换
]]}
/*******************************************************************
<span]/*******************************************************************
<span]*                        读取按键状态
********************************************************************/
<span]********************************************************************/
<span]void KeyRead()//读取按键IO口函数
{
<span]{
<span]     ReadData = aj1^0xff;  // 读取按键状态取反后赋值给ReadData
]]     cont = ReadData;   //cont长按,长按cont=1,抬手后cont=0

<span]
<span]         ReadData_1 = aj2^0xff;  // 读取按键状态取反后赋值给ReadData
]]    cont_1 = ReadData_1;   //cont长按,长按cont=1,抬手后cont=0
}
<span]}
<span]/*******************************************************************
*]*]********************************************************************/
void]void]{          
]]  {       
]]         kt=1; //这是短按标志位,kt=1说明短按了
]]  if((aj1!=0)&&(kt==1))//判断
<span]<span]         z=1; // 选位标志位
<span]<span]         out=1;
<span]<span]          {
<span]<span]           k=1;
<span]<span]//           s=s1+s2+s3;
<span]<span]         kt=0;
]]
}
<span]}
<span]
void]void]{          
]]  {       
]]         kt_1=1; //这是短按标志位,kt=1说明短按了
]]  if((aj2!=0)&&(kt_1==1))//判断
<span]<span]         if(y==1)
<span]<span]           s1++;
<span]<span]            {
<span]<span]                }
<span]<span]         if(y==2)
<span]<span]           s2+=10;
<span]<span]            {
<span]<span]                }
<span]<span]         s=s1+s2;
<span]<span]    }           // 短按
}
<span]}
<span]
/*******************************************************************
<span]/*******************************************************************
<span]*                        定时器配置
********************************************************************/
<span]********************************************************************/
<span]void ConfigTimer0(){
<span]<span]    TH0=0XFC;//1ms
]]        TR0=1;//开启定时器0
<span]<span]        EA=1;//开总中断
}
<span]}
<span]
/*******************************************************************
<span]/*******************************************************************
<span]*                         显示
********************************************************************/
<span]********************************************************************/
<span]void led(uint date)
{
<span]{
<span] bai=date/100;
]] ge=date%10;
}
<span]}
<span]/*******************************************************************
*]*]********************************************************************/
void]void]{
]]    TL0=0X66;
<span]<span]        if(js==200){ba=1;js=0;}
<span]<span]          smg2++;
<span]<span]           else{
<span]<span]           }

<span]
<span]             switch(smg2){                 //数码管扫描
<span]<span]           case 1:  if(y==0){P1=0x39;} else {P1=seg7code[ge];}L3=1;L2=1;L1=0;dp=0;break;//从P2进P0出
<span]<span]          case 3:  P1=seg7code[bai]; L3=0;L2=1;L1=1;dp=0;break;       
<span]<span]          default: smg2=0; L3=1;L2=1;L1=1; break;
<span]<span]}
/********************************************************************
<span]/********************************************************************
<span]                            主函数
*********************************************************************/
<span]*********************************************************************/
<span]void main()
{
<span]{
<span]  ConfigTimer0();        //定时器初始化
]]    P1M0 = 0xff;   //设置强推挽和开漏模式
]]        P3M0 = 0x08;   //小数点使用
<span]<span]        if(Byte_Read(0X0001)==0xff){s1=0;s2=0;}//首次读取,如果读到0xFF说明没有存过数据,直接付给00值
<span]<span]        {
<span]<span]         s2=Byte_Read(0X0002);
<span]<span]        s2=s2*10;
<span]<span]   while(1)
]]          if(ba==1){
<span]<span]                                dat1=(dat*1000)/(51-dat);
<span]<span]                  if((dat1 <= wendu[ii][1]) && (dat1 > wendu[ii+1][1])){ //对比列表查找温度
]]                                   ii=0;
]]                  }
<span]<span]                                ba=0;
<span]<span]             
<span]<span]          if(y==1){zs=0;led(s1);}
<span]<span]          if(y==3){zs=0;z=0;led(s);}
<span]<span]          KeyRead(); //按键扫描
<span]<span]          key_2();
<span]<span]          {
<span]<span]                 Byte_Program(0x0001,s1);  //写入扇区
<span]<span]                 k=0;
<span]<span]        }
]]}
//读一字节,调用前需打开IAP]//读一字节,调用前需打开IAP]INT8U Byte_Read(INT16U add)
{
<span]{
<span]    IAP_DATA = 0x00;
]]    IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令

<span]
<span]    my_unTemp16.un_temp16 = add;
]]    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

<span]
<span]    //EA = 0;
]]    IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被触发起动
]]    //EA = 1;
]]                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
]]}
/*********************************************************************************************/
<span]/*********************************************************************************************/
<span]//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void]void]{
]]    IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令

<span]
<span]    my_unTemp16.un_temp16 = add;
]]    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

<span]
<span]    IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
]]    IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 触发寄存器,每次都需如此
]]    _nop_();
]]    IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
]]}
/*********************************************************************************************
<span]/*********************************************************************************************
<span]//擦除扇区, 入口:DPTR = 扇区地址 */
void]void]{
]]    IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令

<span]
<span]    my_unTemp16.un_temp16 = add;
]]    IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

<span]
<span]    //EA = 0;
]]    IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被触发起动
]]    //EA = 1;
]]                    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}
<span]}
<span]/*********************************************************************************************/
void]void]{
]]    //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
]]    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
]]    IAP_ADDRH = 0;
]]}
/*********************************************************************************************/



NTC测温检测开关量干节点输出资料.zip

1.31 MB, 下载次数: 135

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 18:42 , Processed in 0.148820 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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