📄 straincollector.c
字号:
/* 应变采集器单片机程序 */
/* 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 + -