钰平电子 发表于 2023-6-15 13:37:21

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

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



/********************************************************************<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_SPEEDL0x20            //420 个时钟周期转换一次#define]#define]#define ADC_SPEEDHH 0x60            //840 个时钟周期转换一次
<span]
<span]typedef unsigned charINT8U;typedef]typedef]#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值#define]#define]#define WD2        0xa5char]char]/********************************************************************]]*********************************************************************/code]code]code uintwendu={//温度与电阻阻值对应关系表格0,3274,//0度对应阻值32.74k<span]0,3274,//0度对应阻值32.74k<span]1,3111,//1度对应阻值31.11k2,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.99k88,]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]{]]    INT8Uun_temp8;}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;}L3=1;L2=1;L1=0;dp=0;break;//从P2进P0出<span]<span]          case 3:P1=seg7code; 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) && (dat1 > wendu)){ //对比列表查找温度]]                                   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;    //设置目标单元地址的低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;    //设置目标单元地址的低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;    //设置目标单元地址的低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;]]}/*********************************************************************************************/


页: [1]
查看完整版本: 基于STC15W408AS单片机设计的NTC温度传感器检测报警控制继电器电路开源资料