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

📄 output.c

📁 AVRMEG32编写的一个项目代码,里面包含一般应用的模块.
💻 C
字号:
#include <avr/io.h>
#include "output.h"
#include "includes.h"

static u08 DAT1 = 0x00;//保持第一片165原状态

//设置IO口方向寄存器
void outputInit(void)
{
    //设置输出:595 串行数据输出 SER
    sbi(SER_DDR,SER_DAT);

	//设置输出:595 串行时钟 CLK
	sbi(SER_DDR,SER_SCLK);

	//设置输出:595 锁存信号 RCLK
	sbi(SER_DDR,SER_RCLK);
}


//向595输入一个字节,级联要一个一个输
void ser_out(u08 dat)
{
	u08 i=0;
	for(i=0; i<8;i++)
	{
		SER_PORT&=~BV(SER_SCLK);
		_nop_();
		if(dat & 0x80)
			SER_PORT|=BV(SER_DAT);//发送 1
		else
			SER_PORT&=~BV(SER_DAT);//发送 0
		SER_PORT|=BV(SER_SCLK);//发送写脉冲,上升沿发生移位
		SER_PORT&=~BV(SER_SCLK);//发送写脉冲
		dat<<=1;
	}
}

//Control 595 output two bytes
void ser_output(void)
{
    SER_PORT&=~BV(SER_RCLK);
	_nop_();
	_nop_();
	_nop_();
	SER_PORT|=BV(SER_RCLK);//上升沿将数据送到输出锁存器
	SER_PORT&=~BV(SER_RCLK);
}

//控制继电器输出
void control_open(u08 open_real_1,u08 open_real_0 )
{
	 DAT1 = (DAT1 | open_real_0);
     ser_out(open_real_1);
	 ser_out(DAT1);
     ser_output();
}

//控制继电器关闭
void control_close(u08 close_real_1, u08 close_real_0 )
{
 	 DAT1 = (DAT1 & (~close_real_0));
     ser_out(close_real_1);
     ser_out(DAT1);
     ser_output();
}

void temperature(u08 num)
{
	switch(num)
	{
	 case SAMTYPE_WENSHIDU1 ://选择第一路温湿度
          ser_out( R4052_DATA3_1);
          ser_out( R4052_DATA3_0 | DAT1 );
          break;
    case SAMTYPE_WENSHIDU2 ://选择第二路温湿度
          ser_out( R4052_DATA3_1);
          ser_out( R4052_DATA3_0 | DAT1 );
          break;
	 case SAMTYPE_WENSHIDU3 ://选择第三路温湿度
 	      ser_out( R4052_DATA4_1);
	      ser_out( R4052_DATA4_0 | DAT1 );
	      break;
     default:
          break;
    }
	 //Control 595 output two bytes
	 ser_output();
}

//选择48V电流
void A_48(void)
{
  	 ser_out( R4051_DC_A_1);
	 ser_out( R4051_DC_A_0 | DAT1 );
  	 //Control 595 output two bytes
	 ser_output();
}

//选择48V电压
void V_48(void)
{
 	 ser_out( R4051_DC_V_1);
	 ser_out( R4051_DC_V_0 | DAT1 );
  	 //Control 595 output two bytes
	 ser_output();
}

//选择220V电流
void A_220(void)
{
 	  ser_out( R4051_AC_A_1);
	  ser_out( R4051_AC_A_0 | DAT1 );
   	  //Control 595 output two bytes
	  ser_output();
}

//选择220V电压
void V_220(void)
{
 	 ser_out( R4051_AC_V_1);
	 ser_out( R4051_AC_V_0 | DAT1 );
  	 //Control 595 output two bytes
	 ser_output();
}

//检测温湿度
void do_temperature_humidity(u08 num)
{
    s16 humidity1[1];//第一路温湿度
	s16 temperature1[1];
    s16 humidity2[1];//第二路温湿度
	s16 temperature2[1];
    s16 humidity3[1];//第三路温湿度
	s16 temperature3[1];
//选择第一路温湿度
	if(num == SAMTYPE_WENSHIDU1)
	{   
		//取值,要除以100
        if(write_mode(SHT_TEMPERATURE) == 0)
        {
			temperature1[0] = ShtMeasure();
            if(write_mode(SHT_HUMIDITY) == 0)
            {
		        humidity1[0] =ShtMeasure();
                ShtCalculate( temperature1,  humidity1 );
                if(xRwenshiData[SAMTYPE_WENSHIDU1].DCwenshiDelete_FLAG!=0xAA)
                {
                    xRwenshiData[SAMTYPE_WENSHIDU1].DCwenshiDelete_FLAG++;
                    if(xRwenshiData[SAMTYPE_WENSHIDU1].DCwenshiDelete_FLAG>1)
                        xRwenshiData[SAMTYPE_WENSHIDU1].DCwenshiDelete_FLAG=0xAA;
                }
				else
				//温湿度还原、处理
				{
                  //xRwenshiData[SAMTYPE_WENSHIDU1].DCwenshiducaiji_FLAG=0xAA;
                    input_sht(temperature1,  humidity1 ,SAMTYPE_WENSHIDU1);
	                xRwenshiData[SAMTYPE_WENSHIDU1].DCwenshiDelete_FLAG=0x00;
                }
	           // rprintf("\r\nTest temperature:%d",temperature[0]);
	           // rprintf("\r\nTest humidity  :%d",humidity[0]);
			}
			else
			    ShtReset();
			    ShtInit();
        }
        else
            ShtReset();
            ShtInit();
    }
//选择第二路温湿度
   	if(num == SAMTYPE_WENSHIDU2)
	{
		//读取温湿值,要除以100
        if(write_mode(SHT_TEMPERATURE) == 0)
        {
			temperature2[0] = ShtMeasure();
            if(write_mode(SHT_HUMIDITY) == 0)
            {
		        humidity2[0] =ShtMeasure();
                ShtCalculate( temperature2,  humidity2 );
                if(xRwenshiData[SAMTYPE_WENSHIDU2].DCwenshiDelete_FLAG!=0xAA)
                {
                    xRwenshiData[SAMTYPE_WENSHIDU2].DCwenshiDelete_FLAG++;
                    if(xRwenshiData[SAMTYPE_WENSHIDU2].DCwenshiDelete_FLAG>1)
                        xRwenshiData[SAMTYPE_WENSHIDU2].DCwenshiDelete_FLAG=0xAA;
                }
				else
				//温湿度还原、处理
				{
                   // xRwenshiData[SAMTYPE_WENSHIDU2].DCwenshiducaiji_FLAG=0xAA;
					input_sht(temperature2,  humidity2 ,SAMTYPE_WENSHIDU2);
	                xRwenshiData[SAMTYPE_WENSHIDU2].DCwenshiDelete_FLAG=0x00;
                }
	           // rprintf("\r\nTest temperature:%d",temperature[0]);
	           // rprintf("\r\nTest humidity  :%d",humidity[0]);
			}
			else
			    ShtReset();
			    ShtInit();
        }
        else
            ShtReset();
            ShtInit();
    }
//选择第三路温湿度
	if( num == SAMTYPE_WENSHIDU3)
	{
	    //读取温湿值,要除以100
        if(write_mode(SHT_TEMPERATURE) == 0)
        {
			temperature3[0] = ShtMeasure();
            if(write_mode(SHT_HUMIDITY) == 0)
            {
		        humidity3[0] =ShtMeasure();
                ShtCalculate( temperature3,  humidity3);
 				if(xRwenshiData[SAMTYPE_WENSHIDU3].DCwenshiDelete_FLAG!=0xAA)
                {
                    xRwenshiData[SAMTYPE_WENSHIDU3].DCwenshiDelete_FLAG++;
                    if(xRwenshiData[SAMTYPE_WENSHIDU3].DCwenshiDelete_FLAG>1)
                        xRwenshiData[SAMTYPE_WENSHIDU3].DCwenshiDelete_FLAG=0xAA;
                }
				else
				//温湿度还原、处理
				{
                  //  xRwenshiData[SAMTYPE_WENSHIDU3].DCwenshiducaiji_FLAG=0xAA;
					input_sht(temperature3,  humidity3 ,SAMTYPE_WENSHIDU3);
	                xRwenshiData[SAMTYPE_WENSHIDU3].DCwenshiDelete_FLAG=0x00;
                }
	         // rprintf("\r\nTest temperature1:%d",temperature1[0]);
           	 // rprintf("\r\nTest humidity1  :%d",humidity1[0]);
			}
			else
			    ShtReset();
			    ShtInit();
        }
        else
            ShtReset();
            ShtInit();
	}
}
/*void lingmindu(u08 num)
{
     if(xROfenData[SAMTYPE_WENSHIDU1].DCDelete_FLAG!=0xAA)
     {
         xROfenData[SAMTYPE_WENSHIDU1].DCDelete_FLAG++;
         if(xROfenData[SAMTYPE_WENSHIDU1].DCDelete_FLAG>1)
             xROfenData[SAMTYPE_WENSHIDU1].DCDelete_FLAG=0xAA;
     }
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -