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

📄 display_dhtxx.c

📁 温湿度检测仪一套
💻 C
字号:
//ICC-AVR application builder : 2008-4-28 9:22:37
// Target : M8
// Crystal: 8.0000Mhz
/*************************************************************************
程序:6_LED
功能:湿度传感器显示板(六个数码管显示)
公司:奥松电子
芯片:M8
晶振:内部 2.0000Mhz
创建人:木工
创建时间:08.05.05
修改人:
修改时间:
修改原因:
**************************************************************************/

#include <iom8v.h>
#include <macros.h>
#include <eeprom.h> 
#include "mu_io.h"
typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable 	  无符号8位整型变量  */
typedef signed   char  S8;       /* defined for signed 8-bits integer variable		  有符号8位整型变量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable 	  无符号16位整型变量 */
typedef signed   int   S16;      /* defined for signed 16-bits integer variable 	  有符号16位整型变量 */
typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable 	  无符号32位整型变量 */
typedef signed   long  S32;      /* defined for signed 32-bits integer variable 	  有符号32位整型变量 */
typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double         F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

/**************************************************************************
                       数码管显示赋值区
***************************************************************************/
#define		_a		0x01
#define		_b		0x02
#define		_c		0x04
#define		_d		0x08
#define		_e		0x10
#define		_f		0x20
#define		_g		0x40   
#define		_dp		0x80

#define		num0		_g                     //灭的数码管
#define		num1		_a|_d|_e|_f|_g
#define		num2		_c|_f
#define		num3		_e|_f
#define		num4		_a|_d|_e
#define		num5		_b|_e
#define		num6		_b
#define		num7		_d|_e|_f|_g
#define		num8		0x00
#define		num9		_e
#define     num_        _a|_b|_c|_d|_e|_f|_dp
#define     num_11      _a|_d|_e|_f
#define     num_E       _b|_c|_dp              //13
#define     num_r       _a|_b|_c|_d|_f|_dp     //14
#define     num_N       _a|_b|_c|_d|_e|_f|_g|_dp    //15





#define     dc2         0x04
#define     dc3         0x08
#define     dd          0x03                  //数码管控制端口
#define     dd4         0x10
#define     dd5         0x20
#define     dd6         0x40
#define     dd7         0x80
#define     dd2         0x04
#define     dd3         0x08

#define     led1        dc3                  //使用时要先将数码管全熄灭掉
#define     led2        dd5
#define     led3        dd4
#define     led4        dd7
#define     led5        dd6
#define     led6        dd2
/**************************************************************************
                    I/O空间定义
***************************************************************************/
// B0_IN	DDRB &= ~(1 << PB0)		/*设置输入*/
// B0_OUT	DDRB |= (1 << PB0)		/*设置输出*/
// B0_CLR	PORTB &= ~(1 << PB0)	/*置低电平*/
// B0_SET	PORTB |= (1 << PB0)		/*置高电平*/
// B0_R	    PINB & (1 <<PB0)		/*读了电平*/
/**************************************************************************
                    通讯I/O空间定义
***************************************************************************/
 #define       COM_IN          C5_IN  
 #define       COM_OUT         C5_OUT
 #define       COM_CLR         C5_CLR
 #define       COM_SET         C5_SET
 #define       COM_R           C5_R
 
/**************************************************************************
                    全局变量定义区
***************************************************************************/
U8       i;
//U16 
//RM      为临时变量 在RC测电阻中使用      
const U8 LED[ ]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9,num_,num_11,num_E,num_r,num_N };       //数码管笔形码数组
      U8 PLAY[6]={0,0,0,0,0,0};                                             //这个数组放在SARM里
      U8    U8FLAG,k;
      U8    U8count,U8temp;
      U8    U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
      U8    U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
      U8    U8comdata;
      U16   ReceiveHighByte;
      U16   ReceiveLowByte;
/**************************************************************************
***************************************************************************/
void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0xFF;
 PORTC = 0x03;                      //m103 output only
 DDRC  = 0x0C;
 PORTD = 0x00;
 DDRD  = 0xF0;
}

void watchdog_init(void)
{
  //WDR();        //this prevents a timout on enabling
  //WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}


void init_devices(void) 
{
unsigned char i;
		   CLI();                       //disable all interrupts
     port_init();
 watchdog_init();
 
    MCUCR = 0x03;
    GICR  = 0x00;                //关外部中断0
    TIMSK = 0x00;                //关定时器1中断
           SEI();                //re-enable interrupts
                           
}

void Delay(unsigned int i)
{
	while(i--);
}
void DelayNS (U16 dly)                     //延时子程序    1.010ms
{
	U16 i;
	for ( ; dly>0; dly--)WDR();
		for (i=0; i<1131; i++);           //1131
}
void DelaymS (U16 dly)                     //延时子程序    1.010ms
{
	U16 i;
	for ( ; dly>0; dly--)
	{
	    WDR();
		for (i=0; i<280; i++);           //1131
	}
}
void Display (void)
{

for(i=0;i<=5;i++)
 {
 DDRD |= 0XFC;
 PORTD&=0x03;
 DDRC |= 0X0C;
 PORTC&=0xF3;
 Delay(1);
 
 switch(i)
 {
 case 0: PORTC|=led1;break;
 case 1: PORTD|=led2;break;
 case 2: PORTD|=led3;break;
 case 3: PORTD|=led4;break;
 case 4: PORTD|=led5;break;
 case 5: PORTD|=led6;break;
 default :break;
 }
 PORTB=LED[PLAY[i]] ;         //送数据 
 if((i==0)|(i==2)|(i==3)|(i==5))
 {
 PORTB|=0x80;
 }
 DelaymS(1);
 }
 PORTD&=0x03;
 PORTC&=0xF3;
}

void delay1N(unsigned int Dcount)  //(1u*Dcount)
{
  while(Dcount--)
  {
   NOP();
   NOP();
   NOP();
  }
}

       void  Delay_10us(void)
      {
        U8 i;                       //2M时延时为   10us
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
		i--;
        i--;
        i--;
        i--;
        i--;
        i--;
		i--;
      
       }
	
        void  COM(void)
      {
     
	        U8 i;
       for(i=0;i<8;i++)	   
	    {
		
	   	    U8FLAG=2;
	
	   	//while((!P2_0)&&U8FLAG++);
	   	while((!(COM_R))&&U8FLAG++);
		 if(U8FLAG==1)break;
			Delay_10us();
			Delay_10us();
		    Delay_10us();
	  		U8temp=0;
	     //if(P2_0)U8temp=1;
	     if(COM_R)U8temp=1;
		    U8FLAG=2;
		 //while((P2_0)&&U8FLAG++);
		   while((COM_R)&&U8FLAG++);
	   	//超时则跳出for循环		  
	   	 if(U8FLAG==1)break;
	   	//判断数据位是0还是1	 
	   	   
		// 如果高电平高过预定0高电平值则数据位为 1 
	   	 
		   U8comdata<<=1;
	   	   U8comdata|=U8temp;        //0
	     }//rof
	   
	}

	//--------------------------------
	//-----湿度读取子程序 ------------
	//--------------------------------
	//----以下变量均为全局变量--------
	//----温度高8位== U8T_data_H------
	//----温度低8位== U8T_data_L------
	//----湿度高8位== U8RH_data_H-----
	//----湿度低8位== U8RH_data_L-----
	//----校验 8位 == U8checkdata-----
	//----调用相关子程序如下----------
	//---- Delay();, Delay_10us();,COM(); 
	//--------------------------------

	void RH(void)
	{
	 
	  //主机拉低18ms 
    //P2_0=0;
       COM_OUT;
       COM_CLR;
	   //DelaymS(18);
	   DelaymS(5);
	   Display();                                //总延时22ms
	   DelaymS(5);
	   Display();      
	  //P2_0=1;
	   COM_IN;
	   COM_SET;
	  
	 //总线由上拉电阻拉高 主机延时20us
	   Delay_10us();
	   Delay_10us();
	   Delay_10us();
	   Delay_10us();
	 //主机设为输入 判断从机响应信号 
	 //P2_0=1;
	 
	 //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行	  
	  // if(!P2_0)		 //T !	 
	   if(COM_R)U8FLAG=1;
	   while(!(COM_R))		 
	   {
	   U8FLAG=2;
	 //判断从机是否发出 80us 的低电平响应信号是否结束	 
	   //while((!P2_0)&&U8FLAG++);
	   while((!(COM_R))&&U8FLAG++);
	   if(U8FLAG==1)break;
	   U8FLAG=2;
	 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
	 //while((P2_0)&&U8FLAG++);
	   while((COM_R)&&U8FLAG++);
	   if(U8FLAG==1)break;
	 //数据接收状态		 
	   COM();
	   if(U8FLAG==1)break;
	   U8T_data_H_temp=U8comdata;
	   COM();
	   if(U8FLAG==1)break;
	   U8T_data_L_temp=U8comdata; 
	   COM();
	   if(U8FLAG==1)break;
	   U8RH_data_H_temp=U8comdata;
	   COM();
	   if(U8FLAG==1)break;
	   U8RH_data_L_temp=U8comdata;
	   COM();
	   if(U8FLAG==1)break;
	   U8checkdata_temp=U8comdata;
	   break;
	    }//while
	   //P2_0=1;
	   COM_IN;
	   COM_SET;
	 //数据校验 
	 
	   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
	   if(U8temp==U8checkdata_temp)
	   {
	   	  U8T_data_H=U8T_data_H_temp;
	   	  U8T_data_L=U8T_data_L_temp;
	   	  U8RH_data_H=U8RH_data_H_temp;
	   	  U8RH_data_L=U8RH_data_L_temp;
	   	  U8checkdata=U8checkdata_temp;
	   }//fi
	  
	  
	   COM_IN;
	   COM_SET;

	}
	void  Display_data(void) 
	{
		   if(U8FLAG==1)
		   {
		         PLAY[0] = 12;
				 PLAY[1] = 13;
				 PLAY[2] = 13;

				 PLAY[3] = 12;
				 PLAY[4] = 13;
				 PLAY[5] = 13;
		   }//fi
		else
		{
		    ReceiveHighByte=U8T_data_H;
	       ReceiveHighByte<<=8;
	       ReceiveHighByte|=U8T_data_L;
	       ReceiveLowByte=U8RH_data_H;
	       ReceiveLowByte<<=8;
	       ReceiveLowByte|=U8RH_data_L;
	     
	       
		 if(ReceiveHighByte&0x8000)
			   	{
			   	 ReceiveHighByte&=0x7fff;  //清负数标志
			   	 if(ReceiveHighByte>=199)
			   	 	{
			   PLAY[3] = 11;
			   PLAY[4] = 9;
			   PLAY[5] = 9;
			   	 	}//fi
			   	 else if(ReceiveHighByte>=100)
			   	 	{ 
			   PLAY[3] = 11;
			   PLAY[4] = ReceiveHighByte%100/10;
			   PLAY[5] = ReceiveHighByte%10;
			   	 	} //esle if
			   	 else  
			   	 	{
			   PLAY[3] = 10;
			   PLAY[4] = ReceiveHighByte%100/10;
			   PLAY[5] = ReceiveHighByte%10;
			   	 	}  //esle
			   	 	
			   	} //fi
			   else
			   	{
			   PLAY[3] = ReceiveHighByte/100;
			   PLAY[4] = ReceiveHighByte%100/10;
			   PLAY[5] = ReceiveHighByte%10;
			     if(ReceiveHighByte<100)
			   {
			   	PLAY[3]=14;
			   }
			   	} //esle
			   	
			   PLAY[0] = ReceiveLowByte/100;           //湿度 
			   PLAY[1] = ReceiveLowByte%100/10;
			   PLAY[2] = ReceiveLowByte%10;
			   if(ReceiveLowByte<100)
			   {
			   	PLAY[0]=14;
			   }
			   
			}//esle
		
	}
	
/**************************************************************************



                            主函数
							
							
							
							
**************************************************************************/




 void main(void)
{

 init_devices() ;
 COM_IN;
 COM_SET;
 while(1)
 {
 
  RH();
  Display_data();
  Display();       
  //延时2S
  
  for(U8temp=0;U8temp<200;U8temp++)
  {
  DelaymS(5);
  Display();
  }//rof
 
 }
 
}




 






 
 
 

⌨️ 快捷键说明

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