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

📄 straincollector.c

📁 51单片机实现接收桥梁健康监测数据的代码,主要测量桥梁挠度!!数据通过GPRS传送!
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 应变采集器单片机程序 */
/* 16路数据采集,采用P4口控制*/
/* Writed by: yg*/
/* Date: 2008-7-24 */
#pragma small
#include <stdio.h>
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#include "StrainCollector.h"


#include "timer.c"
#include "gprs.c"

uchar g_totimes;
// todo: 发送数据的时候需要取消sleep

// todo: 休眠功能改造,深度休眠醒来后,改定时器为定时
//          深度休眠前,改定时器为报警
// todo: 取消应变采集中的调试信息:0X55 etc.
/******************************************
Init the Chip
初始化单片机内容
*****************************************/
void Init_Chip()
{
	//	P1_5 = 0;
    P1_0 = 0;   // 非省电模式
    	//P1_2 = 1;		   温度
	P1_7 = 0;
	//P1_3 = 1;	 //89c52
	P1_3 = 0;    //89c54
	P1_4 = 1;    //89c54
	//	P1_1 = 1;
	P0_0 = 1;
	P0_1 = 1;
	P0_2 = 1;
	P0_3 = 1;
	P0_4 = 1;
	P0_5 = 0;
	P0_6 = 0;
	P0_7 = 0;
	P3_5 = 0;
	P2 = 0;	//8.23 new add
	//	P4 = 0;
	
    // yg add
    statusFlag = 0;
    BSLPFLG = 1;
	
    // init the timer value
    g_dslpTime[SEC] = 0;
    g_dslpTime[MIN] = 0;
    g_dslpTime[HOUR] = 1;
    g_dslpTime[DAY] = 0;
    g_dslpTime[MONTH] = 0;
    g_dslpTime[YEAR] = 0;
    
    // todo: close the timer0, timer1 interrupt. 
    // todo: open the serial interrupt.
}

/******************************************
Init the Timer0 INT
初始化定时器0
*****************************************/
void Init_Timer0INT()
{
	TMOD = 0x11;
	//	TCON = 0xAF;		//NEW ADD 中断
	TH0 = 0xFB;				//400HZ方波
	TL0 = 0xA2;
	TR0 = 1;				//启动T0
	ET0 = 1;				//允许定时器0中断
    
    // 初始化激励信号相关变量
    BSWOVER = 0;
	BSDGOT = 0;
}

/******************************************
Init the Serial INT
初始化串口
*****************************************/
void Init_SerialINT()
{
	T2CON = 0x34;
	RCAP2H = 0xFE;     //11.0592M晶振
	TH2 = 0xFE;
	RCAP2L = 0xE0;
	TL2	= 0xE0;
/*
	RCAP2H = 0xFE;     //12M晶振
	TH2 = 0xFE;	   
	RCAP2L = 0xC8;
	TL2	= 0xC8;
*/
	SCON = 0x50;
	ES = 0;		//串行口中断使能位
	ET2 = 0;
	TR2 = 1;
//	TI = 1;
}

void Init_Interrupt()
{
    Init_Timer0INT();
    Init_SerialINT();

	//cpu开中断
	EX0 = 1;				//开外部中断
	EX1 = 1;
	IT0 = 1;
	IT1 = 0;
//	TI = 1;
	EA = 1;
}
/******************************************
Init the Strainors
初始化应变计
*****************************************/
void Init_Strainor()
{
    uchar i;
    uchar f = 1;
    g_strainflag = 0;
    // todo 开采集电路电源
    P3_6 = 0;
    // 是串口发
    for (i=0; i<STNORNUM; i++, f <<= 1)
    {
        //  选择相应的通道
        P4 = i;
        P1_5 = 0;      //new change
		BSWOVER = 0;
		delay10ms();
        //  开始发方波.
        Init_Timer0INT();
        while (!BSWOVER);
        
        // 设置timeout时间
        set_timeout(40);
		BSDGOT = 0;
        // 等待timeout,或者外部中断。
        while (!BSDGOT)
        {
            if (BTIMEOUT)
                break;
        }
        if(!BSDGOT)
        {
            // timeout时,用0改写数据。
            g_strainData[i][0] = 0;
            g_strainData[i][1] = 0;
            g_strainData[i][2] = 0;
            g_strainData[i][3] = 0;
            g_strainData[i][4] = 0;
        }
        else
        {
            g_strainflag |= f;
            
            g_strainData[i][0] = g_sdata[0];
            g_strainData[i][1] = g_sdata[1];
            g_strainData[i][2] = g_sdata[2];
            g_strainData[i][3] = g_sdata[3];
            g_strainData[i][4] = g_sdata[4];
        }
            count++;
            ET0 = 1;
        // 找到下一个有效的应变计,设置选通,再开始发方波
    }
    // todo: 关采集电路电源
	//TODO:  初始化16个应变计的读数
}

////////////////////////////////////////////////////
// Interrupt functions
//

/******************************************
EXTERNAL INT 0, using 2 grouped registers
外部中断0,使用第2组寄存器
用来读取应变计的读数
*****************************************/
void External0_INT(void) interrupt 0 using 2
{
    // 
	unsigned char x_h,x_m,x_l,y_h,y_l;
	
	//			TR1 = 0;
	ET1 = 0;
	
	P2 = 0;
	P0_1 = 0;	  //选通第1个计数器
	y_l = P2;		  //取出待测频率低8位
	P0_1 = 1;
	P2 = 0;
	P0_0 = 0;	  //选通第2个计数器
	y_h = P2;		  //取出待测频率高4位
	P0_0 = 1;
	P2 = 0;
	P0_2 = 0;	  //选通第3个计数器
	x_l = P2;		  //取出时基频率低8位
	P0_2 = 1;
	P2 = 0;	      //8.23 new add
	P0_3 = 0;     //选通第4个计数器
	x_m = P2;		  //取出时基频率中间8位
	P0_3 = 1;
	P2 = 0;		  //8.23 new add
	P0_4 = 0;	  //选通第5个计数器
	x_h = P2;		  //取出时基频率高8位
	P0_4 = 1;
	//			P2 = 0;
	
	
	delay500ms();//8.23change delay200ms();
	
	//			TR1 = 0;
	//printf("%c%c",TH1,TL1);
	
	//8.23change delay200ms();
	P0_5 = 0;	 //关断D触发器
	P1_4 = 1;	 //关断多路选择器
	P1_5 = 1;	 //清零计数器
	//	delay1ms();
	//			delay200ms();
	//	P1_3 = 1;  //new change 89c52 8.27
	//	P1_2 = 1;
    
    // yg mod for del temperature @ 08-7-31.
	//sign =! sign;
    sign = 0;
    // end yg mod 
	
    flag = 0;
	//			P1_1 =! P1_1;		   //控制继电器 89c51
		//P1_2 =! P1_2;		   //89c54		   温度
	/*6.25 new add 16路*/
	g_sdata[0] = x_h;
	g_sdata[1] = x_m;
	g_sdata[2] = x_l;
	g_sdata[3] = y_h;
	g_sdata[4] = y_l;
    // yg add 
    BSDGOT = 1;
	count++;
//    P4 = count;
    
	P1_5 = 0;      //new change
//	ET0 = 1;
	if(count==0x8)
	{
		//					PCON = 0x02;         //单片机进入掉电模式
//		P4 = 0;
		//EX0 = 0;
		count = 0;
        ET0 = 0;
	}
	
	/*6.259 new add 16路 end*/
}

/******************************************
Timer 0, using 1 grouped registers
定时器0,使用第1组寄存器
用来产生应变计的激振信号
*****************************************/
void Timer0_INT (void) interrupt 1 using 1
{
	if(sign==0)									
	{
	 	if(sign1==0)
	 	{
		if(flag<30)									
			{
				time0();
			}
		else if(flag>=30&&flag<60)					
			{
 				time1();
			}
		else if(flag>=60&&flag<90)
			{
				time2();
			}
		else if(flag>=90&&flag<120)
			{
				time3();
			}
		else if(flag>=120&&flag<150)
			{
				time4();
			}
		else if(flag>=150&&flag<180)
			{
				time5();
			}
		else if(flag>=180&&flag<210)
			{
				time6();
			}
		else if(flag>=210&&flag<240)
			{
				time7();
			}
		else if(flag>=240&&flag<270)
			{
				time8();
			}
		else if(flag>=270&&flag<300)
			{
				time9();
			}
		else
			{
				flag = 0;
				sign1 = 1;
			}
		}
		 if(sign1==1)
		{
		if(flag<30)
			{
				time10();
			}
		else if(flag>=30&&flag<60)
			{
				time11();
			}
		else if(flag>=60&&flag<90)
			{
				time12();
			}
		else if(flag>=90&&flag<120)
			{
				time13();
			}
		else if(flag>=120&&flag<150)
			{
				time14();
			}
		else if(flag>=150&&flag<180)
			{
				time15();
			}
		else if(flag>=180&&flag<210)
			{
				time16();
			}
		else if(flag>=210&&flag<240)
			{
				time17();
			}
		else if(flag>=240&&flag<270)
			{
				time18();
			}
		else if(flag>=270&&flag<300)
			{
				time19();
			}
		else
			{
				flag = 0;
				sign1 = 2;
			}
		}
		 if(sign1==2)
		{
		if(flag<30)
			{
				time20();
			}
		else if(flag>=30&&flag<60)
			{
				time21();
			}
		else if(flag>=60&&flag<90)
			{
				time22();
			}
		else if(flag>=90&&flag<120)
			{
				time23();
			}
		else if(flag>=120&&flag<150)
			{
				time24();
			}
		else if(flag>=150&&flag<180)
			{
				time25();
			}
		else if(flag>=180&&flag<210)
			{
				time26();
			}
		else if(flag>=210&&flag<240)
			{
				time27();
			}
		else if(flag>=240&&flag<270)
			{
				time28();
			}
		else if(flag>=270&&flag<300)
			{
				time29();
			}
		else if(flag>=300&&flag<330)
			{
				time30();
			}	
		else if(flag>=330&&flag<360)
			{
				time31();
			}
		else{
				flag = 0;
				sign1 = 3;
			}
		}
		if(sign1==3)
			{
				if(flag<30)
					{
						time32();
					}
				else if(flag>=30&&flag<60)
					{
						time33();
					}
				else if(flag>=60&&flag<90)
					{
						time34();
					}
				else if(flag>=90&&flag<120)
					{
						time35();
					}  
				else if(flag>=120&&flag<150)
					{
						time36();
					}
				else if(flag>=150&&flag<180)
					{
						time37();
					}
				else if(flag>=180&&flag<210)
					{
						time38();
					}
				else if(flag>=210&&flag<240)
					{
						time39();
					}
				else if(flag>=240&&flag<270)
					{
						time40();
					}
				else if(flag>=270&&flag<300)
					{
						time41();
					}
				else if(flag>=300&&flag<330)
					{
						time42();
					}
				else if(flag>=330&&flag<360)
					{
						time43();
					}
				else if(flag>=360&&flag<390)
					{
						time44();
					}
				else if(flag>=390&&flag<420)
					{
						time45();
					}
				else if(flag>=420&&flag<450)
					{
						time46();
					}
				else if(flag>=450&&flag<480)
					{
						time47();
					}
				else if(flag>=480&&flag<510)
					{
						time48();
					}
				else if(flag>=510&&flag<540)
					{
						time49();
					}
				else if(flag>=540&&flag<570)
					{
						time50();
					}
				else if(flag>=570&&flag<600)
					{
						time51();
					}
				else
					{
						flag = 0;
						sign1 = 4;
					}
			}
		if(sign1==4)
			{
				ET0 = 0;
				P1_7 = 1;
				sign1 = 0;
				yb++;
				if(yb==16)
					{
						yb = 0;
					}
				P1_4 = 0;    //89c54	  选通频率
				P1_3 = 0;	 //89c54
				delay10ms();
				P0_5 = 1;
                BSWOVER = 1;
			}
	   	}
	

}

/******************************************
EXTERNAL INT 1, using 3 grouped registers
外部中断1,使用第3组寄存器
唤醒中断
该中断由串口读取Timeout定时中断产生浅睡眠,
由管理器命令产生深睡眠。
外部定时器会在此产生中断唤醒chip,
输出: BDPSLP
*****************************************/
void External1_INT(void) interrupt 2 using 3
{
    if(BDPSLP)
    {
        // 如果是深休眠,则转入浅休眠
        BDPSLP = 0;
        // TODO: 将定时器改为定时功能
		writeData(0x01,0x11);   // 定时有效
        // 3s后发送警报
//		writeData(0x0F,0xC0);   // 0xc081
//		writeData(0x0E,0x81); 
        
    }
	
    //  open the wireless power
	P3_7 = 0;
    //   CLOSE THE EXTERNAL INT 1
	ET0 = 0;
}

/******************************************
TIME INT 1, using 1 grouped registers
计时中断1,使用第1组寄存器
用于对串口Read的Timeout计时
输出:如果P1_0为1,则进入睡眠。
*****************************************/
void Timer1_INT(void) interrupt 3 using 1
{
        
    SET50MS1();
    if (--g_totimes)
    {
        return;
    }
    // todo: close the Timer1
    
    BTIMEOUT = 1;
    ET1 = 0;
  
  if (!P1_0)
        return;
//    set_wake_time();
//    shallow_sleep();
    
    // todo: open the Timer1
}

////////////////////////////////////////////////////
// delay functions
//
void delay10ms(void)
{
    uchar i,j,k;
    for(i=5;i>0;i--)
        for(j=4;j>0;j--)
            for(k=248;k>0;k--);
}


void delay1ms(void)
{
    uchar i,j,k;
    for(i=5;i>0;i--)
        for(j=4;j>0;j--)
            for(k=24;k>0;k--);
}



void delay500ms(void)
{
    uchar i,j,k;
    for(i=15;i>0;i--)
        for(j=202;j>0;j--)
            for(k=81;k>0;k--);
}

/******************************************
通过串口发送字符
用来替换Keil C中的putchar函数。
*****************************************/
char send_char (char c)
{
	SBUF = c;
    while (!TI);
    TI = 0;
	return c;
}

/******************************************
通过串口发送一条命令,命令保存在g_cmdData中
输入:g_cmdData。
*****************************************/
void send_cmd()
{
    uchar crc = STARTFLAG, i;
//	SBUF=STARTFLAG;
    send_char(STARTFLAG);
    send_char(g_cmdData[CMD]);
    crc ^= g_cmdData[CMD];
	
    send_char(TID);
    crc ^= TID;
	

⌨️ 快捷键说明

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