📄 main.c
字号:
#include "cdltwk.h"
bit read_sht_flag; //读SHT10标志
bit time_1s_flag;
//=1, 温湿度传感器损坏标志
void sht10_samp();
void rdsht10_state();
uchar Counter;
uchar temp_h_h; //温度pwm转换高电平高位字节
uchar temp_h_l; //温度pwm转换高电平的低位字节
uchar temp_l_h; //温度pwm转换低电平的高位字节
uchar temp_l_l; //温度pwm转换低电平的高低字节
uint temp_pwm_H; //温度高电平字
uint temp_pwm_L; //温度低电平字
ulong temp_m;
ulong rh_m;
uchar rh_h_h; //湿度pwm转换高电平高位字节
uchar rh_h_l; //湿度pwm转换高电平低位字节
uchar rh_l_h; //湿度pwm转换低电平高位字节
uchar rh_l_l; //湿度pwm转换低电平低位字节
uint rh_pwm_H; //湿度高电平字
uint rh_pwm_L; //湿度低电平字
uchar start_flag,uart_rcv_flag;
void pwm_Init();
void pwm_out();
void PCA_Initiate();
void pca_temr();
void mach_t();
void mach_rh();
void pwm_rh_out();
void UART_out_temp(void);
void UART_out_rh(void);
void UART_out();
//-----------------------------------------------------------------------------
/*void UART_INI(void)
{
TMOD=0X21; //则T0设为16位定时器
ET0=1; //开t0中断
//TR0=1; //开定时器0
P3M1=0x30; //设P3.4,P3.5推挽输出
TH0 = 0xDC;
TL0 = 0xD8;
temp_h_h = 0xDC;
temp_h_l = 0xD8;
temp_l_h = 0xDC;
temp_l_l = 0xD8;
#pragma asm
CLR P3.4
CLR P3.5
#pragma endasm
SCON = 0x50;
TMOD = 0x21;
TH1 = 0xFE;
TL1 = 0xFE;
PCON|=0x80;
TR1 = 1;
//PS = 1;
//ES =1 ;
TR0=1;
EA =1; //开t1,t0中断
}*/
main()
{
// uint k;
//uchar temp[4];
pwm_Init();
//UART_INI();
PCA_Initiate();
//rdsht10_state();
while(1)
{ //uart_send_byte(0X31);
sht10_samp();
//mach_t();
//mach_rh();
//UART_out();
//for(k=0;k<40000;k++);
//uart_send_byte(out_temp/256);
//uart_send_byte(out_temp);
//for(k=0;k<40000;k++);
// temp[0]=out_temp/1000;
// temp[1]=out_temp/100%10;
// temp[2]=out_temp/10%10;
// temp[3]=out_temp%10;
// uart_send1(temp,4);
//for(k=0;k<40000;k++);
}
}
void mach_t(void)
/******************************************************************************
功能 : 计算温度转换成对应的脉宽
入口 : out_temp
出口 : temp_pwm_H,temp_pwm_L
******************************************************************************/
{
//temp_m=(out_temp+200)*32/5*2+2880; //计算温度电流ma数有2位小数 电阻是200
//temp_m=(out_temp+200)*16/5*3+2160; //计算电流脉宽100赫兹记数值 电阻是200
temp_m=(out_temp+179)*24/5+1080; //电阻是100 temp_m=(out_temp+200)*24/5+1080;
temp_pwm_H=65536-temp_m; //高电平定时器记数值
//temp_pwm_L=65536-(18000-temp_m);//低电平定时器记数值
temp_pwm_L=65536-(13500-temp_m);//低电平定时器记数值
#pragma asm
MOV R0,#temp_pwm_H
MOV A,@R0
MOV temp_h_h,A
INC R0
MOV A,@R0
MOV temp_h_l,A
MOV R0,#temp_pwm_L
MOV A,@R0
MOV temp_l_h,A
INC R0
MOV A,@R0
MOV temp_l_l,A
#pragma endasm
}
void mach_rh(void)
/******************************************************************************
功能 : 计算湿度转换成对应的脉宽
入口 : wb_rh
出口 :
******************************************************************************/
{
//temp_m=out_rh*32/25*9+2880; //电阻是200
//temp_m=out_rh*27/25*8+2160; //电阻是200
temp_m=(out_rh+50)*27/5*4/5+1080; //电阻是100 +30相当于实际湿度加3
rh_pwm_H=65536-temp_m;
//rh_pwm_L=65535-(18000-temp_m);
rh_pwm_L=65535-(13500-temp_m);
#pragma asm
MOV R0,#rh_pwm_H;
MOV A,@R0
MOV rh_h_h,A
INC R0
MOV A,@R0
MOV rh_h_l,A
MOV R0,#rh_pwm_L
MOV A,@R0
MOV rh_l_h,A
INC R0
MOV A,@R0
MOV rh_l_l,A
#pragma endasm
}
void pwm_Init(void)
/******************************************************************************
Function : void Initpwm()
Parameters : (void)
Description: Initializes Sound Studio
******************************************************************************/
{
ES = 0; //关串行通讯中断
TMOD=0X11; //则T1,与T0 都设为16位定时器
IE=0x8a; //开t1,t0中断
TCON=0x55; //开定时器
P3M1=0x30; //设P3.4,P3.5推挽输出
#pragma asm
CLR P3.4
CLR P3.5
#pragma endasm
TH0 = 0xFB;
TL0 = 0xC8;
TH1 = 0xFB;
TL1 = 0xC8;
temp_h_h = 0xFB;
temp_h_l = 0xC8;
temp_l_h = 0xCF;
temp_l_l = 0x7C;
rh_h_h = 0xFB;
rh_h_l = 0xC8;
rh_l_h = 0xCF;
rh_l_l = 0x7C;
/* TMOD=0x21;// SET T1 8 BYTE TIMR MODE 如果 TMOD=0X11 //则T1,与T0 都设为16位定时器
TCON=0x5 ;// SET T0 16 BYTE TIMR MODE
SCON=0x50;// SET SCON 1 ren on IE=0x8a //开t1,t0中断
PCON=0x80;// SMOD=0 XTAL= 18.432 TCON=0x55 //开定时器
TH1=0xF6;// SET T1 9600 bit band
TL1=0xF6;// new value fah old fdh
TR1=1;// on T1
EA =1 ; // on intrrupt
ES =1 ;
ET0 =1 ;
TR0 =1 ; */
}
/**********************************************************************************
定时器 0
温度pwm脉宽输出中断服务程序
温度的脉宽值高电平在;temp_h_h+temp_h_l中
温度的脉宽值低电平在;temp_l_h+temp_l_l中
转换频率100赫兹
***********************************************************************************/
void pwm_out(void) interrupt 1 using 0
{
#pragma asm
PWM:
Jb p3.4,pwm1_L
CPL P3.4
CLR TR0
MOV TH0,temp_h_h
MOV TL0,temp_h_l
SETB TR0
RETI
pwm1_L: CPL p3.4
CLR TR0
MOV TH0,temp_l_h
MOV TL0,temp_l_l
SETB TR0
RETI
#pragma endasm
}
/**********************************************************************************
定时器1
湿度pwm脉宽输出中断服务程序
湿度的脉宽值高电平在;rh_h_h+rh_h_l中
湿度的脉宽值低电平在;rh_l_h+rh_l_l中
转换频率100赫兹
***********************************************************************************/
void pwm_rh_out(void) interrupt 3 using 0
{
#pragma asm
PWM_rh:
Jb p3.5,pwm2_L
CPL P3.5
CLR TR1
MOV TH1,rh_h_h
MOV TL1,rh_h_l
SETB TR1
RETI
pwm2_L: CPL p3.5
CLR TR1
MOV TH1,rh_l_h
MOV TL1,rh_l_l
SETB TR1
RETI
#pragma endasm
}
void PCA_Initiate(void)
/******************************************************************************
PCA定时器模块初始化程序
*******************************************************************************/
{
//TMOD=0X11 //则T1,与T0 都设为16位定时器
//IE=0x8a //开t1,t0中断
//TCON=0x55 //开定时器
#pragma asm
MOV CMOD,#10000000B //;PCA空闲模式下记数器停止工作
//;PCA fosc/12
//;禁止PCA记数溢出中断
MOV CCON,#0 //;CF=0 清记数中断标志
//CR=0 停记数器
//;清 PCA 各模块中断标志 CCF1=0 CCF0=0
MOV CL,#0
MOV CH,#0 //;清PCA记数器
MOV CCAP0L,#0
MOV CCAP0H,#3CH
MOV CCAPM0,#49H //;设置pca 模块0为16位定时器 ECCF0=1,允许pca模块0中断
//;当[CCAP0H,CCAP0L]=[CH,CL]中断发生
SETB EPCA_LVD //;开中断
SETB CR //;开PCA 记数(CH,CL)
#pragma endasm
}
/*****************************************************************************
PCA定时器模块中断服务程序
设定10ms中断一次,中断100次1秒钟
Counter存中断记数值
18.432/12=15360=3C00h
Channe_10mS_H=3CH
Channe_10mS_L=0
******************************************************************************/
void pca_temr(void) interrupt 6 using 0
{
#pragma asm
PUSH ACC
PUSH PSW
//;18.432/12=15360=3C00h
// ;Channe_10mS_H=3CH
MOV A,#24H //MOV A,#3CH //;Channe_10mS_L=0
ADD A,CCAP0H
MOV CCAP0H,A
CLR CCF0
INC Counter
MOV A,Counter
CLR C
SUBB A,#100
JC PCA_Interrupt_Exit
MOV Counter,#0
SETB time_1s_flag
SETB read_sht_flag
CLR P1.2
PCA_Interrupt_Exit:
POP PSW
POP ACC
RETI
#pragma endasm
}
/*void uart_isr(void) interrupt 4 using 3
{
uchar tmp;
if (RI)
{
RI = 0;
tmp = SBUF;
if (tmp == 0) //帧头
{
start_flag = 1;
uart_rcv_flag = 0;
}
else if (start_flag)
{
switch (uart_rcv_flag)
{
case 0:temp_h_h = 65536 - tmp * 3;
uart_rcv_flag = 1;
break;
case 1:temp_l_h = 65536 - tmp;
start_flag = 0;
break;
}
}
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -