pic单片机编程入门,c语言用什么编程软件
大家好,今天小编来为大家解答以下的问题,关于pic单片机编程入门,c语言用什么编程软件这个很多人还不知道,现在让我们一起来看看吧!
PIC单片机编程的问题 刚学 不太懂
;实例供参考可以直接仿真,多看看实例会有帮助的。
;*********************************************************************
;* GPIO0-V GPIO1-I GPIO2-LED1 GPIO4-LED2 GPIO5-OUT*
;* GPIO3-10K*
;*********************************************************************
LISTP=12F675
INCLUDE"P12F675.INC";包含MPLAB预定义的头文件
__CONFIG(0x3FC4);11---111001000设定配置字信息
;_CPD_OFF&_CP_OFF&_BODEN_ON&_MCLRE_OFF
;关代码-数据保护,掉电复位使能,内部复位,
;_PWRTE_ON&_WDT_OFF&_INTRC_OSC_NOCLKOUT
;上电复位延时使能,关看门狗,内部振荡无时钟输出
;*************************************************
;*寄存器定义及RAM分配*
;*************************************************
ERRORLEVEL-302;编译输出结果中不要显示message
cblock0x20;通用变量定义从该地址开始
W_TEMP;中断服务程序用来临时保存W和STATUS
STATUS_TEMP
FLAGS;程序要使用的状态标志寄存器
PWM_HIGH:2;新的PWM高电平时间,保留两个字节
PWM_LOW:2;新的PWM低电平时间,保留两个字节
PWM_HIGH_CURRENT:2;当前PWM的高电平时间锁存
PWM_LOW_CURRENT:2;当前的PWM低电平时间锁存
COUNTER;AD采样次数计数
adsum:2;16位的AD累加结果,用于平均运算,两个字节
temp:2;用于数学运算的临时变量,两个字节
endc;结束cblock变量定义
count EQU 38H
result EQU 39H
;************************************************
;I/O引脚初始化*
;以及A/D初始化*
;************************************************
;GP0=模拟电压输入
;GP1=没有使用
;GP2=没有使用
;GP3=只能作为输入,连接10K下拉电阻到地,ICSP烧录会使用该引脚
;GP4=PWM1输出引脚
;GP5=PWM2输出引脚
;/***************/代换定义
#definePWM_OUTPUT GPIO,2;GPIO,4
#defineLOAD_PWM FLAGS,0
#defineCALCULATE_AD FLAGS,1
#definePWM_TICKS.1024;PWM时间片的个数,如果PWM的分辨率是10位,
#defineTEST_PWM_HIGH.512;用于测试的50%占空比,高电平时间等于PWM时间片的一半
#defineTEST_PWM_LOW PWM_TICKS-TEST_PWM_HIGH;低电平时间等于PWM时间片减高电平时间
#defineISR_DELAY.16;从Timer1溢出到进入中断重新装载Timer1值的延时,
;可通过软件模拟来确定该值
#defineNUM_AD_SAMPLES.16;AD采样次数
#defineAD_TIME_INTERVAL.10;0xFF-(.245) AD时间间隔,10个cycle的循环
;/***************/定义双字节常数减变量的宏
;const_input-input=output
sub_const_16macroconst_input,input,output
movlw lowconst_input;W=low双字节常数 L
movwf temp
movlw highconst_input;W=high双字节常数H
movwf temp+1
movf input,w;W=input
subwf temp,w;W=temp-W
movwf output;output=W
movf input+1,w;W=input+1
btfss STATUS,C;C=1->
incf input+1,w;W=input+1+1
subwf temp+1,w;W=temp+1-W
movwf output+1;output+1=W
endm
;/***************/定义双字节常数加变量的宏
;const_input+input=output
add_const_16macroconst_input,input,output
movlw lowconst_input;W=low双字节常数 L
movwf temp
movlw highconst_input;W=high双字节常数H
movwf temp+1
movf input,w;W=input
addwf temp,w;W=temp+W
movwf output;output=W
movf input+1,w;W=input+1
btfsc STATUS,C;C=0->
incf input+1,w;W=input+1+1
addwf temp+1,w;W=temp+1+W
movwf output+1;output+1=W
endm
;/***************/程序开始
;/***************/
org 0000H;芯片复位入口地址0x00
goto MAIN000;主程序
;/***************/中断服务子程序
;/***************/
;INTCON,T0IF---TMR0溢出 INTCON,INTF---GP2/INT外部中断
;INTCON,GPIF---GP5-GP0引脚电平发生了变化
;PIR1,EEIF---EEPROM写操作完成 PIR1,ADIF---A/D转换完成
;PIR1,CMIF---比较器输入已改变 PIR1,TMR1IF---TMR1溢出
org 0004h;中断入口地址0x0004
INTCON00 movwf W_TEMP;W_TEMP=W保存
swapf STATUS,W;STATUS_TEMP=STATUS
movwf STATUS_TEMP
bcf STATUS,RP0;选择Bank0
INTCON02 movlw b'00000100';把W的第四位置高,其他都是零
xorwf GPIO,F;和GPIO异或,也就是把PWM输出脚的电平反转
;判断中断种类
INTCON03 bcf PIR1,TMR1IF;清T1中断标志Timer1中断
movlw HIGH3CAFH;Timer1=50mS C350H
movwf TMR1H;FFFFH-C350H=3CAFH
movlw LOW3CAFH
movwf TMR1L
bsf CALCULATE_AD;置位A/D转换标志
bsf LOAD_PWM;置位PWM标志
INTCON08 swapf STATUS_TEMP,W;恢复STATUS寄存器
movwf STATUS
swapf W_TEMP,F;恢复W寄存器
swapf W_TEMP,W
retfie;从中断返回
;/***************/主程序
;/***************/
MAIN000 clrf GPIO;初始化GPIO端口寄存器为零
bsf STATUS,RP0;选择Bank1
call 0x3FF;读内部振荡出厂校准字,返回值在W寄存器内
movwf OSCCAL;内部振荡器校准
movlw b'11000011';设置GP<0>为输入,所有其他口为输出
movwf TRISIO
movlw 01h;使能Timer1中断01h
movwf PIE1
movlw b'00010001';AD采用FOSC/8时钟,GP2是模拟口,
movwf ANSEL;其他口为数字IO
movlw b'00001000';Timer0设置为使用内部指令周期,无预分频
movwf OPTION_REG
bcf STATUS,RP0;选择Bank0
movlw b'10000001';A/D是右对齐格式,Vdd为参考,GP0作为AD输入口
movwf ADCON0
movlw b'00000111';关掉内部比较器,让比较器的输入都为数字口
movwf CMCON
movlw 0C0h;使能周边外设中断和全局中断
movwf INTCON
movlw b'00000001';Timer1是1:1预分频,内部时钟源,
movwf T1CON;振荡频率/4,不带门控
movlw.16;AD次数=10
movwf COUNTER
MAIN010 btfss CALCULATE_AD;=1->主循环
goto MAIN010
bcf CALCULATE_AD;清A/D转换标志
bsf STATUS,RP0;选择bank1
movf ADRESL,W;W=ADL
addwf adsum,F;adsum=ADL
btfsc STATUS,C;C=0->
incf adsum+1,F;adsum+1=adsum+1+1
bcf STATUS,RP0;选择Bank0
movf ADRESH,W;W=ADH
addwf adsum+1,F;adsum+1=ADH
bsf ADCON0,GO_DONE;启动AD下一次转换
decfsz COUNTER,F;转换计数器-1=0->
goto MAIN010;循环
movfw adsum
movwf result;result=w
CALL LED000
movfw adsum+1
movwf result;result=w
CALL LED000
movlw.16;AD次数=10
movwf COUNTER
clrf adsum;清A/D累加和/平均值寄存器
clrf adsum+1
goto MAIN010
;/***************/串行输出
LED000 movlw 8;串行输出8位w=8
movwf count;count=w
LED001 bcf TRISIO,4;清零
btfsc result,0;result.7=0->
bsf TRISIO,4;00100000
bsf TRISIO,5;产生时钟脉冲GP4=1
bcf TRISIO,5; GP4=0
RRF result,1;左移获取下一个结果位
decfsz count,1;-1
goto LED001;<>0循环下位
RETURN;=0
;/***************/
end;程序结束符
关于PIC单片机C语言编程
1:第一个问号:是;第二个问号:不一定;
2:一些C30有多种类型版本,你说的30C和36可能不是指同一种类型。
3:没破解的编译器过期就不能编译程序了。想用就需要重装(貌似它会在系统内记录的,所以应该是重装操作系统才行)。
4:肯定不可靠。我有过编译经历,破解的编译出来的在逻辑上就会有问题。但这不影响普通学生入门者做设计。如果你是做工业、航天领域设计的,你的领导也不会让你用破解版或者未注册版。所以现在很多单位宁愿用汇编来编译程序。
PICC有支持 PIC10/12/16/18/24/32系列单片机的C编译器。同时也支持dsPIC30/33系列DSC芯片的C编译器
PIC单片机编程的介绍
该书是“图解PIC单片机应用技术”丛书之一。本书以从未接触过微控制器的人为对象,把理解编程基本思路作为重点,分别介绍PIC微控制器的内部动作,编程过程分析,PIC微控制器数字量接口的应用,以及如何熟练使用内置设备、驱动电机等。附录部分给出PIC的开发步骤、向PIC微控制器写入程序、指令表、PIC16F877A等。该书图文并茂,实例丰富,内容循序渐进,具有很强的实用性。该书可供PIC单片机爱好者、高等院校相关专业师生,以及从事PIC单片机项目开发制作的工程技术人员阅读和参考。
OK,本文到此结束,希望对大家有所帮助。