基于晓程PL3107载波芯片的采集器系统软件源代码.docx

上传人:b****5 文档编号:6717096 上传时间:2023-01-09 格式:DOCX 页数:81 大小:38.61KB
下载 相关 举报
基于晓程PL3107载波芯片的采集器系统软件源代码.docx_第1页
第1页 / 共81页
基于晓程PL3107载波芯片的采集器系统软件源代码.docx_第2页
第2页 / 共81页
基于晓程PL3107载波芯片的采集器系统软件源代码.docx_第3页
第3页 / 共81页
基于晓程PL3107载波芯片的采集器系统软件源代码.docx_第4页
第4页 / 共81页
基于晓程PL3107载波芯片的采集器系统软件源代码.docx_第5页
第5页 / 共81页
点击查看更多>>
下载资源
资源描述

基于晓程PL3107载波芯片的采集器系统软件源代码.docx

《基于晓程PL3107载波芯片的采集器系统软件源代码.docx》由会员分享,可在线阅读,更多相关《基于晓程PL3107载波芯片的采集器系统软件源代码.docx(81页珍藏版)》请在冰豆网上搜索。

基于晓程PL3107载波芯片的采集器系统软件源代码.docx

基于晓程PL3107载波芯片的采集器系统软件源代码

$NOMOD51

;------------------------------------------------------------------------------

;ThisfileispartoftheC51Compilerpackage

;Copyright(c)1988-2005KeilElektronikGmbHandKeilSoftware,Inc.

;Version8.01

;

;***<<>>***

;------------------------------------------------------------------------------

;STARTUP.A51:

Thiscodeisexecutedafterprocessorreset.

;

;TotranslatethisfileuseA51withthefollowinginvocation:

;

;A51STARTUP.A51

;

;TolinkthemodifiedSTARTUP.OBJfiletoyourapplicationusethefollowing

;Lx51invocation:

;

;Lx51yourobjectfilelist,STARTUP.OBJcontrols

;

;------------------------------------------------------------------------------

;

;User-definedPower-OnInitializationofMemory

;

;WiththefollowingEQUstatementstheinitializationofmemory

;atprocessorresetcanbedefined:

;

;IDATALEN:

IDATAmemorysize<0x0-0x100>

;Note:

Theabsolutestart-addressofIDATAmemoryisalways0

;TheIDATAspaceoverlapsphysicallytheDATAandBITareas.

IDATALENEQU80H

;

;XDATASTART:

XDATAmemorystartaddress<0x0-0xFFFF>

;TheabsolutestartaddressofXDATAmemory

XDATASTARTEQU0

;

;XDATALEN:

XDATAmemorysize<0x0-0xFFFF>

;ThelengthofXDATAmemoryinbytes.

XDATALENEQU0

;

;PDATASTART:

PDATAmemorystartaddress<0x0-0xFFFF>

;TheabsolutestartaddressofPDATAmemory

PDATASTARTEQU0H

;

;PDATALEN:

PDATAmemorysize<0x0-0xFF>

;ThelengthofPDATAmemoryinbytes.

PDATALENEQU0H

;

;

;------------------------------------------------------------------------------

;

;ReentrantStackInitialization

;

;ThefollowingEQUstatementsdefinethestackpointerforreentrant

;functionsandinitializedit:

;

;StackSpaceforreentrantfunctionsintheSMALLmodel.

;IBPSTACK:

EnableSMALLmodelreentrantstack

;StackspaceforreentrantfunctionsintheSMALLmodel.

IBPSTACKEQU0;setto1ifsmallreentrantisused.

;IBPSTACKTOP:

EndaddressofSMALLmodelstack<0x0-0xFF>

;Setthetopofthestacktothehighestlocation.

IBPSTACKTOPEQU0xFF+1;default0FFH+1

;

;

;StackSpaceforreentrantfunctionsintheLARGEmodel.

;XBPSTACK:

EnableLARGEmodelreentrantstack

;StackspaceforreentrantfunctionsintheLARGEmodel.

XBPSTACKEQU0;setto1iflargereentrantisused.

;XBPSTACKTOP:

EndaddressofLARGEmodelstack<0x0-0xFFFF>

;Setthetopofthestacktothehighestlocation.

XBPSTACKTOPEQU0xFFFF+1;default0FFFFH+1

;

;

;StackSpaceforreentrantfunctionsintheCOMPACTmodel.

;PBPSTACK:

EnableCOMPACTmodelreentrantstack

;StackspaceforreentrantfunctionsintheCOMPACTmodel.

PBPSTACKEQU0;setto1ifcompactreentrantisused.

;

;PBPSTACKTOP:

EndaddressofCOMPACTmodelstack<0x0-0xFFFF>

;Setthetopofthestacktothehighestlocation.

PBPSTACKTOPEQU0xFF+1;default0FFH+1

;

;

;------------------------------------------------------------------------------

;

;MemoryPageforUsingtheCompactModelwith64KBytexdataRAM

;CompactModelPageDefinition

;

;DefinetheXDATApageusedforPDATAvariables.

;PPAGEmustconformwiththePPAGEsetinthelinkerinvocation.

;

;Enablepdatamemorypageinitalization

PPAGEENABLEEQU0;setto1ifpdataobjectareused.

;

;PPAGEnumber<0x0-0xFF>

;uppermost256-byteaddressofthepageusedforPDATAvariables.

PPAGEEQU0

;

;SFRaddresswhichsuppliesuppermostaddressbyte<0x0-0xFF>

;most8051variantsuseP2asuppermostaddressbyte

PPAGE_SFRDATA0A0H

;

;

;------------------------------------------------------------------------------

;StandardSFRSymbols

ACCDATA0E0H

BDATA0F0H

SPDATA81H

DPLDATA82H

DPHDATA83H

NAME?

C_STARTUP

 

?

C_C51STARTUPSEGMENTCODE

?

STACKSEGMENTIDATA

RSEG?

STACK

DS1

EXTRNCODE(?

C_START)

PUBLIC?

C_STARTUP

CSEGAT0

?

C_STARTUP:

LJMPSTARTUP1

RSEG?

C_C51STARTUP

STARTUP1:

IFIDATALEN<>0

MOVR0,#IDATALEN-1

CLRA

IDATALOOP:

MOV@R0,A

DJNZR0,IDATALOOP

ENDIF

IFXDATALEN<>0

MOVDPTR,#XDATASTART

MOVR7,#LOW(XDATALEN)

IF(LOW(XDATALEN))<>0

MOVR6,#(HIGH(XDATALEN))+1

ELSE

MOVR6,#HIGH(XDATALEN)

ENDIF

CLRA

XDATALOOP:

MOVX@DPTR,A

INCDPTR

DJNZR7,XDATALOOP

DJNZR6,XDATALOOP

ENDIF

IFPPAGEENABLE<>0

MOVPPAGE_SFR,#PPAGE

ENDIF

IFPDATALEN<>0

MOVR0,#LOW(PDATASTART)

MOVR7,#LOW(PDATALEN)

CLRA

PDATALOOP:

MOVX@R0,A

INCR0

DJNZR7,PDATALOOP

ENDIF

IFIBPSTACK<>0

EXTRNDATA(?

C_IBP)

MOV?

C_IBP,#LOWIBPSTACKTOP

ENDIF

IFXBPSTACK<>0

EXTRNDATA(?

C_XBP)

MOV?

C_XBP,#HIGHXBPSTACKTOP

MOV?

C_XBP+1,#LOWXBPSTACKTOP

ENDIF

IFPBPSTACK<>0

EXTRNDATA(?

C_PBP)

MOV?

C_PBP,#LOWPBPSTACKTOP

ENDIF

MOVSP,#?

STACK-1

;ThiscodeisrequiredifyouuseL51_BANK.A51withBankingMode4

;CodeBanking

;SelectBank0forL51_BANK.A51Mode4

#if0

;Initializebankmechanismtocodebank0whenusingL51_BANK.A51withBankingMode4.

EXTRNCODE(?

B_SWITCH0)

CALL?

B_SWITCH0;initbankmechanismtocodebank0

#endif

;

LJMP?

C_START

END

#ifndef__BSP_H__

#define__BSP_H__

#include"pl3105.h"

#include"cpu.h"

#defineoff0ul

#defineon1ul

#definefalse0ul

#definetrue1ul

#definefree0ul

#definebusy1ul

#definedef_1200bps0ul

#definedef_2400bps1ul

#definedef_4800bps2ul

#definedef_9600bps3ul

#defineCOM_BUF_LEN40ul//串口接收缓冲区长度

#defineGBL_TICKS_PER_SEC100ul//每秒时钟滴答数

structdef_com{

int16sactv;//串口工作模式定义(0表示接收,非零表示发送剩余时间)

int16sdcnt;//串口缓冲区中有效数据个数

int8uwptr;//指向缓冲区中下一个数据写入的地址

int8urptr;//指向缓冲区中下一个数据读取的地址

int8udbuf[COM_BUF_LEN];//串口数据缓冲区

};

#ifdefGLOBAL

volatileint32sdatasys_ticks=2880000l;//系统运行滴答数(10ms*8*60*60*GBL_TICKS_PER_SEC),每8小时主动复位一次

volatilestructdef_comxdataplccom,infcom,plcrdm,infrdm,secrdm,*rdmcom=&secrdm;

#else

externvolatileint32sdatasys_ticks;

externvolatilestructdef_comxdataplccom,infcom,plcrdm,infrdm,secrdm,*rdmcom;

#endif

#defineset_time(ticks)((sys_ticks)-(int32s)(ticks))//设置一个时间

#definechk_time(ticks)((sys_ticks)<(int32s)(ticks))?

(true):

(false)//用于超时检测

#definefosc(9600000ul/2)//外部晶振为9.6M,cpu核执行速度为外部晶振一半(见手册)

/*

*********************************************************************************************************

*底程函数声明

*********************************************************************************************************

*/

sbitp1_5=P1^5;

sbitp1_6=P1^6;

#definegbl_isr_clse(void)(EA=0)//关闭中断

#definegbl_isr_open(void)(EA=1)//打开中断

#definefeed_dog(void)(WDT_RST=0xA1)//看门狗喂狗

#definefeed_plc(void)(PLM_RST=0xA2)//载波喂狗

//指示灯操作宏定义

#definerunled(void)(p1_5=!

p1_5)//运行指示灯

#definers485rcv(state)((on)==(state))?

((p1_6)=(0)):

((p1_6)=

(1))//RS485收发控制

externvoidsoftreset(void);

externvoidinfrared_init(void);

externvoidrs485_init(int8ubps);//打开下行485端口

externvoidsendbyte(structdef_com*com,int8uchr);

externvoidhdware_init(void);

#endif

#include"bsp.h"

#include"plc.h"

#include"lib.h"

#include"global.h"

voidsoftreset(void)

{

gbl_isr_clse();//关闭中断并进行死循环,等待看门狗溢出复位重启(872ms后复位)

while(true);

}

voidrs485_init(int8ubps)

{

SCON1=0xd0;//串口1工作方式3

TMOD1=(TMOD1&0xf0)|0x22;//T2设置为8位自动重装模式,T1时钟不分频

switch(bps){//波特率计算公式:

reg=256-(2^SMOD0*fosc)/(32*bps)

casedef_1200bps:

PCON=(STATUS&0xc0)&(~0x40);//串口波特率不加倍

TH2=0x83;

break;

casedef_2400bps:

PCON=(STATUS&0xc0)|0x40;//串口波特率加倍

TH2=0x83;

break;

casedef_4800bps:

PCON=(STATUS&0xc0)&(~0x40);//串口波特率不加倍

TH2=0xe1;

break;

casedef_9600bps:

PCON=(STATUS&0xc0)|0x40;//串口波特率加倍

TH2=0xe1;

break;

default:

PCON=(STATUS&0xc0)|0x40;//串口波特率加倍

TH2=0x83;

break;

}

ES1=1;TR2=1;//开串口1中断,并启动串口波特率发生定时器

}

staticvoidisr_rs485(void)interrupt6

{

if(1==ETI){

ETI=0;

if(0>=rdmcom->dcnt){

rs485rcv(on);

rdmcom->actv=0,rdmcom->dcnt=0;

rdmcom->rptr=0,rdmcom->wptr=0;

return;

}

rdmcom->dcnt=rdmcom->dcnt-1;

ACC=rdmcom->dbuf[rdmcom->rptr];

ETB8=P;//偶校验位

SBUF1=rdmcom->dbuf[rdmcom->rptr++];

if(COM_BUF_LEN==rdmcom->rptr){

rdmcom->rptr=0;

}

}

if(1==ERI){

ERI=0;

if(rdmcom->actv){

return;

}

rdmcom->dcnt=rdmcom->dcnt+1;

rdmcom->dbuf[rdmcom->wptr++]=SBUF1;

if(COM_BUF_LEN==rdmcom->wptr){

rdmcom->wptr=0;

}

}

}

staticvoidinfrared_init(void)

{

SCON=0xd0;//串口0工作方式3

TMOD=(TMOD&0x0f)|0x20;//T1设置为8位自动重装模式

TMOD1=TMOD1|0x10;//T1时钟不分频

PCON=(STATUS&0xc0)&(~0x80);//串口波特率不加倍

TH1=0x83;

ES=1;TR1=1;//开串口0中断,并启动波特率发生定时器

}

staticvoidisr_infrared(void)interrupt4

{

if(1==TI){

TI=0;

if(0>=infcom.dcnt){

IR38K=0,IR_CNT1=0x00;//关闭38k红外调制信号

infcom.actv=0,infcom.dcnt=0;

infcom.rptr=0,infcom.wptr=0;

return;

}

infcom.dcnt=infcom.dcnt-1;

ACC=infcom.dbuf[infcom.rptr];

TB8=P;//偶校验位

SBUF=infcom.dbuf[infcom.rptr++];

if(COM_BUF_LEN==infcom.rptr){

infcom.rptr=0;

}

}

if(1==RI){

RI=0;

if(infcom.actv){

return;

}

infcom.dcnt=infcom.dcnt+1;

infcom.dbuf[infcom.wptr++]=SBUF;

if(COM_BUF_LEN==infcom.wptr){

infcom.wptr=0;

}

}

}

voidsendbyte(structdef_com*com,int8uchr)

{

com->dcnt=com->dcnt-1;

com->rptr=com->rptr+1;

if(&infcom==com){

TI=0,ACC=chr;

TB8=P,SBUF=chr;

IR_CNT1=0x1f,IR38K=1;//打开38k红外调制信号

return;

}

if(rdmcom==com){

rs485rcv(off);

ETI=0,ACC=chr;

ETB8=P,SBUF1=chr;

re

展开阅读全文
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1