【简要说明】
尺寸:长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_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; ]]} /*********************************************************************************************/
|