** 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
#包括
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