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

📄 znjh.c

📁 1.atmegal 16单片机程序。编译环境为codevisionAVR C, 1)单总线方式采集温湿度。 2)A/D转换 3)屏幕显示和LED灯闪烁。 4)按键控制
💻 C
📖 第 1 页 / 共 4 页
字号:
	if ( flag == INTER ) {
		sprintf(str,"室内:%d.%d  %d.%d",a,b,c,d);
		lcd_str(0,str);
	} else {
		sprintf(str,"室外:%d.%d  %d.%d",a,b,c,d);
		lcd_str(1,str);
	}
}


/////////////////////
//------------------------------串口---------------------------------------------------
//****************************************************************************
//
// 下面这些函数是使能串口 UART,并从串口发送接收数据,不同的硬件串口,程序都是类似的,只要改一下相应的硬件参数即可
//
//****************************************************************************


//****************************************************************************
//
// UARTEnable 设置串口UART,并使能
//
//****************************************************************************
#define RXEN 4 //Receiver Enable
#define TXEN 3 //Transmitter Enable
#define RXCIE 7  // 
#define UDRIE 5  //
#define USBS 3 //Bit 3 - USBS: Stop Bit Select 0: 1位停止位  1: 2位停止位
#define UCSZ0 1 //定义数据位大小
#define UCSZ1 2
#define UCSZ2 2 //Register B 第二位
/*UCSZ2 UCSZ1 UCSZ0 Character Size
   0     0     0        5-bit
   0     0     1        6-bit
   0     1     0        7-bit
   0     1     1        8-bit
   1     0     0        (reserved)
   1     0     1        (reserved)
   1     1     0        (reserved)
   1     1     1        9-bit
*/ 
#define UPM0 4  //Register C,奇偶校验模式
#define UPM1 5  
/*
  UPM1  UPM0   Parity Mode
   0     0      Disabled
   0     1      (Reserved)
   1     0      Enabled, Even Parity
   1     1      Enabled, Odd Parity
*/
  

#define URSEL 7 

/*
unsigned char UARTEnable(void)
{
	// USART0 initialization
	// Communication Parameters: 8 Data, 1 Stop, No Parity
	// USART0 Receiver: On
	// USART0 Transmitter: On
	// USART0 Mode: Asynchronous
	// USART0 Baud rate: 19200
	//波特率计算 Baud = FCK/(16*(UBRR+1))

	UCSRA=0x00;	
	// Enable receiver and transmitter 
	//UCSR0B=0x18;
	UCSRB = (1<<RXEN)|(1<<TXEN);
	// Set frame format: 8data, 1stop bit 
	//UCSR0C=0x06;
	UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);
	UBRRH = 0x00;
	UBRRL = 0x19;//12;//0x19;  //4M时钟时,0x0c是19200, 0x19是9600 
	return 0;
}


//****************************************************************************
//
// UARTSendChar 发送一个字符到串口 UART.
//
//****************************************************************************      


#define UDRE 5  //Data Register Empty (UDRE) flag.

unsigned char  UARTSendChar(unsigned char cChar)
{
	if  ( !( UCSRA & (1<<UDRE)) ) return 0;	
	UDR = cChar;
	return 1;
}


//****************************************************************************
//
// UARTReceiveChar 从串口 UART 接收字符
//
//****************************************************************************

#define RXC 7 //Receive Complete (RXC) flag.
#define FE 4
#define DOR 3
#define PE 2
unsigned char UARTReceiveChar(unsigned char *nChar)
{
	unsigned char i;

	unsigned char ucsra_1;

	ucsra_1 = UCSRA;

	if  ( !(ucsra_1 & (1<<RXC)) ) return 0;

	if ( (ucsra_1 &(1<<FE)) != 0 ) {
		i = 0;
		*nChar = UDR;
		return 0;
	}
	if ( (ucsra_1 &(1<<DOR)) != 0 ) {
		i = 1;
		*nChar = UDR;
		return 0;
	}
	if ( (ucsra_1 &(1<<PE)) != 0 ) {
		i = 2;
		*nChar = UDR;
		return 0;
	}

	//if  ( !(UCSRA & (1<<RXC)) ) return 0;
	//if  ( !(ucsra_1 & (1<<RXC)) ) return 0;

	*nChar = UDR;
	return 1;
}
*/

unsigned char UARTEnable_INT(void)
{
	// USART0 initialization
	// Communication Parameters: 8 Data, 1 Stop, No Parity
	// USART0 Receiver: On
	// USART0 Transmitter: On
	// USART0 Mode: Asynchronous
	// USART0 Baud rate: 19200
	//波特率计算 Baud = FCK/(16*(UBRR+1))

	SREG &= 0x7f;

	UCSRA=0x00;	
	/* Enable receiver and transmitter */
	//UCSR0B=0x18;
	UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<UDRIE);
	/* Set frame format: 8data, 1stop bit */
	//UCSR0C=0x06;
	UCSRC = (0<<USBS)|(3<<UCSZ0);
	UBRRH=0x00;//0x00;
	//UBRRL=71;//外接11.0592MHz的晶振,71为9600.	        
	//UBRRL=0x19; //4M时钟时,0x0c是19200, 0x19是9600, 51:4800, 103:2400
    UBRRL=12; //1M时钟时,12为4800,6为9600

	SREG |= 0x80;
	return 0;

}


interrupt [USART_RXC] void usart_rxc(void)
{ 
   unsigned char inChar;

   inChar = UDR;
   recvnum++;

   if ( (inhead+1) != intail ) {
		if ( inhead==intail && inChar=='\n' ) return;
		inbuf[inhead] = inChar;
		inhead = (inhead+1)%SIZE_OF_INBUF;
   }
}  


interrupt [USART_DRE] void usart_dre(void)
{ 
	unsigned char cChar;

	if ( outtail != outhead ) {
		   cChar = outbuf[outtail];
		   outtail = ( outtail+1)%SIZE_OF_OUTBUF;
		   UDR = cChar;
	}
	else {
		   UCSRB &= ~(1<<UDRIE);
	}
}  


//进风、出风接口
#define __wind_port PORTA.1
#define __wind_ddr  DDRA.1
//空调降温接口
#define __aircon_letdown_port PORTA.2
#define __aircon_letdown_ddr  DDRA.2
//空调升温接口
#define __aircon_rise_port PORTA.3
#define __aircon_rise_ddr  DDRA.3

//加湿接口
#define __addhumi_port PORTA.4
#define __addhumi_ddr  DDRA.4
//除湿接口
#define __clearhumi_port PORTC.0
#define __clearhumi_ddr  DDRC.0


void ctrl_init(void)
{
	__wind_ddr = OUT;
	__wind_port = 0; //低电平停

	__aircon_rise_ddr = OUT;
	__aircon_rise_port = 0; //低电平停

	__aircon_letdown_ddr = OUT;
	__aircon_letdown_port = 1; //高电平停 2004.7.13

	__addhumi_ddr = OUT;
	__addhumi_port = 0; //低电平停

	__clearhumi_ddr = OUT;
	__clearhumi_port = 0; //低电平停

}

void all_init(void)
{	
	ctrl_init();
	lcd_init();
    InitTimer0();
}

										

struct SYSPRM{
	unsigned char nTemp;
	unsigned char nTempHigh;
	unsigned char nTempLow;
	unsigned char nTempDualOn;
	//unsigned char nRiseNum;
	//unsigned char nLetdownNum;
	//unsigned char nDelayNum;
	unsigned char nHumidity;
	unsigned char nHumiLow;
	unsigned char nHumiHigh;
    unsigned int  nTempAirconTimer;
	unsigned int  nTempAirconAllTimer;
    unsigned int  nTempWindTimer;
	unsigned int  nTempWindAllTimer;
    unsigned int  nHumiTimer;
	unsigned int  nHumiAllTimer;
	unsigned char nNotRunDay;  //未运行天数.当 sysprm.nNotRunDay等于10时,为输出调试信息
	unsigned char nRunDelay;   //运行时长	
	unsigned char nWindDevice;   //风扇设备 0:正常 1:停用
	unsigned char nLetDownDevice;
	unsigned char nRiseDevice;
	unsigned char nAddHumiDevice;
	unsigned char nClearHumiDevice;

	char tel1[14];
	char tel2[14];
	//char tel3[14];
	char password[8];
	char version[6];
}sysprm;

          
void WriteSysPrm(void);
void ReadSysPrm(void)
{
	unsigned char eeprom *ptr_to_eeprom;
	unsigned char *ptr_to_ram; 
	int i;

	ptr_to_eeprom = (unsigned char eeprom *)(0);
	ptr_to_ram = (unsigned char *)&sysprm;
	for (i=0;i<sizeof(struct SYSPRM);i++) {
		*ptr_to_ram = *ptr_to_eeprom;
		ptr_to_ram++;
		ptr_to_eeprom++;
	}

	//检验数据有效性
	if ( sysprm.nTemp >= 50 || sysprm.nTemp < 10) {
		sysprm.nTemp = 32;         
	}
}


void WriteSysPrm(void)
{
	unsigned char eeprom *ptr_to_eeprom;
	unsigned char *ptr_to_ram; 
	int i;

	ptr_to_eeprom = (unsigned char eeprom *)(0);
	ptr_to_ram = (unsigned char *)&sysprm;
	for (i=0;i<sizeof(struct SYSPRM);i++){
		*ptr_to_eeprom = *ptr_to_ram;
		ptr_to_ram++;
		ptr_to_eeprom++;
    }
}

/*
void SetCalibration(void)
{
	unsigned char eeprom *ptr_to_eeprom;
	unsigned char a;

	ptr_to_eeprom = (unsigned char eeprom *)(0);
	a = *ptr_to_eeprom;
	OSCCAL = 0x02;//a;
}
*/

//错误号
#define ERROR_ADDHUMI_INVALID 0
#define ERROR_ADDHUMI_SLOW 1
#define ERROR_CLEARHUMI_INVALID 2
#define ERROR_CLEARHUMI_SLOW 3
#define ERROR_WIND_LETDOWN_INVALID 4
#define ERROR_WIND_LETDOWN_SLOW 5
#define ERROR_WIND_RISE_INVALID 6
#define ERROR_WIND_RISE_SLOW 7
#define ERROR_AIRCON_LETDOWN_INVALID 8
#define ERROR_AIRCON_LETDOWN_SLOW 9
#define ERROR_AIRCON_RISE_INVALID 10
#define ERROR_AIRCON_RISE_SLOW 11
#define ERROR_SENSOR 12
#define ERROR_LETDOWN_BAD 13
#define ERROR_RISE_BAD 14
#define ERROR_WIND_BAD 15
#define ERROR_ADDHUMI_BAD 16
#define ERROR_CLEARHUMI_BAD 17

#define ERROR_NO_ERROR  255

#define SERIOUS_ALARM 0
#define NORMAL_ALARM 1
#define SLIGHT_ALARM 2

void SendAlarm(unsigned char AlarmID,unsigned char AlarmType,char *info)
{
	sprintf(str,"%d+%d+%d+%02d%02d+%s\r",COM_Alarm,AlarmID,AlarmType,t.hour,t.minute,info);
	put_buf(str);
	//proc_send();

    if( AlarmID == ERROR_LETDOWN_BAD || AlarmID == ERROR_RISE_BAD ||
		AlarmID == ERROR_WIND_BAD || AlarmID == ERROR_ADDHUMI_BAD || AlarmID == ERROR_CLEARHUMI_BAD ) return;

	__errled_port = 1;

//	sprintf(AlarmInfo[alarmpos].date,"%02d/%02d %02d:%02d",t.month,t.date,t.hour,t.minute);
//	AlarmInfo[alarmpos].nAlarmID = AlarmID;
//	alarmpos = (alarmpos+1)%MAX_ALARMINFO_NUM;
//	alarmnum++;
//	if ( alarmnum >= MAX_ALARMINFO_NUM ) alarmnum = MAX_ALARMINFO_NUM;
}

    
unsigned char get2438(unsigned char flag);   //取内部温湿度传感器值函数 
void ReadSensor(void);
//void proc_user_interface(void);
void data_init(void);
void proc_recv(void);
int SeperateStr(char *src,int pos,char *dest,int destsize);
void DeviceCheck(void);

//add 2005.5.8-----------
unsigned long RecvMsgCount=0;    //五分钟收不到消息即复位ETR186 ,即
                                 //计数达到300次即复位ETR186。
unsigned long StartResetCount=0;  //开始复位时间点


void ResetEtr186(void)
{     
	__aircon_letdown_ddr = OUT;
	__aircon_letdown_port = 0; //高电平停 2004.7.13
	delay_ms(20);                                
	__aircon_letdown_port = 1; //高电平停 2004.7.13	
}


void QueryEtr186(void)
{
	if ( nSecondCount > RecvMsgCount + 300 ) {
		//开始点复位灯
		StartResetCount = nSecondCount;
		SetOnResetLed();

		//复位ETR186
		RecvMsgCount = nSecondCount;
		ResetEtr186();

	} else {
		//过了1分钟,灭复位灯
		if ( nSecondCount> StartResetCount+ 60 ) { //一分钟
			//灭复位灯
			StartResetCount = nSecondCount;			
			SetOffResetLed();						
		}
	}	
}

void ProcessComLed(void)
{
	static unsigned char ledflag=0;
	if ( ledflag == 0 ) {
		if ( procnum != recvnum ) {
			procnum++;
			ledflag = 1;
			SetOnComLed();
		}
	} else {
		SetOffComLed();
		ledflag = 0;
	}
}
//add 2005.5.8------------

void EnableWDT(void);

void main(void)
{
    unsigned char runstatus;
	unsigned long nCurCount,nCurCount1,nCurCount2;
	unsigned char data1,data2;
	unsigned char nMCUSR;
	int i;

	__aircon_letdown_ddr = OUT;
	__aircon_letdown_port = 1; //高电平停 2004.7.13

	all_init();

	nMCUSR = MCUCSR; 
	MCUCSR = 0x00;	

	//SetCalibration();
    __errled_ddr =	OUT;
	__errled_port = 0;	
	runstatus = 0;
	ReadSysPrm();
	//InitState();
	data_init();    
	UARTEnable_INT();
	InitADC();

	sprintf(str,"ver:20050508\r\n");
	put_buf(str);
	lcd_str(0,str);
	
	//while(1) { 
	//  ResetEtr186();
	//  delay_ms(10000);
	//}          
	
	#asm("wdr")	
	data1 = WDTCR;
	EnableWDT();	
	data2 = WDTCR;
	#asm("wdr")	 
	
       //	while(1) {
	//	for (i=0;i<35;i++) delay_us(50000);
	//	#asm("wdr");
	//}
		    
	sprintf(str,"SR:%x CR:%x %x\r\n",nMCUSR,data1,data2);
	put_buf(str);
	lcd_str(1,str);

	if ( (nMCUSR&0x08) != 0 ) {
		sprintf(str,"看门狗复位启动\r\n");
		put_buf(str);
		lcd_str(2,str);
		delay_ms(5000);	
	} else {
		delay_ms(3000);
	}

    while(1){

		//test
		/*
		if ( nCurCount2 != nSecondCount ) {
			nCurCount2 = nSecondCount;
			//sprintf(str,"%d %02d:%02d:%02d %d",nSecondCount,t.hour,t.minute,t.second,nHopFlag);
            sprintf(str,"%l %02d:%02d:%02d",nSecondCount,t.hour,t.minute,t.second);
			lcd_str(3,str);
		}*/
		

		//test

		nCurCount1 = nSecondCount;
		if ( ((nCurCount1%readinterval)==0) && (nCurCount!=nCurCount1)) {
			nCurCount = nCurCount1;
			#asm("wdr")	 //复位看门狗
            	    	ReadSensor();
            		//proc_send(); 
          		#asm("wdr")	 //复位看门狗
        	}       
                
                #asm("wdr")	 //复位看门狗
        //process_menu();
		//proc_send();
		proc_recv();
        //proc_send();
                        
                #asm("wdr")	 //复位看门狗
        	 
        			
		if ( sample_flag == 1 ) {
             
			if ( nSecondCount>sample_interval+sample_timer ) {
				sample_timer = nSecondCount;
				sprintf(str,"%d+",COM_SendSample);
				FloatToStr(T_in,tmpstr);
                //FloatToStr(inTempValue[SamplePos],tmpstr);
				strcat(str,tmpstr);
				strcatf(str,"+");
				FloatToStr(H_in,tmpstr);
				//FloatToStr(inHumiValue[SamplePos],tmpstr);
				strcat(str,tmpstr);
				strcatf(str,"+");
				FloatToStr(T_out,tmpstr);
				//FloatToStr(outTempValue[SamplePos],tmpstr);
				strcat(str,tmpstr);
				strcatf(str,"+");
				FloatToStr(H_out,tmpstr);

⌨️ 快捷键说明

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