技术热线: 4007-888-234

PIC CCS C语言程序范例

更新时间: 2019-01-05
阅读量:2546

** PIC CCS C语言程序范例 ** **

CCS C编译器包含许多常见应用程序的示例程序库。每个示例程序都包含一个标题,其中包含有关如何运行示例的说明,以及必要时用于连接外部设备的接线说明。以下是我们的编译器附带的三个这样的示例程序,以及由编译器生成的列表文件,其显示生成的与C代码对应的程序集。有关CCS C编译器附带的示例文件和源代码驱动程序的完整列表,请转到:步进电机控制器| 秒计时器| 简单的A / D | 示例列表文件| 示例文件列表步进电机控制器

////////////////////////////////////////////////// /////////////////////// //// EX_STEP.C //// //// //// ////这个程序接口到步进电机。程序将//// ////使用RS-232接口来控制电机//// ////模拟输入,开关输入或RS-232命令。//// //// //// ////按如下方式配置CCS原型卡://// ////将步进电机连接到引脚47-50(B0-B3)//// / /// Conenct 40到54(按钮)////

////连接9到15(锅)////

////请参阅下面的其他连接。//// ////////////////////////////////////////////// /////////////////////////// ////(C)版权所有1996,2001定制电脑服务//// ////源代码只能由CCS //// //// C编译器的许可用户使用。此源代码只能分发给CCS C编译器的其他//// ////许可用户。没有其他用途,//// ////允许复制或分发,不得书面//// ////许可。使用该软件//// ////以目标代码形式创建的衍生程序不受任何限制。//// ////////////////////////////////////////////// ///////////////////////////

include <16c74.h> #fuses HS,NOWDT,NOPROTECT #use delay(clock = 20000000)#use rs232(baud = 9600,xmit = PIN_C6,rcv = PIN_C7)//跳线:8到11,7到12

#包括

byte port_b = 6

define FOUR_PHASE TRUE

ifdef FOUR_PHASE

字节常量仓[4] = {0b0101, 0b1001, 0b1010, 0b0110}; #else伪字节常量仓[8] = {0b0101, 0b0001, 0b1001, 0b1000, 0b1010, 0b0010, 0b0110, 0b0100}; #万一

drive_stepper(字节速度,字符dir,字节步长){ static byte stepper_state = 0; 字节i;

for(i = 0; i <steps; ++ i)> delay_ms(speed); set_tris_b(0XF0); port_b = POSITIONS [stepper_state]; if(dir!=’R’) stepper_state =(stepper_state + 1)&(sizeof(POSITIONS)-1); else stepper_state =(stepper_state-1)&(sizeof(POSITIONS)-1); } }

use_pot(){ byte value;

setup_adc(adc_clock_internal); set_adc_channel(1); 的printf( “\ r \ n”);

while(TRUE){ value = read_adc(); 的printf( “%2X \ r”,值); if(value <0x80) drive_stepper(value,'R',8); 否则if(value> 0x80) drive_stepper(128-(value-128),’F’,8); }

use_switch(byte speed,char dir){

字节步骤;

printf(“\ n \ rSteps per press:”); steps = gethex();

while(true){

while(输入(PIN_B7)); drive_stepper(速度,DIR,步骤); while(!input(PIN_B7)); delay_ms(100); } }

main(){

字节速度,步骤; char dir;

setup_port_a(RA0_RA1_ANALOG);

while(TRUE){ printf(“\ n \ rSpeed(hex):”); speed = gethex();

   if(speed == 0)          use_pot();

   printf(“\ n \ rDirection(F,R):”);        DIR = GETC()| 0×20;        putc将(DIR);


   printf(“\ n \ rSteps(hex):”);        steps = gethex();

   if(steps == 0)          use_switch(speed,dir);

   drive_stepper(速度,DIR,步骤);    }

}

秒计时器//////////////////////////////////////////////// ///////////////////////

//// EX_STWT.C //// //// //// ////这个程序使用RTCC(timer0)和中断来保持//// ////实时秒计数器。一个简单的秒表功能//// ////然后实现。//// //// //// ////按如下方式配置CCS原型卡://// ////插入跳线:11到17和12到18. //// // ////////////////////////////////////////////////// ///////////////////

include <16C84.H>

fuses HS,NOWDT,NOPROTECT

use delay(clock = 20000000)#use rs232(baud = 9600,xmit = PIN_A3,rcv = PIN_A2)

define INTS_PER_SECOND 76 //(20000000 /(4 256 256))

字节秒; //一个运行的秒计数字节int_count; // 经过//秒之前剩余的中断数

int_rtcc //每次clock_isr(){// RTCC(timer0)溢出(255-> 0)时都会调用此函数。 //对于这个程序, 如果( - int_count == 0){//每秒,这是apx 76次。 ++秒; int_count = INTS_PER_SECOND; }

}

main(){

字节开始;

int_count = INTS_PER_SECOND; set_rtcc(0); setup_counters(RTCC_INTERNAL,RTCC_DIV_256); enable_interrupts(RTCC_ZERO); enable_interrupts(GLOBAL);

做{

printf(“按任意键开始。\ n \ r”); GETC(); 开始=秒; printf(“按任意键停止。\ n \ r”); GETC(); printf(“%u seconds。\ n \ r”,秒启动);

} while(TRUE);

}

简单的A / D ////////////////////////////////////////////// /////////////////////////// //// EX_ADMM.C ////

//// //// ////这个程序在//// // RS-232接口上显示最少和最多30个A / D样本。这个过程永远重复。//// //// //// ////配置CCS原型卡如下://// ////插入跳线:11到17,12到18和9到16 /// / ////使用#9 POT改变电压。//// ////////////////////////////////////////////// ///////////////////////////

include <16C71.H>

use delay(clock = 15000000)#use rs232(baud = 9600,xmit = PIN_A3,rcv = PIN_A2)

main(){

int i,value,min,max;

的printf( “采样:”);

setup_port_a(ALL_ANALOG); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0);

做{ min = 255; 最大= 0; for(i = 0; i <= 30; ++ i){ delay_ms(100); value = Read_ADC(); if(value <min) min = value; if(value> max) max = value; } printf(“\ n \ rMin:%2X Max:%2X \ r \ n”,min,max);

} while(TRUE);

}

输出清单……………….. min = 255; 008D:MOVLW FF 008E:MOVWF 28 ……………….. max = 0; 008F:CLRF 29 ……………….. incc = TRUE; 0090:BSF 2B,0

………………..(i = 0; i <= 30; ++ i){ 0091:CLRF 26 0092:MOVLW 1F 0093:SUBWF 26,W 0094:BTFSC 03,0 0095:GOTO 0AC ……………….. delay_ms (100); 0096:MOVLW 64 0097:MOVWF 2C 0098:GOTO 02D ……………….. value = Read_ADC(); 0099:BSF 1F,2 009A:BTFSC 1F,2 009B:GOTO 09A 009C:MOVF 1E,W 009D:MOVWF 27 ……………….. if(value < min)009E:MOVF 28,W 009F:SUBWF 27,W 00A0:BTFSC 03,0 00A1:GOTO 0A4 ……………….. min = value; 00A2:MOVF 27,W

00A3:MOVWF 28 ……………….. if(值> max)00A4:MOVF 27,W 00A5:SUBWF 29,W 00A6:BTFSC 03,0 00A7: GOTO 0AA ……………….. max = value; 00A8:MOVF 27,W 00A9:MOVWF 29 ………………..} 00AA:INCF 26,F

00AB:GOTO 092 ……………….. if(incc)00AC:BTFSC 2B,0 ……………. …. counter ++;

00AD:INCF 2A,F