基于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]