/********************李想测温比较器版**************/
/******************qq:774145445********************/
/*****************快手:共同学习stm8****************/
/******************20210123************************/
// pms150g
// _______@______
// |1 vdd gnd 8|-----------------------|地
// @2|2 pa7 pa0 7|@5--dianzu100k--| |
// @1|3 pa6 pa4 6|@4--jiance20r---|--||--|
// |4_pa5____pa3_5|@3--ntc100k-----| 103
/**************************************************/
/******************************************************************************/
// 显示屏2353/188
// _2a_ ____
// | 2e 2b | |
// | | | | |
// -2f- ----
// | 2e 2c | |
// | |_2d_| |____|
// @1 @2 @3 @4 @5
// ____________________________
// | |led1|led2|led3|led4|led5|
// |_1_|_高_|_3A_|_3C_|_3E_|____|
// |_2_|_3B_|_高_|_2A_|_1B_|____|
// |_3_|_3D_|_2B_|_高_|_1A_|____|
// |_4_|_3F_|_2D_|_2C_|_高_|____|
// |_5_|_3G_|_2E_|_2F_|_2G_|_高_|
//共阳:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90//0x88,0x83,0xc6,0xa1,0x86,0x8e
//共阴:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f//0x77,0x7c,0x39,0x5e,0x79,0x71
/******************************************************************************/
#include "extern.h"
led1 bit pa.6;
led2 bit pa.7;
led3 bit pa.3;
led4 bit pa.4;
led5 bit pa.0;
jiance bit pa.4; //检测脚
dianzu bit pa.0; //标准电阻100k
ntc bit pa.3; //ntc电阻100k
void cewen(); //测温
void cewen_fangdian(); //测温放电
void cewen_js(); //测温计算出温度值
void yanshi(); //延时
void yanshi1(); //延时1
void biao1(); //表1(低于25度每度之间差值)
void biao2(); //表2(高于25度每度之间差值)
void xianshi(); //显示
void xianshi_js(); //显示计算
void biao3(); //机器码
byte temp; //温度0-99
byte xianshi_a1,xianshi_a2; //显示十位,显示个位
byte xianshi_b1,xianshi_b2; //机器码十位,机器码个位
word cewen_a1,cewen_a2,cewen_a3;
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/4 // SYSCLK=IHRC/4
//$ gpcc enable,bandgap,p_pa4; //比较器pa.4,1.2v
byte a1;
while(1)
{
cewen();
cewen_js();
xianshi_js();
a1=70;
while(a1)
{
a1--;
xianshi();
}
}
}
/**************************************************/
void cewen() //测温
{
cewen_a1 =0;
cewen_a2 =0;
/**************************************************/ //1计算标准电阻充电时间25℃
cewen_fangdian();
$ led1 in;
$ led2 in; //为了不影响测温全部设成输入
$ dianzu in;
$ jiance in;
$ ntc in;
//$ gpcc enable,bandgap,p_pa4; //开比较器1.2v,pa.4
$ gpcs vdd*21/32;
$ gpcc enable,n_r,p_pa4;
nop;nop;
$ dianzu out,high;
while(!gpcc.6)
{
cewen_a1++;
//if(cewen_a1>254){return;}
}
$ gpcc disable; //关比较器
/**************************************************/ //2计算ntc电阻充电时间
cewen_fangdian();
$ dianzu in;
$ jiance in;
$ ntc in;
//$ gpcc enable,bandgap,p_pa4; //开比较器1.2v,pa.4
$ gpcs vdd*21/32;
$ gpcc enable,n_r,p_pa4;
nop;nop;
$ ntc out,high;
while(!gpcc.6)
{
cewen_a2++;
//if(cewen_a2>54){return;}
}
$ gpcc disable; //关比较器
}
/**************************************************/
void cewen_fangdian() //测温放电
{
$ dianzu out,low;
$ jiance out,low;
$ ntc out,low;
yanshi();
}
/**************************************************/
void cewen_js() //测温计算出温度值
{
byte jisuan_a1;
word jisuan_a2;
byte jisuan_a3;
byte jisuan_a4;
cewen_a3 =0;
if(cewen_a1 < cewen_a2) //低于25度
{
cewen_a3 =cewen_a2-cewen_a1;
jisuan_a1 =0; //查表用
jisuan_a2 =0; //临时ad值
jisuan_a3 =25; //温度暂值
jisuan_a4 =1; //退出条件
while(jisuan_a4)
{
jisuan_a1 ++; //jisuan_a1不能为0
a =jisuan_a1;
biao1();
jisuan_a2 +=a; //累加器a取回的值
jisuan_a3 --;
if(cewen_a3<jisuan_a2)
{
temp =jisuan_a3; //温度值
return;
}
jisuan_a4 ++;
if(jisuan_a4>25) //退出条件以免卡死
{
jisuan_a4 =0;
temp =254;
}
}
}
else
{
cewen_a3 =cewen_a1-cewen_a2;
jisuan_a1 =0; //查表用
jisuan_a2 =0; //临时ad值
jisuan_a3 =25; //温度暂值
jisuan_a4 =1; //退出条件
while(jisuan_a4)
{
jisuan_a1 ++; //jisuan_a1不能为0
a =jisuan_a1;
biao2();
jisuan_a2 +=a; //累加器a取回的值
jisuan_a3 ++;
if(cewen_a3<jisuan_a2)
{
temp =jisuan_a3; //温度值
return;
}
jisuan_a4 ++;
if(jisuan_a4>75) //退出条件以免卡死
{
jisuan_a4 =0;
temp =254;
}
}
}
}
/**************************************************/
void biao1() //表1(低于25度每度之间差值)
{
pcadd a; //汇编指令(a>0)代替查表
ret 15; //24
ret 15; //23
ret 15; //22
ret 17; //21
ret 19; //20
ret 19; //19
ret 20; //18
ret 21; //17
ret 23; //16
ret 23; //15
ret 25; //14
ret 27; //13
ret 27; //12
ret 29; //11
ret 31; //10
ret 33; //9
ret 34; //8
ret 36; //7
ret 38; //6
ret 41; //5
ret 43; //4
ret 45; //3
ret 48; //2
ret 50; //1
ret 54; //0
}
/**************************************************/
void biao2() //表2(高于25度每度之间差值)
{
pcadd a; //汇编指令(a>0)代替查表
ret 14; //25
ret 13; //26
ret 12; //27
ret 11; //28
ret 11; //29
ret 10; //30
ret 10; //31
ret 9; //32
ret 9; //33
ret 8; //34
ret 8; //35
ret 8; //36
ret 7; //37
ret 7; //38
ret 7; //39
ret 6; //40
ret 6; //41
ret 6; //42
ret 6; //43
ret 5; //44
ret 0; //45
ret 5; //46
ret 5; //47
ret 4; //48
ret 4; //49
ret 5; //50
ret 4; //51
ret 3; //52
ret 4; //53
ret 3; //54
ret 4; //55
ret 3; //56
ret 3; //57
ret 3; //58
ret 3; //59
ret 3; //60
ret 2; //61
ret 3; //62
ret 2; //63
ret 2; //64
ret 3; //65
ret 2; //66
ret 2; //67
ret 2; //68
ret 2; //69
ret 1; //70
ret 2; //71
ret 2; //72
ret 1; //73
ret 2; //74
ret 2; //75
ret 1; //76
ret 1; //77
ret 2; //78
ret 1; //79
ret 1; //80
ret 1; //81
ret 2; //82
ret 1; //83
ret 1; //84
ret 1; //85
ret 1; //86
ret 1; //87
ret 1; //88
ret 1; //89
ret 1; //90
ret 1; //91
ret 0; //92
ret 1; //93
ret 1; //94
ret 1; //95
ret 0; //96
ret 1; //97
ret 1; //98
ret 2; //99
ret 3; //100
}
/**************************************************/
void yanshi() //延时
{
.delay 300;
}
/**************************************************/
void xianshi_js() //显示计算
{
byte temp1;
xianshi_a1 =0; //显示十位
xianshi_a2 =0; //显示个位
temp1 =temp;
while(temp1>9) //代替除法计算出十位
{
xianshi_a1 ++; //十位
temp1 -=10;
}
xianshi_a2 =temp1; //个位
if(xianshi_a1>9) //大于100显示--
{
xianshi_a1 =10;
xianshi_a2 =10;
}
a =xianshi_a1+1; //累加器a是搬运工取字模
biao3();
xianshi_b1 =a; //十位字模
a =xianshi_a2+1; //累加器a是搬运工取字模
biao3();
xianshi_b2 =a; //个位字模
}
/**************************************************/
//共阴:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
void biao3() //机器码
{
pcadd a; //汇编指令(a>0)代替查表
ret 0x3f; //0
ret 0x06; //1
ret 0x5b; //2
ret 0x4f; //3
ret 0x66; //4
ret 0x6d; //5
ret 0x7d; //6
ret 0x07; //7
ret 0x7f; //8
ret 0x6f; //9
ret 0x40; //-中杠
}
/**************************************************/ //五线数码管五种状态
void xianshi() //显示
{
/**************************************************/ //第一种
$ led1 out,high;
$ led2 in;
$ led3 in;
$ led4 in;
$ led5 in;
//if(){} //高
if(xianshi_b2.0) {$ led2 out,low;} //3a
if(xianshi_b2.2) {$ led3 out,low;} //3c
if(xianshi_b2.4) {$ led4 out,low;} //3e
//if(){} //空
yanshi1();
/**************************************************/ //第二种
$ led1 in;
$ led2 out,high;
$ led3 in;
$ led4 in;
$ led5 in;
if(xianshi_b2.1) {$ led1 out,low;} //3b
//if(){} //高
if(xianshi_b1.0) {$ led3 out,low;} //2a
//if(xianshi_c1==1) {$ led4 out,low;} //1b
//if(){}
yanshi1();
/**************************************************/ //第三种
$ led1 in;
$ led2 in;
$ led3 out,high;
$ led4 in;
$ led5 in;
if(xianshi_b2.3){$ led1 out,low;} //3d
if(xianshi_b1.1){$ led2 out,low;} //2b
//if(){} //高
//if(xianshi_c1==1){$ led4 out,low;} //1a
//if(){} //空
yanshi1();
/**************************************************/ //第四种
$ led1 in;
$ led2 in;
$ led3 in;
$ led4 out,high;
$ led5 in;
if(xianshi_b2.5){$ led1 out,low;} //3f
if(xianshi_b1.3){$ led2 out,low;} //2d
if(xianshi_b1.2){$ led3 out,low;} //2c
//if(){} //高
//if(){} //空
yanshi1();
/**************************************************/ //第五种
$ led1 in;
$ led2 in;
$ led3 in;
$ led4 in;
$ led5 out,high;
if(xianshi_b2.6){$ led1 out,low;} //3g
if(xianshi_b1.4){$ led2 out,low;} //2e
if(xianshi_b1.5){$ led3 out,low;} //2f
if(xianshi_b1.6){$ led4 out,low;} //2g
//if(){} //高
yanshi1();
}
/**************************************************/
void yanshi1() //延时1
{
.delay 3000;
}
/**************************************************/
|
|