PIC16F917内部AD练习程序
- 格式:docx
- 大小:18.15 KB
- 文档页数:5
PIC16F73做的逆变器程序及原理图PIC16F73做的逆变器程序及原理图file:///C:\Users\ADMINI~1\AppData\Local\T emp\ksohtml\w ps10D1.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\T emp\ksohtml\w ps10D2.tmp.png//------------------------------------------------------------ // spwm信号调制 //------------------------------------------------------------ #include #include //系统配置 __CONFIG(HS&PWRTEN&BOREN&PROTECT&WDTEN); //打开看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护 //------------------------------------------------------------ //指示灯宏定义 #define L1_RED_ON RB1=1;RB2=0;//L1红灯亮 #define L1_OFF RB1=0;RB2=0; #define L2_RED_ON RB4=1;RB3=0;//L2红灯亮 #define L2_OFF RB4=0;RB3=0; #define L3_RED_ON RB7=1;RB5=0;//L3红灯亮 #define L3_OFF RB7=0;RB5=0; #define L1_GREE_ON RB2=1;RB1=0;//L1绿灯亮 #define L2_GREE_ON RB3=1;RB4=0;//L2绿灯亮 #define L3_GREE_ON RB5=1;RB7=0;//L3绿灯亮 //----------------------------------------------------------- //模拟输入通道宏定义 #define AN0 CHS2=0;CHS1=0;CHS0=0; #define AN1 CHS2=0;CHS1=0;CHS0=1; #define AN2 CHS2=0;CHS1=1;CHS0=0; //----------------------------------------------------------- //----------------------------------------------------------- void adc_init() { //ad时钟选择 ADCS1=1;//FOSC/32 ADCS0=0; /*IF CPU IS PIC16F7X7 VCFG1=0; VCFG0=0;//vref=vdd-vss */ PCFG0=0; PCFG1=0; PCFG2=0;//VREF=VDD-VSS ADON=1;//打开ad模块 ADIF=0;//清除ad中断标志 ADIE=0;//打开ad模块中断 } //----------------------------------------------------------- void port_init()//端口初始化 { //端口b 设置 TRISB0=0;TRISB1=0;TRISB2=0;TRISB3=0;TRISB4=0;TRISB5=0 ; TRISB6=1;//输入 TRISB7=0;//RB端口方向设置 PORTB=0;//输出0 RBPU=0;//使能内部弱上拉 INTE=0;//禁止RB0中断 RBIF=0; RBIE=1;//允许RB端口电平变化中断 //端口c设置 TRISC=0X00;//PORTC are outputs PORTC=0;//输出为0 RC1=RC2=0; RC3=1;RC4=0; //timer0 init T0CS=0;//选择内部指令时钟 T0IF=0; //T0IE=1;//在第一次ccp1比较后打开中断使能 //timer1 TMR1CS=0;//定时器模式 } //---------------------------------------------------------- //---------------------------------------------------------- //软件延时子程序*/ void DELAY() { unsigned int i; for(i=2000;i>0;i--); } //---------------------------------------------------------- voidinit_start()//开始 { L1_RED_ON;L2_RED_ON;L3_RED_ON; DELAY();DELAY();DEL AY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY( );DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();D ELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DEL AY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DE LAY(); DELAY();DELAY();DELAY();DELAY(); L2_OFF;L3_OFF;L1_OFF ; DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DE LAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELA Y();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY(); DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DE LAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); L1_GREE_ON;L2_GREE_ON;L3_GREE_ON; DELAY();DELAY();DELAY ();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY(); DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DE LAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELA Y();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DELAY(); DELAY();DELAY();DELAY();DEL AY(); DELAY();DELAY();DELAY();DELAY(); L2_OFF;L3_OFF;L1_OFF; } //---------------------------------------------------------- bit k,power;//关机及按键标志 bank1 unsigned char tm_sum;//系统实际变量 bank1 unsigned char ad_res_1,ad_res_0,ad_res_2; //ad转换结果寄存器 bank1 float sin_am,sin_l,sin_d;//浮点数,幅值变量,临时变量,临时变量 bit sin_up;//sin函数正负半周标志 bit tmr_s,tmr_d,crut_ie;//定时标志,定时标志变化标志,电流延时保护允许 unsigned char crut_tmr;//电流延时时间变量 unsigned char power_s;//电源动作延时变量 bit power_ie;//电源允许动作标志 bit power_up;//初次开机标志 unsigned char power_up_s;//初次开机延时标志 bit crut_if;volue_if; //-----------AD1通道转换-------------------- void ad_0() { AN0;//选择通道0 DELAY();//延时,采样电容充电 ADGO=1;//开器AD while(ADGO);//等待ad结束 ad_res_0=ADRES;//结果转存到变量AD_RES_0 } //-----------AD1通道转换-------------------- void ad_1() { AN1; DELAY(); ADGO=1;while(ADGO); ad_res_1=ADRES; if(ad_res_1 >132){sin_am-=0.005;if((ad_res_1-132)>10)sin_am-=0.04; } else if((ad_res_1<=132)&&(ad_res_1>=130))sin_am+= 0; else if(ad_res_1<130) {sin_am+=0.005;if((130-ad_res_1) >10)sin_am+=0.04;} if(sin_am>1.6)sin_am=1.6; } //------------AD2通道转换------------------- void ad_2() { AN2; DELAY(); ADGO=1;while(ADGO); ad_res_2=ADRES; } //------------------------------------------- const unsigned charsin_[]={40,50,73,85,100,113,127,141,157,170,180,189,196,200,20 3, 204,//正半周 204,//负半周 203,200,195,188,179,169,157,144,129,113,96,78,59,39,15}; u nsigned char sin_num;//SIN函数表查表变量 //------------------------------------------------------------------------------- void CCP_start() { CCPR2L=0X0;//设置CCP2,0%的脉宽输出 CCPR1L=0X0;//设置CCP1,0%的脉宽输出 TRISC=0X00;//PORTC are outputs PR2=0Xff;//设置PWM的工作周期,16Mhz,PWM周期15.562khz CCP1M3=1;CCP1M2=1;//CCP1模块PWM模式 CCP2M3=1;CCP2M2=1;//CCP2模块PWM模式 sin_up=1;//正负半周SIN函数 sin_num=0;//脉宽周期调整计数器 sin_am=0;//sin 函数的幅值 sin_am=0.3000;//sin函数的幅值 crut_ie=1;//电流慢保护允许 } //-------------中断服务程序------------------------------------ void interrupt key_ccp_timer() { if(TMR2IF&TMR2IE){TMR2IF=0;//定时器2中断服务函数 if(sin_num==31){sin_num=0;sin_up=!sin_up;} sin_d=sin_[s in_num]; sin_l=sin_am*sin_d;if(sin_l>=255)sin_l=255;//限幅if(sin_up) {CCPR2L=(unsigned char)sin_l;CCPR1L=0;}//换向else {CCPR1L=(unsigned char)sin_l;CCPR2L=0;}//换向sin_num++; } CLRWDT();//清除看门狗 if(RBIF&&RBIE){RBIF=0;if((!RB6)&&power_ie)k=1;}//端口b中断服务函数 if(TMR1IF&TMR1IE){TMR1IF=0;tm_sum++;if(tm_sum==31){t m_sum=0;tmr_s=!tmr_s;tmr_d=1;}} //定时器1中断服务函数 } //************************************************************ ************************ main() { CLRWDT(); //清除看门狗 port_init();//端口初始化 init_start();//开机状态 adc_init();//ad 通道初始化 //----- RC4=0;//继电器关闭 RC3=1;//关闭脉冲封锁 //----- TMR1CS=0;//同步模式 T1SYNC=0;//内部指令周期 TMR1H=0XFD; TMR1L=0X10;//定时器1初值 TMR1IE=1;//定时器1中断使能 //----- TRISC=0X00;//端口C输出 TRISC1=TRISC2=1;//RC1,RC2输入模式 PEIE=1;//外围模块中断使能 TMR2IE=1;//打开定时器2中断使能 GIE=1;//开全局中断 TMR2ON=1;//打开定时器2 TOUTPS3=0;TOUTPS2=1;TOUTPS1=0;TOUTPS0=0;//定时器2后分频器5分频 TMR1ON=1;//打开定时器1 power_ie=1;//允许开机 while(1) { CLRWDT();//清除看门狗 if(k){ DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();//延时DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();//延时 if(k&&RB6){k=0;power=!power;}//开关机标志 if(power)//开机 { power_ie=0;//开关间隔开始计时 RC3=0;//打开脉冲封锁 RC4=1;//打开继电器 L3_RED_ON;//打开L3绿灯 CCP_start();//开始SPWM } if(!power)//关机 { power_ie=0;//开关间隔开开始计时 crut_if=0;//电流保护标志清零 volue_if=0;//电池电压保护标志清零 L1_OFF;//关灯 L2_OFF; L3_OFF; RC3=1;//关闭脉冲封锁 CCP2CON=0;CCP1CON=0;//复位CCP模块 RC2=RC1=0;//置端口固定电平 L3_OFF;//关闭L3绿灯 RC4=0;//关闭继电器 } } //-----输出电流检测 if(power_up) { if(ad_res_0>=204)//电流高于4v,快保护 { crut_if=1;crut_tmr=0;crut_ie=0; L2_GREE_ON;RC3=1;RC4= 0;L3_GREE_ON; } if((ad_res_0>=102)&&(ad_res_0<204))//高于2v电流慢保护 { L2_GREE_ON; if(tmr_s&&tmr_d&&crut_ie)//时基,时基变化标志,保护允许 { tmr_d=0;crut_tmr++; if(crut_tmr==10) { crut_tmr=0;crut_ ie=0;crut_if=1;//保护 L2_GREE_ON;RC3=1;RC4=0;L3_GREE_ON; } } } if(ad_res_0< 102){crut_tmr=0;L2_OFF;if(crut_if)L2_GREE_ON;}//电流正常低于2v //-----电池电压检测 if(ad_res_2>=102){L1_OFF;if(volue_if)L1_GREE_ON;} //电池电压大于2v,L1红灯灭 if((ad_res_2<102)&&(ad_res_2>=91)){L1_GREE_ON;}//电池低于2v大于1.8v if(ad_res_2<92){volue_if=1;L1_GREE_ON;RC3=1;RC4=0;L 3_GREE_ON;} //电池低于1.8v } //-----模拟采集 if(power)ad_1();//在开机状态下检测反馈电压 ad_2();//采集电池电压 ad_0();//采集电流 if(power_ie==0)//开关机时间间隔 { if(tmr_s&&tmr_d){tmr_d=0;power_s++;} if(power_s==10){ power_s=0;power_ie=1;} } if(power_up==0)//上电延时1秒检测电池电压 { if(tmr_s&&tmr_d){tmr_d=0;power_up_s++;} if(power_up_s ==1){power_up_s=0;power_up=1;} }使用特权。
#include<htc.h> //包含单片机内部资源预定义#include<stdio.h>__CONFIG(0x3b31);#define uchar unsigned char#define uint unsigned intuint led_ct=0;//led状态存储#define RXMAX 64 //长度64位unsigned char pRx,RxBuf[RXMAX];//就收缓存函数//延时函数void delay(uint x){uint a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}//初始化函数void init(){TRISA=0XFF;ADCON1=0x80;// ADCON0=0x41;TRISC=0XCF; //设置C口方向全为输出1100 0111 RC7 RC6串口模式必须设置为输出SPBRG=25; //设置波特率TXSTA=0X24; //使能串口发送,选择高速波特率RCSTA=0X90; //使能串口工作,连续接收RCIE=1; //使能接收中断GIE=1; //开放全局中断PEIE=1; //使能外部中断delay(10);}//接受中断函数void interrupt com(void){if(RCIE&&RCIF)//判断是否为串口接收中断{if(pRx<RXMAX) RxBuf[pRx++]=RCREG;RCIF=0;}}/*===================================命令代码处理函数===================================*//*等待pRx(接收字节数)到某个数目,最多等待200ms.return:0=ok,1=error*/ unsigned char delay4bytes(unsigned char n){unsigned char nms=0;while(pRx<n){nms++;if(nms>100) return 1;delay(2);}return 0;}//清除接受缓存区void clrRxBuf(void){while(pRx) RxBuf[pRx--]=0;RxBuf[0]=0;pRx=0;}uint getad0() //模拟通道1{uint i=0,a,adval0;for(a=0;a<30;a++){ADCON0=0x41; //0100 0001GO=1;delay(1);while(GO);adval0=ADRESH;//00000000 00000011adval0=adval0<<8|ADRESL;//00000011 11111111adval0=adval0/4;i=i+adval0;}adval0=i/30;return (adval0);}uint getad1()//模拟通道2{uint i=0,a,adval1;for(a=0;a<30;a++){ADCON0=0x49; //0100 1001GO=1;delay(1);while(GO);adval1=ADRESH;//00000000 00000011adval1=adval1<<8|ADRESL;//00000011 11111111adval1=adval1/4;i=i+adval1;}adval1=i/30;return (adval1);}uint getad2()//模拟通道3{uint i=0,a,adval2;for(a=0;a<30;a++){ADCON0=0x51; //0100 0001GO=1;delay(1);while(GO);adval2=ADRESH;//00000000 00000011adval2=adval2<<8|ADRESL;//00000011 11111111adval2=adval2/4;i=i+adval2;}adval2=i/30;return (adval2);}uint getad3()//数字通道1{uint adval3;if(RC1==1)adval3=0xAA;if(RC1==0)adval3=0x00;return (adval3);}uint getad4()//数字通道2{uint adval4;if(RC2==1)adval4=0xAA;if(RC2==0)adval4=0x00;return (adval4);}uint getad5()//数字通道3{uint adval5;if(RC3==1)adval5=0xAA;if(RC3==0)adval5=0x00;return (adval5);}void main(){int temp[6];init();while(1) //等待中断{led_ct++;if(led_ct<50) RC4=0;else if(led_ct<100) RC4=1; else led_ct=0;//依据led变量的状态,改变led控制脚if(pRx)//如果有接收字节{if(RxBuf[0]==0xab){if(!delay4bytes(2)){//等待接收到5个字节,如果超时则不处理,清除缓冲区if(RxBuf[1]==0x42){while(1){while(GO)ADCON0=0x41;delay(1);temp[0]=getad0();delay(10);while(GO)ADCON0=0x49;delay(1);temp[1]=getad1();delay(1);while(GO)ADCON0=0x51;delay(1);temp[2]=getad2();delay(1);temp[3]=getad3();delay(1);temp[4]=getad4();delay(1);temp[5]=getad5();delay(1);TXREG=79;delay(1);TXREG=75;delay(1);TXREG=temp[0];delay(1);TXREG=temp[1];delay(1);TXREG=temp[2];delay(1);TXREG=temp[3];delay(1);TXREG=temp[4];delay(1);TXREG=temp[5];delay(1);clrRxBuf(); delay(500);if(pRx)//如果有接收字节{if(RxBuf[0]==0xab){if(!delay4bytes(2)){//等待接收到5个字节,如果超时则不处理,清除缓冲区if(RxBuf[1]==0x43){// asm("goto 0");asm("ljmp 0");}}}}}}}}// clrRxBuf();}}}。
基于PIC单片机的双积分AD转换器的仿真实验环境:Proteus编程语言:汇编编程环境:MPLAB IDE单片机:PIC16F877晶振:4MHz设计说明:虽然PIC单片机有自带的AD转换,但在有些情况下,使用单片机组成的双积分AD转换器却以期高抗干扰的特性,在小型仪表或一些对速度要求不高的场合却是很实用的。
一下是本设计的图纸,仿真,及相关源代码。
(由于本人在模拟电子方面不擅长,实测电压有约50mv的误差)仿真图:图(1)仿真效果图图(2)积分电路图图(3)单片机引脚连接图(4)系统总图图(5)三个控制开关及积分电压变化时序图部分程序源代码:ORG 0X0000GOTO MAINORG 0X0004MOVWF BWSW APF ST ATUS,0CLRF ST ATUSMOVWF BST ATUSMOVF FSR,0MOVWF BFSRMOVF PCLATH,0MOVWF BPCH;***************************以上是中断现场保护CLRF PCLATHBTFSC PIR1,2GOTO CP1INTBTFSC PIR1,0GOTO T1INT;******************以上是中断源判别INTOUT: CLRF ST ATUSMOVF BFSR,0MOVWF FSRMOVF BPCH,0MOVWF PCLATHSW APF BST ATUS,0MOVWF ST ATUSSW APF BW,1SW APF BW,0RETFIE;***********************************以上是中断现场恢复CP1INT: BCF PIR1,2;CCP1引脚捕捉过零比较器的电压变化MOVF CCPR1L,0MOVWF VCOM1MOVF CCPR1H,0MOVWF VCOM2BTFSS ST ATUS,ZGOTO CP1LPBTFSC PIR1,0INCF T1VCTCP1LP: MOVF T1VCT,0MOVWF VCOM3BSF FLAG2,1CP1OUT: CLRF PORTEBSF PORTE,0CLRF FLAG1BSF FLAG1,0MOVLW .1MOVWF ADCTTCLRF T1VCTMOVLW 0XF8MOVWF TMR1HMOVLW 0X40MOVWF TMR1LGOTO INTOUTT1INT: BCF PIR1,0INCF T1VCTMOVF ADCTT,0SUBWF T1VCT,0BTFSS ST ATUS,CGOTO INTOUTBTFSC FLAG1,0GOTO ADC1CLRF PORTEBSF PORTE,0;关开关S1,给积分电容放电BSF FLAG1,0MOVLW .1MOVWF ADCTTMOVLW 0XFCMOVWF TMR1HMOVLW 0X28MOVWF TMR1LGOTO INTOUTT1OUT: CLRF T1VCTCLRF TMR1LCLRF TMR1HGOTO INTOUT;FANG DIANADC1: BTFSC FLAG1,1GOTO ADC2BCF PORTE,0;对待测电压进行积分BSF PORTE,1BSF FLAG1,1MOVLW .1MOVWF ADCTTCLRF T1VCTMOVLW 0XC1MOVWF TMR1HMOVLW 0X90GOTO INTOUT;DING SHI JIFENADC2: BCF PORTE,1BSF PORTE,2;对基准电压进行积分CLRF FLAG1MOVLW .20MOVWF ADCTTGOTO T1OUTMAIN: CLRF INTCONCLRF PIR1CLRF PIR2CLRF T1CONBANKSEL TRISAMOVLW H'F0'MOVWF TRISBMOVLW H'F8'ANDWF TRISECLRF TRISCBSF TRISC,2MOVLW 0X05MOVWF PIE1CLRF PIE2BANKSEL PORT ACLRF PORTBCLRF PORTEMOVLW .1MOVWF DIS0MOVWF DIS1MOVWF DIS2MOVWF DIS3MOVWF DIS4MOVWF DIS5MOVWF DIS6MOVWF DIS7CALL MAXINTBSF PORTE,0MOVLW .5MOVWF ADCTTMOVLW 0XC0MOVWF INTCONCLRF TMR1LCLRF TMR1HMOVLW .5BSF T1CON,0 DISL: BTFSS FLAG2,1;显示GOTO DISLBCF FLAG2,1MOVLW VCOM1MOVWF FSRMOVF INDF,0MOVWF COM8INCF FSRMOVF INDF,0MOVWF COM9INCF FSRMOVF INDF,0MOVWF COM10MOVLW .3MOVWF COM3BCF ST ATUS,CRRF COM10RRF COM9RRF COM8DECFSZ COM3GOTO $-5CLRF COM6CLRF COM5MOVLW .10MOVWF COM4CALL DIV24MOVF COM0,0MOVWF DIS0CALL DIV24MOVF COM0,0MOVWF DIS1CALL DIV24MOVF COM0,0MOVWF DIS2MOVF COM8,0MOVWF DIS3BSF DIS3,7CALL DISGOTO DISL;**************************** DIS: MOVLW H'04'MOVWF SEND_AMOVF DIS0,0MOVWF SEND_DCALL SENDMOVLW 03HMOVWF SEND_AMOVF DIS1,0MOVWF SEND_DCALL SENDMOVLW H'02'MOVWF SEND_AMOVF DIS2,0MOVWF SEND_DCALL SENDMOVLW 01HMOVWF SEND_AMOVF DIS3,0MOVWF SEND_DCALL SENDMOVLW H'00'MOVWF SEND_AMOVF DIS4,0MOVWF SEND_DCALL SENDRETURN;********************** DELAY: NOPNOPNOPNOPRETURNDELAYMS:MOVLW D'5'MOVWF COM2MOVLW D'200'MOVWF COM3DECFSZ COM3GOTO $-1DECFSZ COM2GOTO $-5RETURNSEND: MOVLW D'16'MOVWF TEMPBCF PORTB,LOADCALL DELAYBCF ST ATUS,CBCF PORTB,CLK SEND_LP: RLF SEND_DRLF SEND_ABCF PORTB,DINBTFSC ST ATUS,CBSF PORTB,DINCALL DELAYBSF PORTB,CLKCALL DELAYBCF PORTB,CLKDECFSZ TEMP,1GOTO SEND_LPBSF PORTB,LOADBSF PORTB,DINRETURNMAXINT: MOVLW H'0C'MOVWF SEND_AMOVLW H'01'MOVWF SEND_DCALL SENDCALL DELAYMOVLW H'09'MOVWF SEND_AMOVLW H'FF'MOVWF SEND_DCALL SENDCALL DELAYMOVLW H'0A'MOVWF SEND_AMOVLW H'08'MOVWF SEND_DCALL SENDCALL DELAYMOVLW H'0B'MOVWF SEND_AMOVLW H'04'MOVWF SEND_DCALL SENDCALL DELAYRETURN;************除十DIV10: MOVLW D'10'MOVWF COM4CLRF COM5MOVLW D'8'MOVWF COM6DIV101: BCF ST ATUS,CRLF COM3RLF COM5BSF COM3,0MOVF COM4,0SUBWF COM5BTFSS ST ATUS,CCALL ADDDECFSZ COM6GOTO DIV101RETURNADD: MOVF COM4,0ADDWF COM5BCF COM3,0RETURN;********************************D_SUB: MOVF COM4,0 ;CMO1 COM0-COM5 SUBWF COM0,1MOVF COM5,0BTFSS ST ATUS,CINCFSZ COM5,0 ;CARRY=0SUBWF COM1,1RETLW 0;******************************************** SUB33: CALL D_SUB ;COM2 COM1 COM0- MOVF COM6,0 ;=COM2 COM1 COM0BTFSS ST ATUS,CINCFSZ COM6,0SUBWF COM2,1RETLW 0;********************************************;****************************************D_ADD: MOVF COM4,0 ;COM1 COM0+COM5 CO ADDWF COM0,1MOVF COM5,0BTFSC ST ATUS,CINCFSZ COM5,0ADDWF COM1,1RETLW 0;****************************************** ADD33: CALL D_ADDMOVF COM6,0BTFSC ST ATUS,CINCFSZ COM6,0ADDWF COM2,1RETLW 0;******************************************** DIV AB: CLRF COM6 ;COM10 COM9 COM8/C CLRF COM10 ;RESULT=COM10 COM9 DIV24: CLRF COM0CLRF COM1CLRF COM2 ;24CLRF COM12MOVLW D'24'MOVWF COM7DIV A1: BCF ST ATUS,CRLF COM8RLF COM9RLF COM10RLF COM0RLF COM1RLF COM2 ;24BSF COM8,0CALL SUB33BTFSC ST ATUS,CGOTO DIV A2DIV A4: CALL ADD33BCF COM8,0DIV A2: MOVF COM12,1BTFSS ST ATUS,ZGOTO DIV A3DIV A5: DECFSZ COM7,1GOTO DIV A1RETLW 0DIV A3: INCF COM3,1BTFSS COM9,7GOTO DIV A5RETLW 0END。
PIC16程序设计及应用编写:孔勇第二版2008年12月2日·成都目录1.PIC单片机简介 (3)2.PIC单片机组成原理 (6)2.1基本组成 (6)2.2振荡器配置方法 (6)2.3 PIC单片机的电源和时钟 (7)2.4常用PIC系列芯片引脚功能 (8)2.5 PIC单片机16F8X系列简介 (9)2.6 PIC系列单片机数据存储器的特点和功能 (10)3.PIC单片机汇编语言常用指令 (13)3.1 PIC汇编语言指令格式 (13)3.2清零指令 (14)3.3面向字节常数与控制操作的指令 (15)4.PIC单片机汇编设计 (18)4.1程序的基本格式 (19)4.2程序设计基础 (20)5.PIC单片机C语言设计 (27)5.1 PIC 单片机C 语言编程简介 (27)5.2 Hitech-PICC 编译器 (27)5.3 MPLAB-IDE 内挂接PICC (28)5.4 PIC 单片机的C 语言原程序基本框架 (29)5.5 PICC 中的变量定义 (30)5.6 PICC 中的子程序和函数 (36)5.7 PICC 定义特殊区域值 (38)5.8 MPLAB-IDE 中实现PICC 的编译选项设置 (39)5.9 C 和汇编混合编程 (44)6.PIC应用设计 (49)6.1 PIC单片机开发的常见问题 (49)6.2 PIC16F73逆变器 (54)1.PIC单片机简介1、引言据统计,我国的单片机年容量已达1-3亿片,且每年以大约16%的速度增长,但相对于世界市场我国的占有率还不到1%。
这说明单片机应用在我国才刚刚起步,有着广阔的前景。
培养单片机应用人才,特别是在工程技术人员中普及单片机知识有着重要的现实意义。
当今单片机厂商琳琅满目,产品性能各异。
针对具体情况,我们应选何种型号呢?首先,我们来弄清两个概念:集中指令集(CISC)和精简指令集(RISC)。
采用CISC结构的单片机数据线和指令线分时复用,即所谓冯.诺伊曼结构。
pic16f单片机例程如何在PIC16F单片机上实现一个简单的LED闪烁程序PIC16F系列是微芯科技公司推出的8位单片机系列产品,被广泛应用于各种嵌入式系统中。
其中,PIC16F877A是该系列中应用最广泛的一款单片机。
本篇文章将介绍如何使用PIC16F877A单片机,通过编写一个简单的LED闪烁程序来展示其基本的程序控制能力。
第一步:准备硬件设备要实现LED闪烁程序,我们需要以下硬件设备:- PIC16F877A 单片机- 开发板- LED- 适配器(用于将单片机上的数字电压转换为LED所需的电压)将PIC16F877A单片机插入开发板的合适位置上,并连接好适配器和LED。
确保硬件设备连接正确,以便在编写程序后能够顺利进行实验和调试。
第二步:编写闪烁程序C语言是编写PIC单片机程序的常用语言。
我们将使用MPLAB X IDE和XC8编译器来编写闪烁程序。
按照以下步骤进行设置和编写程序。
1. 安装MPLAB X IDE以及XC8编译器,确保其正常运行。
2. 打开MPLAB X IDE,创建一个新工程。
选择"Microchip Embedded" -> "Standalone Project",并选择合适的工具链(例如:XC8)。
3. 选择PIC16F877A作为目标设备。
4. 定义单片机的时钟频率和相关配置参数。
在项目窗口的“Properties”下,选择"XC8 Global Options" -> "PIC14/PIC16" -> "Configuration bits",并设置好需要的参数(例如:时钟频率、使能位等)。
5. 在工程目录下创建一个新的.c文件,用于编写闪烁程序。
例如:ledBlink.c6. 编写闪烁程序的代码。
以下是一个简单的LED闪烁程序示例:c#include <xc.h>#define _XTAL_FREQ 8000000函数声明void init(void);void delay(void);主函数int main(void) {init();无限循环while(1) {设置LED端口为高电平PORTDbits.RD0 = 1;延时delay();设置LED端口为低电平PORTDbits.RD0 = 0;延时delay();}return 0;}void init(void) {将RD0引脚配置为输出TRISDbits.RD0 = 0;初始化RD0引脚为低电平PORTDbits.RD0 = 0;}void delay(void) {延时函数,用于控制LED闪烁的速度__delay_ms(500);}第三步:编译和下载程序完成程序的编写后,我们需要将其编译成二进制文件并下载到PIC16F877A单片机中。
PIC16F917 Time0 定时/计数器练习程序/*************PIC16F917 单片机程序******************************//*****File Function : Time0 定时器/计数器练习程序*****//*****Program Author : ZhengWen(ClimberWin)*****//*****MCU:PIC16F917 内部晶振*****//*****Compile Date : 2010/08/17*****//*****Edition Info : V1.0*****//*************************************************************///使用内部Time0 定时器/计数器,进行LED 计数显示//引脚定义:PORTD=8LED,KEY=RB0(INT)/*修改日期: *//************************************/#include#define uchar unsignedchar#define uint unsigned intvoid Init(void);//初始化子程序#define KEY RB0uchar led_num;//定义LED 计数值存储地址uchar T0_Count;void Init(void){ PORTB = 0B00000000; PORTD = 0B00000000; TRISB = 0B00100001;//设置RB0 为输入,作为按键口TRISD = 0B00000000;//设置PORTD 口为输出,作为LED 显示口PORTD=~led_num;///////////Time0 配置/////////////////////////////////////// T0CS=0;//配置为定时器模式PSA=1;//T0 不分频,预分频器分配给WDT T0IE=1; //T0 定时器使能T0IF=0; //T0 定时器标志位,1 表示有中断,必须软件清零GIE=1;//全局中断使能}/////////////定时器0 子程序//////////////////void interrupt Time0(void)//进入中断计数值加1,并输出显示{TMR0=0x00;//定时器初始值T0IF=0; //清除中断标志位T0_Count++;if(T0_Count==200) { PORTD=~led_num; led_num++; }else {;}}。
PIC16f 8位单片机汇编指令集1。
ADDWF f, d,f寄存器内容与W寄存器相加,d=1时结果放在f,d=0是结果在W,影响STATUS 的C,DC和Z标志。
该条指令影响的状态与MCS51一致,有进位时C=1,有半进位时DC=1;否则相反。
结果为0时Z标志置位。
2。
ANDWF f, d,f寄存器内容与W寄存器相与,d=1时结果回存至f,d=0时结果存至W,结果影响STATUS的Z标志位。
3。
CLRF ( CLEAR File Register), 清空页寄存器,STATUS的Z标志位置位4。
CLRW (CLEAR WREG),清空W寄存器,STATUS的Z标志位置位,可以用MOVLW 0H等同使用5。
COMF f, d,f寄存器内容取反,d=1时结果存至f寄存器,d=0时结果存至W寄存器。
影响Z标志位。
6。
DECF f, d,f寄存器内容自减1,d=1时结果存放于f;d=0时结果存放于w,影响STATUS的Z标志位。
7。
DECFSZ f, d f寄存器内容自减1,为0则跳行,d=1时结果在f寄存器;d=0时结果在W寄存器。
不影响标志位。
8。
INCF f, d,f寄存器内容自加1,d=1时结果回存至f,d=0时结果在W。
影响Z标志位。
9。
INCFSZ f, d,f寄存器内容自加1,结果为0则跳行。
d=1时结果回存至f;d=0时结果存至W寄存器。
该指令不影响标志位。
10。
IORWF f, d,f寄存器内容与W寄存器相或,d=1时结果回存至f,d=0时结果存至W,结果影响STATUS的Z标志位。
11。
MOVF f, d,当d=1时,f寄存器内容不变,d=0时f寄存器内容复制到W寄存器。
当d=1时,只改变Z标志位,可以用与判断f寄存器内容是否为0。
12。
MOVWF , f (MOVE WREG to File Register),很常用的一条指令,将W寄存器的内容保存到RAM 中去13。
NOP,没什么可说的,空操作而已,但是确实很常用的语句,短延时必须的。
锁相环电路设计和调试心得真正是调试才能发现设计中的问题。
太哦是工程的第一件就是先调节电源电路。
在电电原的调试过程中,我发现LM317输出总是受到输入的影响。
可能就是因为调节端子的电流在输出端产生的电压太大了,这个原因可能和我采用比较的大电位器来作为调节电阻有关。
1.锁相环的设计的起因:这个电路设计的初衷就是为了我项目中的DDS电路提供可选的时钟输入。
因为我选用的DDS电路本身自带有内部的倍频器,其实现的方法就是内部的锁相环。
开始我一位内部的锁相环会比我自己外部设计性能更好,但是后来查到AD的技术资料,发现内部的锁相环的性能并不是达到很好的配置,仔细一想,也是这样的,因为外部的环路滤波器的配置对于任意的频率都如此,显然没有经过精心设计的更加有效果。
鉴于上面分析的原因,我把采用锁相环提供时钟作为一项可选的优化方案。
再有一个原因,就是大学的时候采用的锁相环,到最后也没有调好,所以对这件事情还是老放不下,所以想借此机会完善一下这个过程。
2.锁相环的设计过程:整个设计过程,比起dds电路来说,时间是非常的短的。
原因之一就是整个PLL 的设计就是一个芯片实现。
比大学的PLL要简单一些。
再有就是,这个毕竟不是项目的重点,而是一个改进方案。
电路板采用两层板设计,环路滤波器在背板设计。
环路滤波器的设计采用AD公司的ADSIMPLL。
开始的供电设计,由于电路板的走线上比较困难,所以采用多处引线的方法。
后来调试过程中发现,这样做是在是太麻烦,也比较危险,因为万一出现加反电,或加错电压就危险了。
所以我建议以后做电路时,采用通用的便携式的变压器插头,这样调试起来就非常的简单了,不用再依赖于庞大的稳压电源了,而且绝对不会出现危险。
调试时发现电路中的测试点对于测试非常的方便,对于地,可以留两个焊盘,然后安装弧形的金属勾,这样对于采用示波器测试是非常方便的,可以很方便的用小架子加上。
再有就是安装孔的问题,内径为3mm的安装空可以采用通用的八角螺母进行固定,这样对于调试和焊接,即方便有安全。
学习之6---看门狗定时器(WDT)//PIC.H中定义了宏#define CLRWDT() asm("clrwdt")因此在PICC的c语言中可以直接使用CLRWDT()对WDT清0//若单片机WDT使能,在适当位置加入CLRWDT(),程序进入正常运行时,每隔一定时间均会执行CLRWDT()语句对WDT清0,芯片不会复位//如果程序陷入死循环,不会执行到CLRWDT()语句,则超出所设定的时间后,WDT溢出使芯片复位,从头(000H)开始执行,单片机恢复正常运行//PIC16F单片机,看门狗定时器的启用只能在芯片的烧写时确定,即无法用软件来开启或关闭WDT,但在PIC16f88X中可以。
//PIC16单片机的WDT基本溢出时间为18MS,由RC充放电时间确定,在-40~85度之间变化时,WDT基本溢出时间在7-33ms变化#include<pic.h>__CONFIG(0X3F3D);//开启WTDvoid DELAY(unsigned int);#define LED1 RB1main(void){TRISB=0B11111101;OPTION=0B11111011; //WDT的分频比为1:8,最大复位时间为18*8=144msif(TO==0)// 若写成T0,则编译出错。
{LED1=1; //看门狗定时器溢出,仿真时溢出TO不会清零}elseLED1=0;while(1){DELAY(100);//模拟一个运行100ms的子程序CLRWDT();DELAY(200);//模拟一个运行200ms的子程序,此时会产生溢出(200ms>144ms)CLRWDT();};}void DELAY(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--)NOP();}学习之7--EEPROM的读写EEPROM特点:掉电时保持不变,F877A的EEPROM参数是保证1 000 000次擦除,数据保存>40年PICC中定义了读/写EEPROM的宏EERPOM_WRITE(addr,value); EEPROM_READ(addr);//PICC中系统已经为我们定义了读/写EEPROM的宏//宏EEPROM_WRITE写入EEPROM,只是启动写入过程,写完要几MS,当读/写EEPROM 时,程序会自动检测是否还在写,若是,则等待//C程序编写不涉及EECON1,EECON2#include<pic.h>__CONFIG(0X3F39);__EEPROM_DATA(89,34,48,210,53,192,7,57);//初始化EEPROM,分别写入单元0~7main(void){char aa;aa=EEPROM_READ(3);//读EEPROM单元3的内容EEPROM_WRITE(9,0X9A);//将0X9A写入EERPOM的单元9aa=EEPROM_READ(9);//读EEPROM单元9的内容while(1);}。
PIC16F877原理简介1.1 PIC16F877特性:PIC16F877是由Microchip公司所生产开发的新产品,属于PICmicro系列单片微机,具有Flash program程序内存功能,可以重复烧录程序,适合教学、开发新产品等用途;而其内建ICD(In Circuit Debug)功能,可以让使用者直接在单片机电路或产品上,进行如暂停微处理器执行、观看缓存器内容等,让使用者能快速地进行程序除错与开发。
如图1为PIC16F877的40根接脚图,PDIP是指一般最常见的DIP(Dual In Line Package)包装,而PIC单片机也有PLCC(Plastic Leaded Chip Carrier)与QFP(Quad Flat Package)两种形式的包装,依照不同的需求,寻找不同的包装形式。
如图所示,每根接脚都有其特定功能,例如Pin11与Pin32(VDD)为正电源接脚,Pin12与Pin31(VSS)为地线接脚;而有些接脚有两种甚至三种以上功能,例如Pin2(RA0/AN0)代表PORTA的第一支接脚,在系统重置(Reset)后,可自动成为模拟输入接脚,接收模拟讯号,也可经由程序规划为数字输出输入接脚。
图1. PDIP40引脚PIC16F877接脚说明图2. PDIP28和SOIC28引脚PIC16F877接脚图说明图3. PLCC44引脚PIC16F877脚位图说明图4. QFP44引脚PIC16F877引脚图说明PIC16F877属于闪控式(Flash)单片机,可以重复烧录,其ROM的容量总共是8K words,以2K为一个page,区分为4个pages;内部RAM总共有512个字节(00f~1FFh),以128个字节为一个Bank,共区分为4个Bank,如图5所示,每个Bank的前半段都有其特殊用途,分别连接到其特殊功能模块,例如I/O、CCP、Timer、USART、MSSP等。
ATMAGE16内部ADC的使用程序程序说明:本例程是控制ATMAGE16内部的AD进行转换,然后将转换结果转换成电压,显示到数码管上。
本人刚开始用A VR这是写的第一个程序,可能思路上会有很多问题,忘个位网友看后指出,我的邮箱是462511238@欢迎和我交流。
写这个程序的目的是为了用AD采集一个模拟量,在网上看了些历程,很多都是用查询发写的。
就是启动ADC转换以后,等待ADC转换完成,然后就将数据读出,显示出来。
这种程序也就只能自己玩玩,毫无实用价值。
因为在实际产品中,会有很多干扰信号,采集一次就显示,得到的数据往往是干扰信号。
要消除这些干扰,需要在ADC的输入通道上加上滤波电容,当然更重要的是在程序中进行处理。
这也就是所谓的数字滤波了,由于单片机运算能力有限,很多PC上的一些算法对于单片机来说就过于复杂了。
我在这个程序中,只是采用多次采集数据,然后求平均值的算法进行最简单的滤波的,但这在要求不高的场合已经能够满足要求了。
采用查询法,一直查询ADC是否转换结束是非常浪费CPU时间的。
因此我们需要开启ADC的中断,但是每隔多久进行一次转换呢,一直都不停的转换,其实对我们得到准确的数据意义不大,(我采集的是桥式应变片经过差分放大的信号)。
并且数据刷新太快,用于显示,会给人不稳定的感觉,还没看清楚显示的是什么,就又刷新了。
由于A VR的ADC可以用定时的溢出来触发转换。
于是我想到,用定时器来定时,每隔0.1S采集一次,1S 刷新一次显示,也就是每次显示的数据是采集十次数据的平均值,这样做出来还是比较稳定的。
程序实现思路:将ATMAGE16的定时器1设置为普通计数模式,并且将时钟256分频作为定时器1的工作脉冲(我采用的是4MHZ晶振)。
然后将ADC设置为定时器1溢出触发,当定时器溢出后,将触发ADC转换,ADC转换完成后,进入ADC中断,读取数据,并对定时器进行重装初值。
这样,就可以保证,每次进行ADC转换的间隔时间基本是一样的。
一、烧录工具1.编程器:PRO ICD2一个,USB连接线1条,5pin连接线1条2. PC电脑一台3.烧录工装一台(根据PCBA型号选择)二、烧录软件版本信息MPLAB IDE V8.10三、适用芯片MICROCHIP PIC16F676 SOIC-14P单片机,适用于在线烧录四、调试方法:1.取编程器,一端连PC电脑,另一端连接烧录工装,连接线的第一脚与烧录工装上的连接线第一脚对应;2.取PCBA,对应工装上的定位孔,卡于烧录工装上;3.双击电脑桌面上图标“MPLAB IDE v8.10”,打开软件界面;4.选择菜单“Configure- Select Device”,弹出“Device Select”窗口;图15.从Device下拉栏内选择PIC16F676,Device Family选择ALL,其它不变,然后按“OK”确认;图26.选择菜单Configure-→Configuration Bits…图37.弹出Configuration Bits设置窗口,将“Configuration Bits set in code”前的勾选去掉,将Oscillator参数设置为“Internal RC No Clock”,如图4;图48.重新将“Configuration Bits set in code”前的勾选勾上;图59.选择菜单Window-→Output,窗口清空;10.选择菜单File-→Import,选择需要烧录的文件,点击“打开”按钮;图6 11.确认校验码是否与《芯片拷贝申请记录表》上的校验码一致;图712.检查烧录器、PCBA连接,确保无误;13.选择菜单Programmer-→Select Programmer-→2 MPLAB ICD 2;图814.屏幕提示连接正确;图915.选择菜单Programmer-→Settings…图1016.选择Program选项卡,勾选Preserve EEPROM on Program,点击确定图1117.在屏幕空白处点击右键,弹出图12菜单,选择“Clear Page”;图1218.选择菜单Programmer-→Connect,屏幕显示连接正确;图1319.点击烧录图标,屏幕显示正确烧录结果;图14(注:若上图出现非黑色字体的编译信息,则说明编译出错,则需检查下载连接及设置是否正确)20.烧录完毕,在烧录OK的芯片上方打点做标记,取下PCBA,重复第18、19步,进行下一轮烧写;五、注意事项:1.烧录过程中,需配带防静电手腕扣,并确保静电腕扣接地良好;2.烧录过程中,校验码不能变化,如有误,须立即停止烧录,并按步骤,重新调试程序;3.烧录过程中,注意做好区分标识,不可混装;六、相关文件及表单:1.《芯片拷贝申请记录表》。
pic16 c语言实例如何使用PIC16 C语言编程实现中括号内的主题PIC16系列是一种常见的微控制器,广泛应用于各种嵌入式系统中。
它的编程语言是汇编语言和C语言,本文将以中括号内的内容为主题,介绍如何使用PIC16 C语言编程来实现这个主题。
第一步:初始化在使用PIC16 C语言编程之前,首先需要对微控制器进行初始化设置。
这包括配置时钟源、IO引脚、中断等。
通过设置合适的初始化程序,可以确保微控制器正常运行,并且能够与外部设备进行通信。
第二步:引入必要的库文件在开始主题的编程之前,需要引入相应的库文件。
这些库文件通常包含了一些常用的函数和宏定义,可以简化编程过程。
例如,如果需要使用串口通信,可以引入串口库文件,而不必自己编写相应的函数。
第三步:定义和初始化变量在编程过程中,需要使用各种不同类型的变量来存储数据。
在开始主题的编程之前,需要定义和初始化相应的变量。
例如,如果主题是“温度监测”,那么需要定义一个浮点型变量来存储温度值,并初始化为0。
第四步:编写主题相关的函数一个主题通常涉及多个功能和操作,为了方便管理和调用,可以将相关的代码封装在一个函数或多个函数中。
例如,如果主题是“温度监测”,则可以编写一个函数来读取温度传感器的数值,并返回温度值。
第五步:编写主程序在PIC16 C语言编程中,主程序是整个程序的入口点。
在主程序中,可以定义多个函数调用和逻辑控制语句,以实现所需的功能。
通过调用之前编写的函数,可以实现主题的具体功能。
例如,如果主题是“温度监测”,则可以在主程序中通过循环不停地调用温度读取函数,并将温度值打印出来。
第六步:调试和测试编写完主题相关的代码后,需要进行调试和测试,以确保程序的正确性和稳定性。
在PIC16 C语言编程中,可以使用调试工具或者逐步调试的方法,逐行执行代码,检查程序的运行状态和输出结果。
如果发现问题,可以通过修改代码或重新调整硬件来解决。
第七步:优化和改进在调试和测试的过程中,可能会发现一些问题或不足之处。
PIC16F917单片机c语言源程序ad变换,pwm输出,数码显示//说明:完整的PIC16F917编写的c语言程序,通过编译,内容包含有ad变换,pwm输出,数码显示(通过串口移位显示),串行口通讯等#include;#define uchar unsigned char#define uint unsigned int__CONFIG(0x20e4);#define choose1 RC4#define choose2 RC3#define power_high RA6#define power_low RA4#define relay_w RE2#define relay_v RB5#define relay_u RA0#define data1 RD0#define clk1 RA7#define bell RD3#define power_supply RD6#define pha RB2#define phb RB3#define phc RB4#define spa RB0#define spb RB1#define up RC1#define down RC2#define up1 RD2#define down1 RC0#define safe RD7#define start RD5 #define speeder RD4 #define KDF RD1#define test_num1 1 #define test_num2 2 #define test_num3 3 #define test_num4 4 #define test_num5 5 #define test_num6 6 #define test_num7 7 #define test_num8 8 #define test_num9 9 #define test_num10 10#define test_num11 11 #define test_num12 12 #define test_num13 13 #define test_num14 14 #define test_num15 15 #define test_num16 16 #define test_num17 17 #define test_num18 18 #define test_num19 19 #define test_num20 20 #define test_num21 21 #define test_num22 22 #define test_num23 23 #define test_num24 24 #define test_num25 25 #define test_num26 26 #define test_num27 27 #define test_num28 28 #define hold 29#define stop 30#define setout 31#define test_err 32#define power 33#define TEST_5045 34#define TEST_5046 35#define TEST_5055B 36#define power1 37#define setout1 38#define setout2 39#define disp_refresh 100const uchartable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0, 0xfe,0xf6,0xee,0xfe,0x9c,0xfc,0x9e,0x8e,2,0x10,0x 80,4};const uchartable1[]={0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1 ,0xff,0xf7,0xef,0xff,0x9d,0xfd,0x9f,0x8f,0x6f,0x0 d};ucharkeyvalue=1,keystate=0,keypull=0,status=setout,rcd ata1=0x55,rcdata2=0x55,rcdata3=0x55,status2=0; ucharerr_status=0,disp_run=0,ad_test=0,test15_tmp1=0,t est15_tmp2=0,test15_tmp3=0,test15_tmp4=0,disp_mod=0,disp_hold=0;uint rcdata,disp_time1=0,ad_data1,ad_data2; volatile unsigned intkeytime=0,bell_time=0,test_time=0,err_time=0,disp _time=0,tx_time=0;void disp(uchar num1,uchar num2,uchar num3); // 76usvoid disp10(uchar j); // 314usvoid keyscan(void);void key1(void);void init(void);void delaye(uint x);void outpwm(uchar x);void addisp(uint a);void addisp_8(uchar a);void disp20(uchar i,uchar j);void disp16(uint j);void err_disp(uchar j);void disp21(uchar i,uchar j);uint ad(uchar x);//3次加和一个除法 87usvoid main(){uchar tx_conut=0;init();while(1){if(status==setout1){if(disp_time>;disp_refresh){disp(table[18],table[18],table[18]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;}else if(status==setout2){if(disp_time>;disp_refresh){disp(table[19],table[19],table[19]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;}else if(status==setout){if(disp_time>;disp_refresh){disp(table[16],table[16],table[16]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;// TRISC7=0;// RC7=1;// speeder=1;if(keypull==1){bell=0;bell_time=0;keypull=0;status=power1;test_time=0;}}else if(status==power1){if(status2==TEST_5055B){TRISC7=1;TXSTA=0x26;RCSTA=0x90;SPBRG=103; //4.8k波特率power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;speeder=1;if(tx_time>;50&&TRMT==1){if(tx_conut==0){TXREG=0xfe;tx_time=0;tx_conut=1;}else if(tx_conut==1){TXREG=0xfd;tx_time=0;tx_conut=2;}else if(tx_conut==2){TXREG=0xfc;tx_time=0;tx_conut=3;}else if(tx_conut==3){TXREG=0xfb;tx_time=0;tx_conut=4;}else if(tx_conut==4){TXREG=0xfa;tx_time=0;tx_conut=0;}}if(rcdata1==0xaa)status=power;if(test_time>;1500)status=setout2; }elseif(status2==TEST_5046||status2==TEST_5045)status= power;}else if(status==power){power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(disp_time>;disp_refresh){disp(table[17],table[17],table[17]);disp_time=0;}if(status2==TEST_5046||status2==TEST_5045){TRISC7=0;RC7=1;speeder=1;}if(keypull==1){bell=0;bell_time=0;keypull=0;status=test_num1;TRISC7=1;TXSTA=0x26;RCSTA=0x90;SPBRG=103; //4.8k波特率test_time=0;disp_run=1;disp_time1=0;ad_test=1;ADCON0=0x85; //通道1ADCON1=0x50;}}else if(status==test_num1){spa=1;spb=1;pha=1;phb=1;phc=1;up=1;down=1;safe=1;up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=1;err_time=0;disp_hold=1;}}else if(status==test_num2){spa=0;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=2;err_time=0;disp_hold=1;}}else if(status==test_num3){if(status2==TEST_5046){spa=1;spb=1;pha=1;phb=0;phc=0;up=1;down=1;safe=1; up1=1;down1=1;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=3;err_time=0;disp_hold=1;}}else if(status2==TEST_5055B||status2==TEST_5045) {outpwm(200);test_time=0;status=test_num5;}}else if(status==test_num4){spa=0;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=4;err_time=0;disp_hold=1;}}else if(status==test_num5){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;172&&rcdata1;172&&rc data2;172&&rcdata3;1000){status=test_err;err_status=5;err_time=0;disp_hold=1;}}else if(status==test_num6){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;101&&rcdata1;101&&rc data2;101&&rcdata3;1000){status=test_err;err_status=6;err_time=0;disp_hold=1;}}else if(status==test_num7){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;70&&rcdata1;70&&rcda ta2;70&&rcdata3;1000){status=test_err;err_status=7;err_time=0;disp_hold=1;}}else if(status==test_num8){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;14&&rcdata1;14&&rcda ta2;14&&rcdata3;1000){status=test_err;err_status=8;err_time=0;disp_hold=1;}}else if(status==test_num9) //2.4---2.53{if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100) {status=test_err;err_status=9;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num10){if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100) {status=test_err;err_status=10;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num11){if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100){status=test_err;err_status=11;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num12) //+u,-V{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;473&&ad_data1;2200){status=test_err;err_status=12;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num13) //+U,-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;534&&ad_data1;2200){status=test_err;err_status=13;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num14) //+v,-U{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=1;power_supply=1;power_high=1;power_low=0;relay_u=1 ;relay_v=0;relay_w=0;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&ad_data1>;473&&ad_data1;2200) {status=test_err;err_status=14;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num15) //+V,-u{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;} }elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;534&&ad_data1;2200){status=test_err;err_status=15;err_time=0;// SPEN=0;// CREN=0;/// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num16) //-W,+v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;} }elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;473&&ad_data1;2200){status=test_err;err_status=16;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num17) //+W-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=0;power_supply=1;power_high=0;power_low=1;relay_u=0 ;relay_v=0;relay_w=1;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&ad_data1>;534&&ad_data1;2200) {status=test_err;err_status=17;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num18) //+v,-U{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=1;power_supply=1;power_high=1;power_low=0;relay_u=1 ;relay_v=0;relay_w=0;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&rcdata1>;115&&rcdata1;2200) {status=test_err;err_status=18;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num19) //+U,-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&rcdata1>;130&&rcdata1;2200){status=test_err;err_status=19;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;}}}else if(status==test_num20) //-W,+v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;pha=1;phb=0;}else if(test_time;1005){spa=0;spb=1;pha=1;phb=1;} else if(test_time;1015){spa=0;spb=1;pha=1;phb=0;} ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;1400&&rcdata1>;115&&rcdata1;2200){status=test_err;err_status=20;err_time=0;SPEN=0;CREN=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num21) //+W-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=0;power_supply=1;power_high=0;power_low=1;relay_u=0 ;relay_v=0;relay_w=1;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&rcdata1>;130&&rcdata1;2200) {status=test_err;err_status=21;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num22){if(status2==TEST_5055B){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=22;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}elseif(status2==TEST_5046||status2==TEST_5045)status= test_num26;}else if(status==test_num23){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=23;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num24){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=24;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num25){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=25;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num26){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=1;spb=0;pha=1;phb=0;if(test_time>;100&&test_time;240&&rcdata;1000) {status=test_err;err_status=26;err_time=0;disp_hold=1;}}else if(status==test_num27){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=1;spb=0;pha=0;phb=1;if(test_time>;200&&test_time;220&&rcdata;400) {status=test_err;err_status=27;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;}}else if(status==test_num28){if(status2==TEST_5046){disp_run=0;power_supply=1;power_high=0;power_low= 0;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=0;spb=0;pha=0;phb=1;test15_tmp3=rcdata1;test15_tmp4=rcdata2;if(test_time>;100){if((test15_tmp3&0x20)==0)test15_tmp1=test15_tmp3; else test15_tmp2=test15_tmp3;if((test15_tmp4&0x20)==0)test15_tmp1=test15_tmp4; else test15_tmp2=test15_tmp4;disp20(test15_tmp1,test15_tmp2);}}else if(status2==TEST_5045){disp_run=0;power_supply=1;power_high=0;power_low= 0;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=0;spb=0;pha=0;phb=1;test15_tmp3=rcdata1;test15_tmp4=rcdata2;if(test_time>;100){if((test15_tmp3&0x20)==0)test15_tmp1=test15_tmp3; else test15_tmp2=test15_tmp3;if((test15_tmp4&0x20)==0)test15_tmp1=test15_tmp4; else test15_tmp2=test15_tmp4;disp21(test15_tmp1,test15_tmp2);test_time=0;}}else if(status2==TEST_5055B)status=setout1;}else if(status==test_err){disp_run=0;//power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0; if(disp_hold==1){if(err_status==26){power_supply=1;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0;} else{power_supply=1;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=1;} }if(disp_hold==0){power_supply=0;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0;} if(err_time;disp_refresh){err_disp(err_status);disp_time=0;}}else if(err_time;1000){if(disp_time>;disp_refresh){if(disp_mod==1){addisp(ad_data1);disp_time=0;}else{disp10(rcdata1);disp_time=0;}}}else if(err_time>;2000)err_time=0; }}}void init(){/*PORTA *//*RA0 relay_w 0 *//*RA1 vol 1 *//*RA2 +5V 1 *//*RA3 TYJ 1 *//*RA4 power_low 0 *//*RA5 SX 1 *//*RA6 power_high 0 *//*RA7 CLK1 0 */TRISA=0x2e; //0010 1110ANSEL=0x7e; //模拟输入PORTA=0;/*PORTB *//*RB0 SPA *//*RB1 SPB *//*RB2 PHA *//*RB3 PHB *//*RB4 PHC *//*RB5 ralay_v *//*RB6 CLK *//*RB7 DATA */TRISB=0xc0; //1100 0000,rb0--rb5输出,rb6、rb7输入PORTB=0;/*PORTC *//*RC0 DOWN1 *//*RC1 UP *//*RC2 DOWN *//*RC3 choose2 *//*RC4 choose1 *//*RC5 PWM *//*RC6 TXD *//*RC7 RXD */TRISC=0x58; //0101 1000PORTC=0x80; //1000 0000/*PORTD*//*RD0 DATA1 *//*RD1 KFD *//*RD2 up1 *//*RD3 bell *//*RD4 speeder *//*RD5 start *//*RD6 power_supply *//*RD7 safe */TRISD=0x20; //0010 0000PORTD=0x18; //0001 1000/*PORTE*//*RE0 DF *//*RE1 JX *//*RE2 relay_u *//*RE3 VPP */TRISE=0xb; //0000 1011,全输入RE2=0;OSCCON=0xfe; //时钟选择8mhz,内部振荡器VLCDEN=0;OPTION=0xc3;LCDEN=0;CMCON0=7;CCP2CON=0;ADCON1=0x50;TMR0=7;PEIE=1;T0IE=1;GIE=1;if(choose1==0&&choose2==1)status2=TEST_5045; if(choose1==1&&choose2==1)status2=TEST_5046; if(choose1==1&&choose2==0)status2=TEST_5055B; }void keyscan(){if(!start&&keyvalue){keyvalue=0;keytime=0;}if(start&&!keyvalue){keyvalue=1;keytime=0;}}void key1(){if(keystate==0){if(keyvalue==0&&keytime>;10) {keystate=1;keypull=1;keytime=0;}}else if(keystate==1){if(keyvalue==1&&keytime>;10) {keystate=0;keytime=0;}}else keystate=0;}void interrupt tm0(){uint int_i;if(bell_time>;50)bell=1; if(T0IF){keyscan();key1();keytime++;bell_time++;err_time++;test_time++;disp_time++;disp_time1++;tx_time++;if(ad_test==1){if(GODONE==0){// ad_data3=ad_data2; ad_data2=ad_data1;int_i=ADRESH;ad_data1=ADRESL|int_i;110)disp_time=0; if(disp_time1==100){disp10(status);disp_time1=0;}}T0IF=0;TMR0=7;}}void disp(uchar num1,uchar num2,uchar num3) {uchar i;uchar num_tmp1,num_tmp2;// cs1=0; //关闭显示// clr=0; //清除74ls164数据// clr=1;clk1=0; //上升沿移位num_tmp1=num1;for(i=8;i>;0;i--){num_tmp2=num_tmp1;num_tmp2=num_tmp2&0x01; if(num_tmp2==1)data1=1;elsedata1=0;clk1=1;clk1=0;num_tmp1=num_tmp1>;>;1; }num_tmp1=num2;for(i=8;i>;0;i--){num_tmp2=num_tmp1;num_tmp2=num_tmp2&0x01; if(num_tmp2==1)data1=1;elsedata1=0;clk1=1;clk1=0;。