|
|
【簡(jiǎn)要說(shuō)明】
尺寸:長(zhǎng)79mmX寬50mmX高22mm
一、主要芯片:STC15W408AS
二、工作電壓:直流6~24伏
三、支持:UATR接口下載程序
【板子特點(diǎn)】
1、6V~24V寬電壓輸入;
2、具有電源指示功能;
3、繼電器輸出最大支持220V 10A;
4、3位數(shù)碼管顯示;
5、雙按鍵溫度可調(diào);
6、測(cè)量溫度范圍0~99度
7、采用螺旋端子壓接,接線可靠方便擴(kuò)展;
8、供電具有防反接保護(hù)。電路工作穩(wěn)定可靠;
9、工作環(huán)境:濕度小于80%,溫度 -0度至50度
10、提供相關(guān)軟件、原理圖 例程及相關(guān)資料;
/********************************************************************
宏定義
*********************************************************************/
#include<STC15W408AS.h> //庫(kù)文件
#include<intrins.h>
#define uchar unsigned char//宏定義無(wú)符號(hào)字符型
#define uint unsigned int //宏定義無(wú)符號(hào)整型
#define ADC_POWER 0x80 //ADC 電源控制位
#define ADC_FLAG 0x10 //ADC 轉(zhuǎn)換結(jié)束標(biāo)志位
#define ADC_START 0x08 //ADC 開(kāi)始轉(zhuǎn)換控制位
#define ADC_SPEEDLL 0x00 //210 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDL 0x20 //420 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDH 0x40 //630 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
#define ADC_SPEEDHH 0x60 //840 個(gè)時(shí)鐘周期轉(zhuǎn)換一次
typedef unsigned char INT8U;
typedef unsigned int INT16U;
#define ENABLE_ISP 0x82 //系統(tǒng)工作時(shí)鐘<20MHz 時(shí),對(duì)IAP_CONTR 寄存器設(shè)置此值
#define WD1 0x5a //使用STC11xx系列單片機(jī)時(shí),先寫入0x5a,然寫入0xa5
#define WD2 0xa5
char IAPAddr=0;
/********************************************************************
初始定義
*********************************************************************/
code uchar seg7code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //顯示段碼 數(shù)碼管字跟
code uint wendu[106][2]={//溫度與電阻阻值對(duì)應(yīng)關(guān)系表格
0,3274,//0度對(duì)應(yīng)阻值32.74k
1,3111,//1度對(duì)應(yīng)阻值31.11k
2,2957,//2度對(duì)應(yīng)阻值29.57k
3,2812,//
4,2674,//
5,2545,
6,2422,
7,2306,
8,2196,
9,2092,
10,1993,
11,1900,
12,1811,
13,1728,
14,1648,
15,1573,
16,1501,
17,1433,
18,1369,
19,1308,
20,1250,
21,1194,
22,1142,
23,1092,
24,1045,
25,1000,//25度對(duì)應(yīng)阻值10k
26,957,//26度對(duì)應(yīng)阻值9.57k
27,916,
28,877,
29,840,
30,805,
31,771,
32,739,
33,709,
34,679,
35,652,
36,625,
37,600,
38,576,
39,553,
40,531,
41,510,
42,490,
43,471,
44,453,
45,435,
46,418,
47,402,
48,387,
49,372,
50,358,
51,345,
52,332,
53,320,
54,308,
55,297,
56,286,
57,276,
58,266,
59,256,
60,247,
61,238,
62,230,
63,222,
64,214,
65,207,
66,199,
67,193,
68,186,
69,180,
70,174,
71,168,
72,162,
73,157,
74, 152,
75, 147,
76, 142,
77, 137,
78, 133,
79, 128,
80, 124,
81, 120,
82, 116,
83, 113,
84, 109,
85, 106,
86, 102,//86度對(duì)應(yīng)阻值1.02k
87, 99,//87度對(duì)應(yīng)阻值0.99k
88, 96,
89, 93,
90, 90,
91, 88,
92, 85,
93, 82,
94, 80,
95, 78,
96, 75,
97, 73,
98, 71,
99, 69,
100,67,
101,65,
102,63,
103,61,
104,59,
105,58//105度對(duì)應(yīng)阻值0.58k
};
/********************************************************************
I/O定義
*********************************************************************/
bit z=0,ba=0,k=0,zs=0;
uchar y=0,smg2=0,s1=0,s2=0,ii=0;
uint s=0,bai=0,shi=0,ge=0,js=0,dat=0,dat1=0,dat2=0;
sbit aj1=P5^4;
sbit aj2=P5^5;
sbit out=P3^4;
sbit L1=P3^5;//數(shù)碼管位控制
sbit L2=P3^6;//數(shù)碼管位控制
sbit L3=P3^7;//數(shù)碼管位控制
sbit dp=P3^3;//小數(shù)點(diǎn)
bit kt=0,kt_1=0;
uchar trg=0,trg_1=0,cont=0,cont_1=0;
uchar ReadData=0,ReadData_1=0;
/********************************************************************
E2P函數(shù)
*********************************************************************/
union union_temp16
{
INT16U un_temp16;
INT8U un_temp8[2];
}my_unTemp16;
INT8U Byte_Read(INT16U add); //讀一字節(jié),調(diào)用前需打開(kāi)IAP 功能
void Byte_Program(INT16U add, INT8U ch); //字節(jié)編程,調(diào)用前需打開(kāi)IAP 功能
void Sector_Erase(INT16U add); //擦除扇區(qū)
void IAP_Disable(); //關(guān)閉IAP 功能
/********************************************************************
AD轉(zhuǎn)換初始化程序
*********************************************************************/
void InitADC()
{
P1ASF = 0x80; //設(shè)置P1.7口AD轉(zhuǎn)換,必須加
P1M0=0X80;
P1M1=0X80; //設(shè)置P1.7口為開(kāi)漏模式,使用AD功能
ADC_RES = 0; //AD數(shù)據(jù)寄存器清空
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打開(kāi)AD電源,轉(zhuǎn)換周期210
_nop_(); //延時(shí)一個(gè)機(jī)器周期
_nop_();
_nop_(); //延時(shí)一個(gè)機(jī)器周期
}
/********************************************************************
AD轉(zhuǎn)換控制程序
*********************************************************************/
uchar ADCRead(uchar px) //轉(zhuǎn)換輸出的數(shù)據(jù) (PX為通道口)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL |px| ADC_START;//開(kāi)始轉(zhuǎn)換
_nop_(); //延時(shí)一個(gè)機(jī)器周期
_nop_(); //延時(shí)一個(gè)機(jī)器周期
_nop_(); //延時(shí)一個(gè)機(jī)器周期
_nop_(); //延時(shí)一個(gè)機(jī)器周期
while (!(ADC_CONTR & ADC_FLAG));//等待轉(zhuǎn)換結(jié)束
ADC_CONTR &= ~ADC_FLAG; //關(guān)閉AD轉(zhuǎn)換
return ADC_RES; //返回?cái)?shù)據(jù)
}
/*******************************************************************
* 讀取按鍵狀態(tài)
********************************************************************/
void KeyRead()//讀取按鍵IO口函數(shù)
{
ReadData = aj1^0xff; // 讀取按鍵狀態(tài)取反后賦值給ReadData
trg = ReadData & (ReadData ^ cont); //trg短按,每按下按鍵trg=1;抬手后為trg=0,長(zhǎng)按為trg=0
cont = ReadData; //cont長(zhǎng)按,長(zhǎng)按cont=1,抬手后cont=0
ReadData_1 = aj2^0xff; // 讀取按鍵狀態(tài)取反后賦值給ReadData
trg_1 = ReadData_1 & (ReadData_1 ^ cont_1); //trg短按,每按下按鍵trg=1;抬手后為trg=0,長(zhǎng)按為trg=0
cont_1 = ReadData_1; //cont長(zhǎng)按,長(zhǎng)按cont=1,抬手后cont=0
}
/*******************************************************************
* 按鍵
********************************************************************/
void key_1()
{
if(trg & 0x01) //短按
{
kt_1=0;
kt=1; //這是短按標(biāo)志位,kt=1說(shuō)明短按了
}
if((aj1!=0)&&(kt==1))//判斷
{
z=1; // 選位標(biāo)志位
y++; //選位
out=1;
if(y==4)
{
z=0;
k=1;
y=0;
// s=s1+s2+s3;
}
kt=0;
} // 短按
}
void key_2()
{
if(trg_1 & 0x01) //短按
{
kt=0;
kt_1=1; //這是短按標(biāo)志位,kt=1說(shuō)明短按了
}
if((aj2!=0)&&(kt_1==1))//判斷
{
if(y==1)
{
s1++;
if(s1>9)
{
s1=0;
}
}
if(y==2)
{
s2+=10;
if(s2>90)
{
s2=0;
}
}
s=s1+s2;
kt_1=0;
} // 短按
}
/*******************************************************************
* 定時(shí)器配置
********************************************************************/
void ConfigTimer0(){
TMOD=0x01;//將定時(shí)器0,1都設(shè)置為模式1
TH0=0XFC;//1ms
TL0=0X66;
TR0=1;//開(kāi)啟定時(shí)器0
ET0=1;//開(kāi)定時(shí)器0的中斷
EA=1;//開(kāi)總中斷
}
/*******************************************************************
* 顯示
********************************************************************/
void led(uint date)
{
bai=date/100;
shi=date%100/10;
ge=date%10;
}
/*******************************************************************
* t0定時(shí)器
********************************************************************/
void timer0() interrupt 1
{
TH0=0XFC;//1ms
TL0=0X66;
js++;
if(js==200){ba=1;js=0;}
if(z==0){
smg2++;
}
else{
smg2=y;//讓逐個(gè)顯示位
}
switch(smg2){ //數(shù)碼管掃描
/**************數(shù)碼管-開(kāi)始*****************/
case 1: if(y==0){P1=0x39;} else {P1=seg7code[ge];}L3=1;L2=1;L1=0;dp=0;break;//從P2進(jìn)P0出
case 2: P1=seg7code[shi];L3=1;L2=0;L1=1;if(zs==0){dp=0;}else{dp=1;}break;
case 3: P1=seg7code[bai]; L3=0;L2=1;L1=1;dp=0;break;
/**************數(shù)碼管-結(jié)束*****************/
default: smg2=0; L3=1;L2=1;L1=1; break;
}
}
/********************************************************************
主函數(shù)
*********************************************************************/
void main()
{
ConfigTimer0(); //定時(shí)器初始化
InitADC(); //AD初始化
P1M0 = 0xff; //設(shè)置強(qiáng)推挽和開(kāi)漏模式
P1M1 = 0x80;
P3M0 = 0x08; //小數(shù)點(diǎn)使用
P3M1 = 0x00;
if(Byte_Read(0X0001)==0xff){s1=0;s2=0;}//首次讀取,如果讀到0xFF說(shuō)明沒(méi)有存過(guò)數(shù)據(jù),直接付給00值
else
{
s1=Byte_Read(0X0001);
s2=Byte_Read(0X0002);
}
s2=s2*10;
s=s2+s1;
while(1)
{
if(ba==1){
dat=((ADCRead(7)*51)/255);
dat1=(dat*1000)/(51-dat);
for(ii=0;ii<106;ii++) {
if((dat1 <= wendu[ii][1]) && (dat1 > wendu[ii+1][1])){ //對(duì)比列表查找溫度
dat2=(wendu[ii][0]);//dat2為溫度值
ii=0;
break;
}
}
ba=0;
} //51是單片機(jī)的工作電壓,單片機(jī)的工作電壓是多少這個(gè)就是多少
if((y==0)&&(z==0)){zs=1;led((dat2*10));} //zs標(biāo)志位控制小數(shù)點(diǎn)
if(y==1){zs=0;led(s1);}
if(y==2){zs=0;led(s2);}
if(y==3){zs=0;z=0;led(s);}
if(dat2>s){out=0;}else{out=1;}
KeyRead(); //按鍵掃描
key_1();
key_2();
if(k==1)
{
Sector_Erase(0);
Byte_Program(0x0001,s1); //寫入扇區(qū)
Byte_Program(0x0002,(s2/10)); //寫入扇區(qū)
k=0;
}
}
}
//讀一字節(jié),調(diào)用前需打開(kāi)IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié)
INT8U Byte_Read(INT16U add)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打開(kāi)IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節(jié)讀命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
//EA = 0;
IAP_TRIG = WD1; //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = WD2; //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
//EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
return (IAP_DATA);
}
/*********************************************************************************************/
//字節(jié)編程,調(diào)用前需打開(kāi)IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)
void Byte_Program(INT16U add, INT8U ch)
{
IAP_CONTR = ENABLE_ISP; //打開(kāi) IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節(jié)編程命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
IAP_DATA = ch; //要編程的數(shù)據(jù)先送進(jìn)IAP_DATA 寄存器
//EA = 0;
IAP_TRIG = WD1; //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = WD2; //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
//EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
}
/*********************************************************************************************
//擦除扇區(qū), 入口:DPTR = 扇區(qū)地址 */
void Sector_Erase(INT16U add)
{
IAP_CONTR = ENABLE_ISP; //打開(kāi)IAP 功能, 設(shè)置Flash 操作等待時(shí)間
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區(qū)擦除命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設(shè)置目標(biāo)單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設(shè)置目標(biāo)單元地址的低8 位地址
//EA = 0;
IAP_TRIG = WD1; //先送 WD1,再送WD2 到ISP/IAP 觸發(fā)寄存器,每次都需如此
IAP_TRIG = WD2; //送完WD2 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
_nop_();
//EA = 1;
IAP_Disable(); //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
}
/*********************************************************************************************/
void IAP_Disable()
{
//關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
//一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)
IAP_CONTR = 0; //關(guān)閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無(wú)命令,此句可不用
IAP_TRIG = 0; //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無(wú)觸發(fā),此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
/*********************************************************************************************/
|
-
image006.jpg
(27.45 KB, 下載次數(shù): 53)
下載附件
2020-10-9 23:18 上傳
-
image008.jpg
(23.72 KB, 下載次數(shù): 58)
下載附件
2020-10-9 23:18 上傳
-
image010.jpg
(19.05 KB, 下載次數(shù): 65)
下載附件
2020-10-9 23:18 上傳
-
image014.jpg
(94.17 KB, 下載次數(shù): 65)
下載附件
2020-10-9 23:18 上傳
-
image019.jpg
(31.34 KB, 下載次數(shù): 54)
下載附件
2020-10-9 23:18 上傳
-
-
GYJ-0299_NTC測(cè)溫檢測(cè)開(kāi)關(guān)量干節(jié)點(diǎn)輸出相關(guān)資料.rar
2020-10-9 23:19 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
117.6 KB, 下載次數(shù): 48, 下載積分: 黑幣 -5
-
-
GYJ-0299_NTC測(cè)溫檢測(cè)開(kāi)關(guān)量干節(jié)點(diǎn)輸出使用說(shuō)明書.rar
2020-10-9 23:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.05 MB, 下載次數(shù): 35, 下載積分: 黑幣 -5
-
-
GYJ-0299_NTC測(cè)溫檢測(cè)開(kāi)關(guān)量干節(jié)點(diǎn)輸出原理圖.pdf
2020-10-9 23:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
103.7 KB, 下載次數(shù): 41, 下載積分: 黑幣 -5
|