⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 温湿度变送器程序
💻 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 + -