/**************************************************************************
程序功能说明:
从机程序
**************************************************************************/
#include "p30f5015.h"
//OSCCON=0x7320---主振荡器F=7.3728MHz;分频比为1:1;PLL处于锁定状态。
_FOSC(CSW_FSCM_OFF & XT_PLL8); //8倍频晶振(即Fosc=7.3728MHz*8=58.9824MHz),Failsafe时钟关闭
_FWDT(WDT_OFF); //关闭看门狗
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);//掉电复位使能,使能2V 的欠压复位,将上电延时定时器初始化为64 ms,并将MCLR引脚复位使能
_FGS(CODE_PROT_OFF); //代码保护禁止
/******************************************************
Fosc=58.9824MHz;
Tosc=1/Fosc=1.6954*e-8s=16.954ns=Tcy
Tad=154ns; AD转换时间=12Tad;
取ADCS<5:0>=18
******************************************************/
unsigned int failmemory[40];
//#include "delay.c"
#define rs485_out 1 //
#define rs485_in 0 //
//#define work_check1 RB0 //机器1工作状态
//#define work_check2 RB1 //机器2工作状态
//#define work_check3 RB2 //机器3工作状态
//#define clr_mem_key RC5 //清除内部记忆数据
#define rs458_control RF5 //RS485发射/接收控制脚
//#define DISPLAY RA4 //指示
//********************************15秒定时器*******************************
unsigned char TIMER15S1; //输出刷新时间
unsigned char TIMER15S2; //电压电流采样间隔时间
unsigned char TIMER15S3; //功采样时间----6秒一次
unsigned char TIMER15S4; //清除数据按键按下时间
unsigned char TIMER15S5;
unsigned char TIMER15S6;
//********************************1小时定时器*******************************
unsigned int TIMER1H1;
unsigned int TIMER1H2;
unsigned int TIMER1H3;
//*******************************系统内部数据*******************************
unsigned char machine_status[3]; //3台机器的工作状态
unsigned int total_machine_time[3]; //3台机器的连续工作时间---单位是1小时
unsigned int study_per; //交流电功率因数
unsigned int u_data; //电压
unsigned int i_data; //电流
unsigned int s_data; //视在功率
unsigned int w_data; //6秒钟用掉的瓦*秒
unsigned char watt_data[7]; //瓦特
unsigned char rec_cout; //串口接收到的字节数
unsigned char rec_ok; //接收正确完成
unsigned char rec_data[4]; //串口接收到的数据
unsigned char self_address; //从机自身地址
void InitializeSys()
{
INTCON1=0x0000;
INTCON2=0x0000;
IEC0=0x0000;
IEC1=0x0000;
IEC2=0x0000;
}
/***************************************************************************
初始化输入输出IO
***************************************************************************/
void init_input(void)
{
LATB=0x0000;
TRISB=TRISB&0x01FF; //RB 0 1 2 3 4 5 6 7 8 配置为输入,其他输出 0x01ff
LATC=0x0000;
TRISC=TRISC&0x9fff; //RC 15 输入 RC13 RC14 输出 0x8000
LATD=0x0000;
TRISD=TRISD&0xff10; //RD 0 1 2 3 5 6 7配置为输出口 4 8 9 10 11 输入
LATE=0x0000;
TRISE=TRISE&0xfffe; //RE 0 配置为输出
LATF=0x0000;
TRISF=TRISF&0xffc6; //RF 1 2 6配置为输入 RF 0 3 4 5配置为输出
LATG=0x0000;
TRISG=TRISG&0xfff3; //RG 2 3 配置为输出 6 7 8 9配置为输入
}
/***************************************************************************
初始化定时器0用做定时器延迟用
***************************************************************************/
void init_timer0(void)
{
T2CON=0x08; //设定TMR2工作在16位定时器方式,使用内部时钟,不分频
INTCON2=INTCON2|0x20; //设置允许TMR2中断
INTCON2=INTCON2&0xfb; //清除TMR2中断标志
IPC1bits.T2IP=1; //设置TMR2中断为高优先级
}
/***************************************************************************
初始化定时器1用做捕捉用
***************************************************************************/
void init_timer1(void)
{
T1CON=0x89; //打开定时器1
}
/***************************************************************************
初始化捕捉
***************************************************************************/
void init_ccp(void)
{
TRISC2=1;
PEIE=1;
CCP1IE=1;
CCP1IP=1;
}
/***************************************************************************
设置捕捉方式---上升沿下降沿都捕捉,来检测脉冲的宽度
***************************************************************************/
void init_ccp_hi_lo(unsigned char hi_lo)
{
switch(hi_lo)
{
case 1: //设置成下降沿捕捉
{
CCP1CON=0x04;
TMR1L=0;
TMR1H=0;
TMR1L=0;
break;
}
case 2: //设置成上升沿捕捉
{
CCP1CON=0x05;
TMR1L=0;
TMR1H=0;
TMR1L=0;
break;
}
}
}
/***************************************************************************
初始化AD
***************************************************************************/
void init_ad(void)
{
ADCON1=0x85; //右对齐格式,并且使能2个通道。
ADCON0=0x81; //打开AD模块
}
/***************************************************************************
切换电压---电流采样通道
***************************************************************************/
void change_ad_channel(unsigned char channel)
{
switch(channel)
{
case 1: //选择AD通道1
{
CHS0=0;
break;
}
case 2:
{
CHS0=1; //选择AD通道2
break;
}
}
}
/***************************************************************************
读取电压或者电流的数据
***************************************************************************/
unsigned int ad_value(void)
{
unsigned int temp;
GODONE=1;
while(GODONE);
temp=ADRESL+(ADRESH<<8);
return (temp);
}
/***************************************************************************
初始化串口
***************************************************************************/
void init_com(void)
{
TXSTA=0x04;
RCSTA=0x80;
TRISC|=0x80;
TRISC&=~0x40;
SPBRG=25;
PIR1=0;
PIE1|=0x20;
RCIP=1;
CREN=1;
TXEN=1;
}
/***************************************************************************
上电初始化从机
***************************************************************************/
void init_slave(void)
{
init_input();
init_timer0();
init_timer1();
init_ccp();
CCP1CON=0x04;
TMR1L=0;
TMR1H=0;
TMR1L=0;
init_ad();
init_com();
self_address=PORTC&0x03;
self_address+=1;
IPEN=1; //中断优先使能
ei();
}
/***************************************************************************
电压---电流相位差检测,采用捕捉功能,捕捉电压电流共同存在的时间,最大为10MS
***************************************************************************/
void interrupt HI_ISR()
{
unsigned int temp;
unsigned char temp_8;
if(TMR0IF)//60MS中断
{
TMR0IF=0;
TMR0H=0x15;
TMR0L=0x9f;
TIMER15S1++;
TIMER15S2++;
TIMER15S3++;
TIMER15S4++;
TIMER15S5++;
TIMER15S6++;
TIMER1H1++;
TIMER1H2++;
TIMER1H3++;
}
if(CCP1IF)
{
CCP1IF=0;
switch(CCP1CON)
{
case 0x04: //下降沿捕捉
{
init_ccp_hi_lo(2); //设置成上升沿捕捉
temp=CCPR1L+(CCPR1H<<8);
temp=temp%10000;
study_per=temp/10; //功率因数为千分数
break;
}
case 0x05: //上升沿捕捉
{
init_ccp_hi_lo(1); //设置成下降沿捕捉
temp=CCPR1L+(CCPR1H<<8);
break;
}
}
}
if(RCIF)
{
RCIF=0;
temp_8=RCREG;
if(temp_8=='{')//一包数据的开始
{
rec_cout=0;
}
else if(temp_8=='}')//一包数据的结束
{
if(rec_cout==3)
{
if((((rec_data[0]-48)+(rec_data[1]-48))%10)==(rec_data[2]-48))
{
if((((rec_data[0]-48)*10)+(rec_data[1]-48))==(self_address))
{
rec_ok=1;
}
}
}
}
else
{
rec_data[rec_cout++]=temp_8;
}
if(rec_cout>4)
{
rec_cout=0;
}
}
}
/***************************************************************************
发一个字节到串口
***************************************************************************/
void send_
ADC.rar_ad采样_rs485.h_数据AD采集_程序 ad 7663_采样
版权申诉
5星 · 超过95%的资源 36 浏览量
2022-09-24
15:47:45
上传
评论
收藏 179KB RAR 举报
JonSco
- 粉丝: 67
- 资源: 1万+
最新资源
- Matlab的教室人数统计系统可统计正脸人数源码毕业设计.zip
- 重磅上市公司论文实证分析筛选样本所用数据指标(2000-2022年) 是否ST或PT 金融
- 你的名字。.BD.720p.日语中字.mp4
- 重磅公司治理水平数据构造至2022(基于主成分分析方法),含最终数据及构造代码!
- 毕业设计python完成三个过程PDF的识别与分析信息抽取构建知识图谱信息检索基于知识图源码谱.zip
- Matlab的交通标志识别系统带界面可判别红色精灵蓝色指示和黄色警示三类交通标志源码.zip
- 财政学课件与案例资料2222-22
- 上市银行资本充足率资产负债率营收增长率成本收入比权益乘数2007-2022总资产
- MATLAB的火焰识别源码毕业设计.zip
- 芬斯特拉《高级国际贸易学》教学讲义-Advanced International Trade
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈