STM32查表法读NTC并显示温度
#include "stm32f10x.h"Y' F0IZ
#include "delay.h"pU'`9fLi_
#include "sys.h"tOlzOBzR
&j
wnM
#include "led.h"|{}d5Z"5;}
#include "key.h"P"h,[{Y*>
#include "lcd1602.h"{U 9,6.`
#include "fan.h"5Fl
#include "adc.h"
#include "ntc.h"hz>yv@1
0N}
wD-
Cx1Sh#9
3qV>TE]6,
eW }jS/g`
//#include "motor.h"K_w0 oYa
//************************************************************************JVIcNK)
rwV u?W
//#define OVER_MENU10 //定义一个数字,判断这个数字是否需要退出菜单设置l,FG:"`Z@
L;(3u'
//vu8 auto_return=0;Rp4BU"&sU
=O}%bZ)Q
L{o >D"
/********************** Hhce:E@K
* 定义目录结构 * tr67ofld|
**********************/ _,-M8=dL%*
/*UU:QK{ {E
struct MenuItemw!GU~0~3[
{ hnfrnYH
unsigned char MenuCount; //当前层节点数A)`fD
%
unsigned char *DisplayString; //菜单标题Z({`9 />u
void (*Subs)(); //节点函数]aMa*fF
struct MenuItem *ChildrenMenus; ///子节点)uv$tnP*
struct MenuItem *ParentMenus; //父节点fAA@ziKg
}; :8GxcqvCWq
-^nQ^Td=j
/*********************** :O@,Z_"
* 调用子函数区 * ;r@R (Squ
********************** */ JXa%TpI:
E
/*4*2>R8SX~
void NullSubs(void) l.W 1$g
{ =w>>7u$4
Ul~}@^m]4}
}URzE 8m^
M6 >\R$
[2fiHE
gQzJ2LU(
void MotorSetPWM(void)DuCu6j
{HuLm!tCu
7!QXh;u
//不分频。PWM频率=72000000/900=80KhzsB1tce
//delay_ms(10);BrH`:Dw
TIM_SetCompare2(TIM4,100);cd%g]T)#1
2W-NCE%K)T
}f`";Q/rG
p-03V"^&
/*********************W&re;?Z{ke
@^4M~F%
//------------------------------------------------------------------------------3b/vyZF
/*********************** ;cHI3V
* 结构体区 * kk7:A0._
***********************/ /v ;Kb|e
以下为例,请根据实际情况进行修改---------------------------n[w,x;
/*CzsY=DBH=
struct MenuItem TimeMenu[4];oX]1>#5UMg
struct MenuItem UvlampMenu[4]; Q#Qu0_
struct MenuItem UvfanMenu[4];F>-@LOqHy
struct MenuItem MotorMenu[5];,ce^"yG
struct MenuItem MainMenu[5];eJ\j{-
pxnUe1=
Y,Zv0-"
struct MenuItem TimeMenu[4]=&-)Y[#\J
{//MenuCount DisplayString Subs ChildrenMenusParentMenus1kw4'#J8
{4,"1.Time Set",NullSubs,Null,MainMenu},.t%Vx
{4, "2.OFF", NullSubs,Null,MainMenu},~ai'
M#
{4, "3.ON",NullSubs,Null,MainMenu},HnY"6gTNK
{4, "4.Bak", NullSubs, MainMenu, MainMenu},DT]p14@t9
}; B]}V$*$\?
]M"'qC3g
r{jD,x2
struct MenuItem UvlampMenu[4]=Ck a]F2,
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenusNn7@+g)
{4, "1.UVlamp Set", NullSubs, Null, MainMenu},|(ju!&
{4, "2.OFF", UVlampSetOFF, Null, MainMenu},]TprPU39
{4, "3.ON", UVlampSetON, Null, MainMenu},/
{4, "4.Back", NullSubs, MainMenu, MainMenu},{hP&P
}; )P+GklI{4
'm?x2$u8
struct MenuItem UvfanMenu[4]=&_hCs![
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenusnL20}"$E
{4, "1.UVfan Set" , NullSubs, Null, MainMenu},c^gIK1f-
{4, "2.OFF", UVfanSetOFF, Null, MainMenu},D)Rf
{4, "3.ON", UVfanSetON, Null, MainMenu},z(68^-V=:
{4, "4.Back", NullSubs, MainMenu, MainMenu},Hu2g (!
}; Bzt`9lg
la 7QNQW
struct MenuItem MotorMenu[5]=F76h
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenusfR;_6?p*B
{5, "1.Motor Set", NullSubs, Null, MainMenu},ZTC1t_
{5, "2.Turnleft", MotorSetTurnleft, Null, MainMenu},]7
mSM
{5, "2.TurnRight", MotorSetTurnRight, Null, MainMenu},d+ko"F|
{5, "4.OFF", MotorSetOFF, Null, MainMenu},shvcc
{5, "5.Back", NullSubs, MainMenu, MainMenu},Y.
tFqzo3
}; y.
'Rw]
C[
struct MenuItem MainMenu[5]=3(p6ak2lv
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenus*uM*)6O3
{5, "1.Time Set" , NullSubs, TimeMenu, Null},g$LwXfg
{5, "2.UVlamp Set", NullSubs, UvlampMenu, Null},0J`/g H
{5, "3.UVfan Set", NullSubs, UvfanMenu, Null},k(+u"T
{5, "4.Motor Set", NullSubs, MotorMenu, Null},#;]F:TlR
{5, "5.Back", NullSubs, MainMenu, MainMenu},CxQ,yd;>
};>iJuR.:OO
5)
shZ
//------------------------------------------------------------------------------uNBhVsM6<
X0TGJ,yW(
/*********************** 7E)7sd
* 全局变量声明区 * +N_%|!F-c
***********************/ -Sgp,"a
/*kn|l 3+
struct MenuItem (*MenuPoint) = MainMenu; //结构体指针,指向结构体后由内部函数指针指向功能函数Z`t?kXDNoI
vu8 DisplayStart = 0; //显示时的第一个菜单项y@JYkp>I
vu8 UserChoose = 0; //用户所选菜单项LdUpVO8)l
u8 DisplayPoint = 0; //显示指针}`FPe
u8 MaxItems; //同级最大菜单数giJyMd}x
vu8 ShowCount=2; //同屏显示菜单数}dl(9H=4
+,>bpp1
/*********************** hh}EDnx
*显示函数区 * zxdO3I
***********************/ |_m;@.44?U
/*e84TLU?~
void ShowMenu(void) HArYL}l
{#Qd3A
u8 n;o#6}?g.
MaxItems = MenuPoint[0].MenuCount;//定义最大同级菜单cf!R
DisplayPoint = DisplayStart;JqZ5DjI:
for(n=0;DisplayPoint
{Pc1N~?}.
if(DisplayPoint==UserChoose)UC@ "
LCD1602_Show_Str(0,n,"->");4/|=0TC;
LCD1602_Show_Str(2,n,MenuPoint[DisplayPoint++].DisplayString);^+
mo$*KNW%\
}mNKa~E
rOT8!"
}=T]OYk
?2;G_P+
l?[DO?m+R
/***********************************************************************************/bHnQLJ
A>puk2 s
vxx3^;4p
// KeyRunScan(); 0<9TyN6
// UpdateDisplay();wQcw#
// PtcRun();uX[
"w|
// FanRun();Ui&$/%Z|
-C+vmY*@
qT4s*kqr
e hq6.+l
// Motor_Init();lOui{QU
//uart_init(115200); $Vzfhj-if
//TIM4_PWM_Init(899000,0); //不分频。PWM频率=72000000/900=8Khz4KnDXQ%
//TIM_SetCompare2(TIM4,100);%ZK}y{u\
//MotorSetTurnLeft();pxj"
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); X'm2uOEj
e+[J9;g
G
w[&P%
void ERROR_CH(void)A-FwNo2"%
{}UrtDXhA
u8 temp_N,temp_F=0;f7'%AuSQ(
temp_N=Get_Adc_Average(ADC_Channel_8,30);S SXSgp
b}:Z(L,\
if (temp_N>5000)rL=$WxdPU
{nq=fSK(
LCD1602_ClearScreen();EIRf6jL
delay_ms(10);5z_)
LCD1602_Show_Str(0, 0, "SYSTEM STOP");c
z|IBsa*
LCD1602_Show_Str(1, 0, "ERROR CODE:NTC");U VT8TN-T
$m>e!P>%u
}jo^*R'}
temp_N=0;QVpZA,
while(1)i?>"}h
{|zMQe}R@%
Ledred_pro(10);!NCT)#G`
WxFjpJt
}SxDE3A-:
// 可以增加风扇自检测试5IMH G%W7
"{k3~epYaN
} (nh!tC
=EKJ!{
RjDFc:bB
1wG1\9S
v09f#t$;5
int main(void)pqe**`z@y
{ D&shrKFx
[3.rG!Na
u32 adcx;OjN]mp-q
u16 adcx_v;1f=L8Dr
u16 adc_value_16;^tv*I~>J!
float vx;1}6pq2
wb}tN7~Y;
",}VB8K
/dfZ>k8
YblRwic
u8 adcx1[2] ={ 0,0};G 1$l %B
u8 adcx2[3] ={ 0,0,0};+FiV!nRkZ
MWl@smRh
u8 adc_vcc_1[3] ={0,0,0};JI^w1I, T
// u8 adc_vcc_2[2] ={0,0};%Y@3)
zE[c$KPP
^{s)`j'I*
Pc3u`Q L?
u16 led0pwmval=0;yhIg)/?L
delay_init(); ctZW7
%;<