level 7
#define FUNC#
include
#include "Moudle.h"void calibration() {#asmBSF _STATUS,5;CALL 3FFH; MOVWF _OSCCAL;BCF _STATUS,5;#endasm}/*上电初始化子程序*/void initialize() {CMCON = 7;//关闭相应比较器POR = 1;//与上电复位有关TRISA = 0X2F;//相应三态控制位WPUA = 0X2D; //打开相应弱上拉//OPTION = 0X16;//定时器1使用内部指令时钟,看门狗预分频64 64*18ms ANSEL = 2;//RA1模拟输入TRISC = 0X20;//RC5配置成输入端口TMR0 = 0; PORTA = 0; PORTC = 0;SIGN_PWRT = 1; WID0 = 0;WID1 = 0;WriteLock = 1;//SndRelayOffMSG = 0;RC2 = 0;IOCA = 1;RAIE = 1;//INTE=1;//外部中断使能calibration();}/*写EEPROM子程序*/void EE_WR(unsigned char addr,unsigned char value) {while(WR)continue;EEADR=(addr);EEDATA=(value); CARRY=0;if(GIE)CARRY=1;GIE=0; WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0;while(!EEIF);EEIF = 0; if(CARRY)GIE=1;}/*T1中断子程序初始化TIMER1属于外设*/void ini_t1() {//TMR1CS = 0; //使用内部时钟T1CON = 0;TMR1L = 0,TMR1H = 0;TMR1IE = 1; //使能TIMER1TMR1IF = 0; //溢出位清零//TMR1ON = 1;}/*T0中断子程序初始化*/ #if TF2010 || TF2012 || TF2020 || TF2018D void ini_t0() {OPTION = 0x0e;//PS0 = 1;//PS1 = 1;//PS2 = 1;//1:128预分频//PSA = 0;//WDT使用预分频器//T0CS = 0;//使用内部指令时钟T0IE = 1;//T0使能T0IF = 0;//TMR0 = 0;//定时寄存器}#endif/*AD转换初始化子程序*/void ini_adc() {ANSEL = 2; //设置RA1脚为AD输入ADCON1 = 0x30;//ADCS0 = 1,ADCS1 = 1; //设定专用时钟为转换时钟ADCON0 = 0x84;ADIF = 0;ADIE = 1; // ad使能}/*24v检测端口产生下降沿立即获取数据*/unsigned char GetData(){unsigned char i,j;j=0;for(i=0;i<10;i++){if(IS5V)j++;}if(j>7)return 1;else if(j<3)return 0;else return DATA_INVAILID;}void Ack(unsigned char H,unsigned char L){//应答脉冲宽度控制函数RAIE = 0;TMR1ON = 0;T1_IF = 0;TMR1H = H;TMR1L = L;while(1){if(IS5V)if(IS5V)if(IS5V)break;}TMR1ON = 1;PW_PORT = 1;GODONE = 1;while(!T1_IF);AD_IF=0;ADVal.l[1]=ADRESH,ADVal.l[0]=ADRESL;PW_PORT = 0;T1_IF = 0;RAIF = 0;RAIE=1;}/*PW应答函数*/bit AckPW(unsigned char p2,unsigned char p5){while((!NewData)&&(!FrameStart));if(FrameStart)return NOK;WDGRST();Ack((65536-300)/256,(65536-300)%256);//拉脉宽300ADVal0=ADVal.h;WDGRST();NewData=0;while((!NewData)&&(!FrameStart));if(FrameStart)return NOK;Ack(p2==ACT?(65536-600)/256:(65536-300)/256,p2==ACT?(65536-600)%256:(65536-300)%256);ADVal0+=ADVal.h;WDGRST();NewData=0;while((!NewData)&&(!FrameStart));if(FrameStart)return NOK;Ack((65536-300)/256,(65536-300)%256);ADVal0+=ADVal.h;WDGRST();NewData=0;while((!NewData)&&(!FrameStart));if(FrameStart)return NOK;if(ADVal0
BREAK_LINE){Ack((65536-150)/256,(65536-150)%256);}else{Ack((65536-1200)/256,(65536-1200)%256);}WDGRST();NewData=0;while((!NewData)&&(!FrameStart));if(FrameStart)return NOK;NewData=0;if(p5==MONITOR){Ack((65536-300)/256,(65536-300)%256);}else{Ack((65536-600)/256,(65536-600)%256);}WDGRST();return OK;}void GetADVal(){unsigned char i;ADON = 1;AD_IF = 0;for(i=0;i<50;i++);GODONE = 1;while(!AD_IF);ADVal.l[1]=ADRESH,ADVal.l[0]=ADRESL;}#if TF2010 || TF2012 || TF2020void ComPro(){if(((Fram.Com==0) && (Fram.Com0==Fram.Com))||(((Fram.Com&2)==0)&&(Fram.Com0==2) && (Fram.Com00==2) )){//开继电器判断Fram.Com0 = 255;Fram.Com00 = 255;RelayOn();RelayStatus=RELAY_ON;T0IE = 1;T0COUNTER = 0;}else if(((Fram.Com==5)&& (Fram.Com0==Fram.Com)) ||(((Fram.Com&2)==0)&&(Fram.Com0==7) && (Fram.Com00==7) )){//关继电器判断Fram.Com0 = 255;Fram.Com00 = 255;RelayOff();RelayStatus = RELAY_OFF;T0IE = 1;T0COUNTER = 0;}else{//保存本次命令Fram.Com00 = Fram.Com0;Fram.Com0 = Fram.Com;}}#endif
2006年12月18日 01点12分
3
level 0
看不懂C因为我们主学不是C----------------shui
2006年12月18日 01点12分
4
level 7
我哪有时间学C啊```这个程序是我问别人要的,我想自己设计一套系统,又不知道这个程序怎么样,所以问问你们```
2006年12月18日 02点12分
10
level 7
算了```对了我打算过几年自己开公司~我和一些关系好的人都商量好了,我们现在拼命的研究公司现在的产品!然后自己设计一个更好的产品!嘿嘿!!!!!最后````````````哈哈哈!!!!将来要是我事业腾达的时候,我聘请你来我公司当程序员怎么样!
2006年12月18日 02点12分
12
level 7
小孩子当然不懂`````````找你家如花去`````````
2006年12月18日 04点12分
15
level 10
飞娃,这程序是干什么用的,不说清楚做什么用,肯定没人知道怎么改。。。。因为不知道你干什么用,怎么知道有没有地方写的不对阿
2006年12月18日 04点12分
16
level 7
老大~帮我看看有没有什么罗唆的地方就好喽~能不能精简点~这个是一个控制模块的程序,也就是一个带地址的继电器,靠改变电压来工作的.
2006年12月18日 04点12分
18