PIC16F917内部AD练习程序
PIC16F73做的逆变器程序及原理图

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;} }使用特权。
PIC16F917 NOKIA5110 LCD 任意画点程序

voidLCD_Print_Pix(unsignedcharx,unsignedchary,unsignedchar
display_mode);//1/4区域任意画点程序
unsignedcharbank1Lcd_Buffer0[3][21]={{0},{0}};//LCD显示数据缓存区
char lcd_data; unsigned char i;
if(x>41)return;//由于RAM空间问题,对1/4屏幕操作if(y>23)return;
if ( display_mode > 1 ) return;
row = y / 8; offset = y % 8;
if(x20)lcd_data =Lcd_Buffer1[row][x-21];
unsignedcharbank2Lcd_Buffer1[3][21]={{0},{0}};//LCD显示数据缓存区
///////////////////////LCD任意位置写点///////////////必须把LCD显示数据缓存,这样才
可以任意画点,RAM需要(48/6)乘以84个字节才能整个屏幕写//本程序是/4
//传送数据for(i=0;i>i)&0x01){SPI_MOSI=1;}else{SPI_MOSI=0;}SPI_CLK=0;
NOP(); SPI_CLK=1; } LCD_CE=1 ;//关闭LCD/////////}
例子:
LCD_Print_Pix(0,0,1); x显示一个点
画个方块:
for(i=0;itips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
基于PIC16F876A单片机 AD电压测量程序 3路模拟3路数字输入 232通讯

#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();}}}。
PIC16F7X7

PIC16F747 PIC16F777
33 32 31 30 29 28 27 26 25 24 23
1213 14 1516 17 18 19 20 2122
NC RC0/T1OSO/T1CKI OSC1/CLKI/RA7 OSC2/CLKO/RA6 VSS VDD RE2/CS/AN7 RE1/WR/AN6 RE0/RD/AN5 RA5/AN4/LVDIN/SS/C2OUT RA4/T0CKI/C1OUT
DS30498B_CN 第 3 页
PIC16F7X7
1.0 器件概述
• • PIC16F767 • PIC16F777 • 本文档包括下列器件的特定信息: • PIC16F737 • PIC16F747 作为主时钟源或备用时钟源。详见 第 4.5节 “片内 振荡器模块 ”。 Timer1 模块的电流消耗有了显著降低,从 20 A (早期的 PIC16 系列)降到了典型的 1.8 A (32 kHz ,2V),特别适用于实时时钟的应用。 详见第 7.0 章 “Timer1 模块 ” 。 扩展的看门狗定时器 (WDT)可编程周期范围为 1 ms至268s之间。 WDT自带16位预分频器。详见 第 15.17节“ 看门狗定时器 (WDT) ” 。 双时钟启动:当振荡器设为 LP、 XT 或 HS 模式 时,器件将使用 INTRC 作为时钟源,以使振荡器 预热。该功能使器件上电后可立即执行代码。详见 第 15.17.3节 “双时钟启动模式 ” 。 时钟故障监视器:该功能使器件可在主时钟或备用 时钟发生故障时,切换到 INTRC 继续工作。
注
1: RB3 是 CCP2 引脚复用的替换引脚。
DS30498B_CN 第 2 页
华强电子网
PIC16F7X7
基于PIC单片机的双积分AD转换器的仿真

基于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程序设计及应用

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结构的单片机数据线和指令线分时复用,即所谓冯.诺伊曼结构。
第四章PIC16F877A功能及其编程

WDT倍率 1:01
采用1:40M2 Hz晶 最振大,1:延用04时TM多R少0?
1:08 1:16 1:32 1:64 1:128
TMR0的预分频系数范围为2-256,如何获得1:1的倍率?
例:假设晶振振荡频率fosc=4MHz,求TMR0最大延 时时间是多少?
信的时钟线; RC7/RX/DT:IO引脚、异步串行通信的接收、同步串行通
信的数据线。
4.1.4 端口D
端口D有8个引脚,它除了作为普通IO口外, 还能作为并行从动口使用。
4.1.5 端口E 端口E只有3个引脚,它们都可以作为AD转换
的模拟电压输入口,功能如下:
RE0/RD/AN5:IO引脚、并行从动口的读控制、 模拟电压输入通道AN5;
与中断直接相关的位为INTEDG,它涉及到外 部中断(RB0/INT)的中断边沿选择,0为下降沿。
OPTION_REG=0b10111111; //等效 INTEDG=0
注意: ➢ 进入中断后硬件自动屏蔽全局中断,即中断后GIE=0,
中断返回后自动恢复全局中断允许,GIE=1。
➢ 因此,PIC16单片机不允许中断嵌套!也就是说,在 中断服务程序未退出时,即使有新的中断发生,也不 能进入中断。等当前的中断处理完成退出中断后才能 重新进入中断。
工作原理:递加计数。即由计数初值开始,每来若 干个计数脉冲(和预分频比有关),计数值+1,直 到255。若再加1,溢出,同时使计数当前值等于0
TMR0有溢出中断功能,T0IF将自动置1
若要对外部脉冲计数,必须 ①编程OPTION_REG ,(<T0CS>)置1 ②编程TRISA , RA4/T0CKI引脚设置为输入 ③硬件电路:符合一定要求的外部脉冲送RA4/T0CKI
pic16f单片机例程

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单片机中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} void interrupt ADint(void)
{
PORTD=~ADRESL;//LED 输出显示低 8 位 PORTC=位
ADCON0=ADCON0|0B00000010;//开始 AD 转换 } ////////////主程序///////////////////////// int main (void) { Init();//初始化程序 ADCON0=ADCON0|0B00000010;//开始 AD 转换 while(1) //等待 AD 转换
*****/ /*****Program Author : ZhengWen(ClimberWin) *****/ /*****MCU
: PIC16F917 内部晶振 *****/ /*****Compile Date : 2014/08/17 *****/ /*****Edition Info : V1.0 *****/ /************************************************ *************/ //RA5(AN4)作为 AD 输入,电位器调节电压,LED 显示电 压数值
KEY RB0 void Init(void) {
PORTA = 0B00000000;
PORTB = 0B00000000;
PORTC = 0B00000000;
PORTD = 0B00000000;
TRISA = 0B00100000;//设置 RA5(AN4)作为输入
TRISB = 0B00100001;//设置 RB0 为输入,作为按键 口
//引脚定义:PORTD=8LED,KEY=RB0(INT) /*修改日期:
*/ /************************************/ #include ; #define uchar unsigned char #define uint unsigned int void Init(void);//初始化子程序 #define
TRISC = 0B00000000;//设置 RC0 为输出
LCDCON=0x00;//关闭 LCD 功能,不然 PORTC 不能作为 普通 I/O 输出
TRISD = 0B00000000;//设置 PORTD 口为输出,作为 LED 显示口
///////////AD 配置 ///////////////////////////////////////
PIC16F917 内部 AD 练习程序
/*************PIC16F917 单片机程序 *************************/ /************************************************ ******************/ /*****File Function : 内部 AD 练习程序
ANSEL= 0B00010000; //选择 AN4 作为 AD 输入 (PDF 148)
ADCON0=0B10010001;//AD 结果格式 Right justified,
选择参考电压 VDD-VSS,AN4 输入,关闭 AD 转换 ADCON1=0B01010000; //AD 转换时钟选择 ADIE=1;//AD 中断使能 PEIE=1; ADIF=0;//清除中断标志位 GIE=1; //开总中断