PIC_MCC程序手册X
- 格式:doc
- 大小:879.00 KB
- 文档页数:67
第一部分为了对PIC单片机有更好的支持,PICC在标准C的基础上作了一些扩充:• 定义I/O函数,以便在你的硬件系统中使用中定义的函数。
• 用C语言编写中断服务程序• 用C语言编写I/O操作程序• C语言与汇编语言间的接口1-1 与标准C的不同PICC只在一处与标准C不同:函数的重入。
因为PIC单片机的寄存器及堆栈有限,所以PICC不支持可重入函数。
1-2 支持的PIC芯片PICC 支持很多PIC单片机,支持PIC单片机的类型在LIB目录下的picinfo.ini 文件中有定义。
1-3 PICC 包含一些标准库1-4 PICC 编译器可以输出一些格式的目标文件,缺省设置为输出Bytecraft的'COD' 格式和 Intel的'HEX'格式。
你可以用表1-1中的命令来指定输出格式。
表1-1格式名称描述PICC 命令文件类型Motorola HEX S1/S9 type hex file -MOT .HEXIntel HEX Intel style hex records(缺省) -INTEL .HEX Binary Simple binary image -BIN .BIN UBROF Universal Binary Image Relocatable Format -UBROF .UBR Tektronix HEX Tektronix style hex records -TEK .HEX American Hex format with symbols for American -AAHEX .HEX Automation HEX Automation emulatorsBytecraft .COD Bytecraft code format(缺省) n/a(缺省) .COD Library HI-TECH library file n/a .LIB1-5 符号文件PICC -G 命令用于生成符号文件,有了符号文件,你就可以进行源程序调试.命令格式为:PICC -16F877 -G test.c在使用仿真器时必须使用-G命令。
pic单片机直流无刷电机控制程序下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!Title: PIC单片机直流无刷电机控制程序Introduction在现代工业控制系统中,直流无刷电机的应用越来越广泛。
PIC单片机的C语言编程指南PIC单片机是一种常用的嵌入式系统开发平台,其具有低功耗、成本低廉、易于编程等优点,在工业自动化、电子设备控制等领域有着广泛应用。
本文将为读者提供一份PIC单片机的C语言编程指南,帮助初学者快速入门并掌握基本的编程技巧。
首先,我们需要了解一些PIC单片机的基本概念。
PIC单片机采用哈佛结构,具有多种型号和系列,每个系列有多个型号可供选择。
不同的型号和系列有不同的特性和功能,因此在编程时需要根据具体的芯片型号进行适配。
PIC单片机的编程语言常用的是C语言,其语法简洁,易于理解和学习,并且具有较高的可移植性。
在编写PIC单片机的C语言程序时,我们需要按照以下步骤进行:1. 引入头文件:使用#include指令引入所需的头文件,头文件包含了定义和声明所需的函数和变量。
3.初始化:在程序开始时对所需的资源进行初始化,包括引脚配置、中断设置、定时器初始化等。
4.主循环:编写主循环代码,其中包括需要重复执行的功能,例如读取传感器数据、处理输入输出等。
5.中断处理:根据需要,编写中断处理函数,处理外部中断、定时器中断等。
6.清理工作:在程序结束时,进行一些清理工作,例如释放资源、关闭设备等。
下面是一个PIC单片机的C语言编程示例:```c#include <xc.h> // 引入XC8编译器的头文件#define LED_PIN RC0 // 定义LED连接的引脚void iniTRISC0=0;//配置RC0引脚为输出模式void maiinit(; // 初始化while(1)LED_PIN=1;//点亮LED__delay_ms(500); // 延时500毫秒LED_PIN=0;//关闭LED__delay_ms(500); // 延时500毫秒}```上述代码实现了一个简单的功能,即使LED灯以500毫秒的间隔交替点亮和关闭。
在程序中,我们首先引入了`<xc.h>`头文件,然后定义了一个宏`LED_PIN`来表示连接LED的RC0引脚。
PM-512 高精度模入接口卡技术说明书1. 概述PM-512高精度模入接口卡适用于提供了PC104 总线的嵌入式微机。
其操作系统可选用经典的MS-DOS 或目前流行的 Windows 系列等多种操作系统。
PM-512高精度模入接口卡安装使用简便、功能齐全。
其A/D 转换启动方式可以选用程控频率触发、程控单步触发、外部TTL信号触发以及外部时钟同步触发等多种方式。
A/D转换后的数据结果通过先进先出存储器(FIFO)缓存后由PC104总线读出。
为方便用户,本卡还提供了符合TTL电平的8路数字量输入和8路数字量输出信号通道。
2. 主要技术参数2.1模入部分( 标*为出厂标准状态,下同 )2.1.1输入通道数:单端16路* / 双端8路2.1.2 输入信号范围:0~10V*;0~5V;±5V;±10V2.1.3 输入阻抗:≥10MΩ2.1.4 输入通道选择方式:单通道程序指定/多通道自动扫描2.1.5 A/D转换分辩率:16位2.1.6 A/D最高转换速率:100KHz2.1.7 A/D采样程控频率:1KHz/5KHz/10KHz/50KHz/100KHz/外部时钟2.1.8 A/D启动方式:程控频率触发/程控单步触发/外部TTL信号触发2.1.9 A/D转换输出码制:单极性原码*/双极性偏移码2.1.10 FIFO存储器容量:8K×16bit(全满)/4K×16bit(半满)2.1.11 数据读取识别方式:FIFO半满查询/FIFO非空查询/FIFO半满中断2.1.12 系统综合误差:≤0.02% F.S2.2 开关量部分2.2.1 输入路数:8路TTL电平2.2.2 输出路数:8路TTL电平2.3 电源功耗: +5V(±10%)≤500mA2.4环境要求:工作温度:10℃~40℃相对湿度: 40%~80%存贮温度:-55℃~+85℃2.5 外型尺寸:长×高=90mm×96mm3. 工作原理工作原理简介PM-512高精度模入接口卡主要由高速多路模拟开关选通电路、高速高精度放大电路、高精度模数转换电路、先进先出(FIFO)缓冲存储器电路、开关量输入输出电路和接口控制逻辑电路等部分组成。
单片机开发学习板产品使用手册
【简要说明】
简要说明:
一、尺寸:83mmX68mm
二、主要芯片:PIC16F877单片机、MAX232(支持PIC16F系列40管脚单片机、工作电压:直流5伏(或者USB供电)
四、卡座式安装,方便更换芯片
五、特点:1、具有电源指示;
2、所以I/O口以引出;
3、可以实现与电脑串口通信;
4、标准的7.3728M晶振(晶振可插拔可以自行更换);
产品有售淘宝店: 1
5、具有上电复位和手动复位;
6、支持PIC16F8XX系列单片
机;
7、RC0~RC3四位按键输入;
8、RD口8位LED指示灯显示;
9、所有I/0口全部用排针引出;
10、可USB供电、可端子接线供电、可排针引电;
六、有详细使用说明书
七、提供相关软件
八、提供例程及其学习资料
适用场合:单片机学习、电子竞赛、产品开发、毕业设计。
注意啦:本产品提供的所有程序都附带原理图以及说明!
产品有售淘宝店: 2。
PIC单片机控制的电动自行车驱动系统C程序#include <pic.h>//电动车双闭环程序,采用双闭环方式控制电机,以得到最好的zh 转速性能,并且可以//限制电机的最大电流。
本应用程序用到两个CCP 部件,其中CCP1 用于PWM 输出,以控制电机电压;CCP2 用于触发AD,定时器TMR2、TMR1,INT 中断,RB 口电平变化中断,//看门狗以及6 个通用I/O 口#define AND 0xe0 //状态采集5,6,7 位#define CURA 0X0a //电流环比例和积分系数之和#define CURB 0X09 //电流环比例系数#define THL 0X6400 //电流环最大输出#define FULLDUTY 0X0FF //占空比为1 时的高电平时间#define SPEA 0X1d //转速环比例和积分系数之和#define SPEB 0X1c //转速环比例系数#define GCURHILO 0X0330 //转速环最大输出#define GCURH 0X33 //最大给定电流#define GSPEH 0X67 //最大转速给定#define TSON 0X38 //手柄开启电压1.1 V,TSON*2 为刹车后手柄开启电压,即//2.2 V#define VOLON 0X4c //低电压保护重开电压3.0 V 即33 V#define VOLOFF 0X49 //低电压保护关断电压2.86 V 即31.5 Vvolatile unsigned char DELAYH,DELAYL,oldstate,speed,speedcount,tsh,count_ts,count_vol,gcur,currenth,voltage; //寄存器定义static bit sp1,spe,ts,volflag,spepid,lowpower,off,shutdown,curpid; //标志位定义static volatile unsigned char new[10]={0xaf,0xbe,0xff,0x7e,0xcf,0xff,0xd7,0x77,0xff,0xff}; //状态寄存器表//------------PIC16F877 初始化子程序------------void INIT877(){PORTC=0X0FF; //关断所有MOSFETTRISC=0X02; //设置C 口输出PIE1=0X00; //中断寄存器初始化,关断所有中断TRISA=0XCF; //设置RA4,RA5 输出TRISB=0XEF; //RB 口高三位输入,采集电机三相的霍尔信号PORTC=new[(PORTB&AND)>>5]; //采集第一次霍尔信号,并输出相应的信号,导通//两个MOS 管T2CON=0X01; //TMR2 4 分频CCPR1L=0X0FF; //初始时PWM 输出全高CCP1CON=0X0FF; //CCP1 设置为PWM 方式CCP2CON=0X0B; //CCP2 设置为特殊方式,以触发ADADCON0=0X81; //AD 时钟为32 分频,且AD 使能,选择AN0 通道采集手//柄电压TMR2=0X00; //TMR2 寄存器初始化TMR1H=0X00; //TMR1 寄存器初始化TMR1L=0X00;T1CON=0X00; //TMR1 为1 分频CCPR2H=0X08;CCPR2L=0X00; //电流采样周期设置为TAD=512 μs PR2=0XC7; //PWM 频率设置为5 kHzADCON1=0X02; //AD 结果左移OPTION=0XFB; //INT 上升沿触发TMR2ON=1; //PWM 开始工作INTCON=0XD8; //中断设置GIE=1,PEIE=1,RBIE=1 ADIE=1; //AD中断使能speedcount=0x00; //转速计数寄存器speed=0x7f; //转速保持寄存器spe=1; //低速标志位sp1=1; //低速标志位oldstate=0x0ff; //初始状态设置,区别于其他状态count_ts=0x08; //电流采样8 次,采集1 次手柄count_vol=0x00; //采样256 次手柄,采集1 次电池电压ts=1; //可以采集手柄值的标志位ADGO=1; //AD采样使能TMR1ON=1; //CCP2 部件开始工作}//------------延时子程序---------------#pragma interrupt_level 1void DELAY1(x)char x;{DELAYH=x; //延时参数设置#asmDELAY2 MOVLW 0X06MOVWF _DELAYLDELAY1 DECFSZ _DELAYLGOTO DELAY1DECFSZ _DELAYHGOTO DELAY2#endasm}//-----------状态采集子程序----------------------void sample(){char state1,state2,state3,x;do {x=1;state1=(PORTB&AND); //霍尔信号采集DELAY1(x);state2=(PORTB&AND);}while(state1-state2); //当三次采样结果不相同时继续采集状态if(state1-oldstate!=0) //看本次采样结果是否与上次相同,不同//则执行{oldstate=state1; //将本次状态设置为旧状态state1=(oldstate>>5);PORTC=new[state1]; //C 口输出相应的信号触发两个MOS 管if(sp1==1){spe=1;sp1=0;}else { //如果转速很低,则spe 置1spe=0;sp1=0;speedcount<<=1;state3=(TMR1H>>2); //否则,spe=0,计转速speed=speedcount+state3; //speed 寄存器为每256 μs 加1}speedcount=0;}}//-----------------AD 采样子程序----------------------void AD(){char x;ADIF=0; //清AD 中断标志位if(ts==1){ //如果为手柄采样,则采样手柄值CHS0=1; //选择电流采样通道count_vol=count_vol+1; //电池采样计数寄存器spepid=1; //置转速闭环运算标志ts=0;tsh=ADRESH; //存手柄值if(count_vol==0) { //如果电池采样时间到,则选择AN2 通道,采集电池电压CHS0=0;CHS1=1;volflag=1;x=1;DELAY1(x);ADGO=1;}}else if(volflag==1) { //电池采样完毕,进行相应的处理CHS1=0;CHS0=1;volflag=0;voltage=ADRESH;lowpower=1;}else { //否则,中断为采样电流中断speedcount=speedcount+1; //speedcount 寄存器加1,作为测量转速用if(speedcount>0x3d) sp1=1; //如果转速低于1 000 000 μs/(512 μs*3eh*3) // 则认为为低速状态currenth=ADRESH;curpid=1;count_ts=count_ts-1;if(count_ts==0) { //如果手柄时间到,则转入手柄采样通道CHS0=0;count_ts=0x08;ts=1;x=1;DELAY1(x);ADGO=1;}}}//-------------刹车处理子程序------------------void BREAKON(){char x;off=0; //off清零,如果是干扰则不复位shutdown=0;if(RB0==1) { //如果刹车信号为真,则停止输出电压ADIE=0; //关AD 中断INTE=0; //关刹车中断CCPR1L=FULLDUTY; //输出电压0TMR1ON=0; //关CCP2,不再触发ADfor(;ADGO==1;) continue;//如正在采样,则等待采样结束ADIF=0; //ADIF 位清零CHS0=0; //选择通道0 采样手柄CHS1=0;x=1;DELAY1(x);do {ADGO=1;for(;ADIF==0;)continue;ADIF=0;CCPR1L=FULLDUTY;asm("CLRWDT");tsh=(ADRESH>>1);}while(tsh>TSON||RB0==1); //当手柄值大于2.2 V 或刹车仍旧继续时,执行以//上语句off=1; //置复位标志}}//---------欠保护子程序-------------------void POWER(){char x;lowpower=0;voltage>>=1; //电压值换为7 位,以利于单字节运算if(voltage<VOLOFF) { //电池电压小于3*k(V)时保护ADIE=0;INTE=0;TMR1ON=0;CCPR1L=FULLDUTY;for(;ADGO==1;)continue;ADIF=0;CHS0=0;CHS1=1;x=1;DELAY1(x);do{ADGO=1;for(;ADIF==0;)continue;ADIF=0;voltage=(ADRESH>>1);CCPR1L=FULLDUTY;asm("CLRWDT");}while(voltage<VOLON); //电池电压小于35 V 时继续保护off=1; //置复位标志}}//------------电流环运算子程序-----------------void CURPI(){ static int curep=0x00,curek=0x00,curuk=0x00;union data{int pwm;char a[2];}b; //定义电流环运算寄存器curpid=0; //清电流运算标志curep=curek*CURB; //计算上一次偏差与比例系数的积if(currenth<2)currenth=2; //如果采样电流为零,则认为有一个小电流以利于//使转速下降currenth>>=1;curek=gcur-currenth; //计算本次偏差curuk=curuk+curek*CURA-curep; //按闭环PI 运算方式得到本次输出结果,下//面对结果进行处理if(curuk<0x00) { //如果输出小于零,则认为输出为零curuk=0;CCPR1L=FULLDUTY;CCP1X=0;CCP1Y=0;}else if(curuk-THL>=0) { //如果输出大于限幅值,则输出最大电压curuk=THL;CCPR1L=0;CCP1X=0;CCP1Y=0;}else { //否则,按比例输出相应的高电平时间到CCPR1 寄存器b.pwm=THL-curuk;b.pwm<<=1;CCPR1L=b.a[1]; //CCPR1L=(b.pwm>>8)&0x0ff;将PWM 寄存器的高半字节if(b.pwm&0x80!=0) CCP1X=1;else CCP1X=0;if(b.pwm&0x40!=0) CCP1Y=1;else CCP1Y=0;}}//---------------转速环运算子程序-----------------------void SPEPI(){ static int speep=0x00,speek=0x00,speuk=0x00;int tsh1,speed1; //转速寄存器定义spepid=0; //清转速运算标志if(spe==1) speed1=0x00; //若转速太低,则认为转速为零else speed1=0x7f-speed; //否则计算实际转速if(speed1<0) speed1=0;speep=speek*SPEB;tsh1=tsh-0x38; //得到计算用的手柄值speek=tsh1-speed1;if(tsh1<0) {speuk=0;gcur=0;} //当手柄值低于1.1 V 时,则认为手柄给定为零else { //否则,计算相应的转速环输出if(tsh1>=GSPEH) //限制最大转速tsh1=GSPEH;speuk=speuk+speek*SPEA-speep; //计算得转速环输出if(speuk<=0X00) {speuk=0x00;gcur=0x00;}//转速环输出处理else if(speuk>GCURHILO) { //转速环输出限制,即限制最大电流约12 A speuk=GCURHILO;gcur=GCURH;}else { //调速状态时的输出gcur=(speuk>>4)&0x0ff;}}}//-----------主程序-------------------------main(){for(;;){INIT877(); //单片机复位后,先对其进行初始化off=0; //清复位标志for(;off==0;) { //复位标志为零,则执行下面程序,否则复位if(curpid==1) CURPI(); //电流PI 运算else if(spepid==1) SPEPI(); //转速PI 运算else if(lowpower==1) POWER();else if(shutdown==1) BREAKON();asm("CLRWDT");}}}//---------中断服务子程序---------------------#pragma interrupt_level 1void interrupt INTS(void){if(RBIF==1) {RBIF=0;sample();}else if(ADIF==1) AD();else if(INTF==1) {shutdown=1;INTF=0;} //刹车中断来,置刹车标志现代文的体裁一、散文1、散文基本特征:(1)情感浓烈,选村广泛(富有抒情性,行散神不散);(2)真实自然,富于美感(写真人真事,可以艺术加工,表达方式多样);(3)以小见大,纸短韵长(哲理性)。