百度
360搜索
搜狗搜索

pic单片机编程入门,pic单片机 实现10ms定时的简单程序详细介绍

本文目录一览: PIC单片机编程的问题 刚学 不太懂

大概属于一个中级的水平。
电工国家职业资格等级分为:初级(五级)、中级(四级)、高级(三级)、技师(二级)、高级技师(一级)共五个等级。职业资格证书由劳动局颁发。
国家职业资格证书同行业、协会等其它机构组织颁发的证书最大区别在于:国家职业资格证书是通过国家法律、法令和行政法规的形式,按照国家制定的职业技能标准或任职资格条件,以政府的力量来推行,由政府认定的考核鉴定机构——各省市区劳动保障厅职业技能鉴定中心来组织实施的,对劳动者的技能水平或职业资格进行客观公正、科学规范的评价和鉴定,对合格者颁发相应的国家职业资格证书。职业资格证书是劳动者具有从事某一职业所必备的学识和技能的证明。它是劳动者求职、任职、开业的资格凭证,是用人单位招聘、录用劳动者的主要依据,也是境外就业、对外劳务合作人员办理技能水平公证的有效证件,是在全国范围内通用的国家证书,而行业、协会等其它机构组织颁发的证书则不具备上述特点。
你好,首先我没用过MAPLAB IDE,我不知道它是否支持你这样写程序,如果用我现在用的仿真器,这段程序是无法编译的,先不谈语法,这段程序无头文件无程序入口。你去找下MAPLAB IDE的错误讯息,会告诉你ERROR152 129分别代表什么。上面显示的是,你这段程序除了伪代码段从第四行开始其他都错了,我只看出最后一行意思是你程序没有期望的END,但是我这里ICE有没有END都无所谓,所以你还是找下你那个IDE的错误讯息吧,所有的错误讯息都会告诉你是为什么,看ERROR后面的数字就行了。
以前没编过??先找人帮你入门吧。
先找个范例,按照范例来写!然后再一步步增加功能!
; 实例 供参考 可以直接仿真,多看看实例 会有帮助的。
; *********************************************************************; * GPIO0-V GPIO1-I GPIO2-LED1 GPIO4-LED2 GPIO5-OUT *; * GPIO3-10K *; ********************************************************************* LIST P=12F675 INCLUDE "P12F675.INC" ; 包含MPLAB预定义的头文件 __CONFIG(0x3FC4) ; 11 ---1 1100 1000 设定配置字信息 ; _CPD_OFF & _CP_OFF & _BODEN_ON & _MCLRE_OFF ; 关代码-数据保护, 掉电复位使能,内部复位, ; _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT ; 上电复位延时使能,关看门狗,内部振荡无时钟输出
; *************************************************; * 寄存器定义及RAM分配 *; *************************************************
ERRORLEVEL -302 ; 编译输出结果中不要显示message
cblock 0x20 ; 通用变量定义从该地址开始 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 输出引脚
; / *** *** *** *** *** / 代换定义
#define PWM_OUTPUT GPIO,2 ; GPIO,4#define LOAD_PWM FLAGS,0#define CALCULATE_AD FLAGS,1#define PWM_TICKS .1024 ; PWM时间片的个数,如果PWM的分辨率是10位,#define TEST_PWM_HIGH .512 ; 用于测试的50%占空比,高电平时间等于PWM时间片的一半#define TEST_PWM_LOW PWM_TICKS-TEST_PWM_HIGH ; 低电平时间等于PWM时间片减高电平时间#define ISR_DELAY .16 ; 从Timer1溢出到进入中断重新装载Timer1值的延时, ; 可通过软件模拟来确定该值#define NUM_AD_SAMPLES .16 ; AD采样次数#define AD_TIME_INTERVAL .10 ; 0xFF - (.245) AD时间间隔,10个cycle的循环
; / *** *** *** *** *** / 定义双字节常数减变量的宏 ; const_input - input = output
sub_const_16 macro const_input, input, output movlw low const_input ; W = low 双字节常数 L movwf temp movlw high const_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_16 macro const_input, input, output movlw low const_input ; W = low 双字节常数 L movwf temp movlw high const_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 ; 中断入口地址0x0004INTCON00 movwf W_TEMP ; W_TEMP = W 保存 swapf STATUS,W ; STATUS_TEMP = STATUS movwf STATUS_TEMP bcf STATUS,RP0 ; 选择Bank 0
INTCON02 movlw b'00000100' ; 把W的第四位置高,其他都是零 xorwf GPIO,F ; 和GPIO异或,也就是把PWM输出脚的电平反转 ; 判断中断种类
INTCON03 bcf PIR1,TMR1IF ; 清 T1 中断标志 Timer1 中断 movlw HIGH 3CAFH ; Timer1 = 50 mS C350H movwf TMR1H ; FFFFH - C350H = 3CAFH movlw LOW 3CAFH 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 ; 选择Bank 1 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 = AD L addwf adsum,F ; adsum = AD L btfsc STATUS,C ; C = 0 -> incf adsum+1,F ; adsum+1 = adsum+1 + 1 bcf STATUS,RP0 ; 选择Bank0 movf ADRESH,W ; W = AD H addwf adsum+1,F ; adsum+1 = AD H 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 = wLED001 bcf TRISIO,4 ; 清零 btfsc result,0 ; result.7=0 -> bsf TRISIO,4 ; 0010 0000 bsf TRISIO,5 ; 产生时钟脉冲 GP4 = 1 bcf TRISIO,5 ; GP4 = 0 RRF result,1 ; 左移获取下一个结果位 decfsz count,1 ; - 1 goto LED001 ; <> 0 循环下位 RETURN ; = 0
; / *** *** *** *** *** /
end ; 程序结束符

阅读更多 >>>  什么是美国职业篮球联赛

microchip单片机pic怎么编程

microchip 的PIC 单片机,使用 MPLAB 编译器进行程序编译。
比较cao蛋的是,MPLAB 具有多种编译器,版本相互不兼容。
其中市场主打 的PIC16F 系列,多数采用 MPLAB IDE 编译器(本人用V8.8版本(破解的,嘘),新的应该是V8.9版本,不过本人没多关注,也不知道正不正确)。
MPLAB 编译器,在编程的时候,必须选择单片机型号,而本人使用的IDE V8.8版,并不能支持所有的PIC16系列单片机型号(最起码,最近使用的PIC16F1513就没有支持,在MPLAB X IDE里有支持)
而microchip 的高级单片机 PIC18系列,则以 MPLAB X IDE 编译器为主(行业称“十”版本),不过用了IDE V8.8后,再下载使用 IDE 10(就是上面的十版本)。你会觉得画风突变,完全找不着北,连配置字、用户程序版本号都没法兼容使用。前面熟悉的IDE,完全没法发挥任何作用。你又得重新开始学习一个新的编程软件(害得哥在新项目上浪费了N多时间)。
最可恨的是,IDE 10 把市场上销售的PICKIT 3 的离线脱机下载功能给搞死了(一插上KIT 3,IDE 10就自动升级KIT 3 的内部固件程序)。然后哥只能给它贴上“研发专用”标签!
PIC 的单片机很多地方要注意的,不用的特殊功能(特别是AD)不是你不开就好的,而是你必须关闭才行。
PIC 单片机有自己的一套 汇编,如果你用汇编,你必须重新学习它的汇编语言。如果你使用C,那还好,多数是兼容的(除了 程序续行(就是单行程序太长,进行多行显示))。不过哥没整好它的混编(不知道是哥能力不够,还是破解安装少东西,都是编译错误),没法发挥它的高效。PIC 单片机的 除法运算1000个周期、左右移16位无法编译、硬堆栈层限制(就是函数内 调用函数 调用函数 调用函数……,最明显的就是递归调用被限死)…………一堆弱点!

pic单片机 实现10ms定时的简单程序

刚刚学PIC单片机编程,一个装置,在接受到中断时,装置不报警,没有接受到另外,CGQ值对alarm_silencer();影响的逻辑关系有点乱,所以我没看alarm_,
这个可以用几种办法:
1、直接用软件延时,如用以下的DELAY()延时子程序,如要延时5ms,直接调用DELAY(5)就好了,但这种是纯软件的延时。
//======延时(n)ms,在4MHz晶振下!!!
void DELAY(uint n)
{ uint j;
uchar k;
for (j=0;j
<n;j++)
for (k=246;k>0;k--) NOP();

}

2、用定时器延时,要通过计算延时的时间来确定延时的常数(分频比和定时器初值)。
</n;j++)

pic单片机EEPROM怎么编写程序?

在你的C文件里引用EEPROM函数的头文件,eeprom_routines.h
然后在程序中使用
void eeprom_write(unsigned char addr, unsigned char value);
unsigned char eeprom_read(unsigned char addr);
这两个函数了。
这两个函数一个读一个写。比如你想写0x10到地址为0x55的EEPROM,
就写:eeprom_write(0x55,0x10);
同理,如果想读取0x55地址处的值,
就写:ee_value = eeprom_read(0x55);
如果编译时编译器提示找不到eeprom_routines.h,可以在
X:\Program Files\HI-TECH Software\PICC\9.81\include 目录下找,然后复制到自己项目文件夹下。
对了,我用的是MPLab IDE,编译器使用的是PICC
在你的C文件里引用EEPROM函数的头文件,eeprom_routines.h
然后在程序中使用
void eeprom_write(unsigned char addr, unsigned char value);
unsigned char eeprom_read(unsigned char addr);
这两个函数了。
这两个函数一个读一个写。比如你想写0x10到地址为0x55的EEPROM,
就写:eeprom_write(0x55,0x10);
同理,如果想读取0x55地址处的值,
就写:ee_value = eeprom_read(0x55);
如果编译时编译器提示找不到eeprom_routines.h,可以在
X:\Program Files\HI-TECH Software\PICC\9.81\include 目录下找,然后复制到自己项目文件夹下。
对了,我用的是MPLab IDE,编译器使用的是PICC。

求 PIC 8位单片机 汇编指令比较全的,详细点的

PIC单片机的数据手册文档里就有汇编指令的介绍。Microchip公司官网上有下载的。
如果要带例子的那就找张明峰的书。他出书的时候是Microchip公司中国地区的应用工程师,很多PIC的中文版数据手册就是他和他同事翻译的。
张明峰的书是最好的,可以参考
汇编较难你还是先学C那个较容易些
Pic 8位单片机汇编指令识读
各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。
  PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。
  在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。
  一、PIC汇编语言指令格式
  PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:
  标号 操作码助记符 操作数1,操作数2;注释
  指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
  1 标号 与MCS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
  书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。
  2 操作码助记符 该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
  3 操作数 由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。在这里PIC 8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。
  指令的操作数项也是可选项。
  PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。  4 注释 用来对程序作些说明,便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。
  二、清零指令(共4条)
  1 寄存器清零指令
  实例:CLRW;寄存器W被清零
  说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。
  2 看门狗定时器清零指令。
  实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器) 
 说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。
  3 寄存器f清零指令。指令格式:CLRF f
  实例:CLRF TMRO;对TMRO清零
  说明:在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。F取值按PIC系列不同型号而不同,一般为Ox00~Ox1F/7F/FF。TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。
  4 位清零指令。指令格式 BCF f,b
  实例:BCF REG1,2;把寄存器REG1的D2位清零
  说明:BCF是英语Bit Clear F的缩写。指令格式中的F,同上说明;符号b是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的取值为0~7或D0~D7。实例中REG是Register的缩写。实例中的2代表指令格式中的b=2即寄存器REG1的D2位。
  通过上述四条清零指令格式和实例,可以说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达方式。初学者没有必要死记指令,重要是理解和实践。
本文关于指令的注释将与前述指令中的略有不同。前述指令注释时是对指令具体完成的功能给以说明,这种注释方法对初学者确实易于接受和理解,但是实际应用中的PIC产品汇编语言的注释通常是以程序要做什么(或指令的作用)而不是说指令的直接功能。鉴于上述原因,下述的指令注释将改变过去的注释方法,用程序应起的作用作注释。
  10 寄程器半字节交换指令
  指令格式:SWAPF f,d
  说明:SWAPF是Swap f的合写。符号f、d的意义与前述的相同。该条指令的功能是寄存器f的高4位与低4位交换,即指令执行前,若寄存器f的8位状态为D7、D6、D5、D4、D3、D2、D1、D0,执行后的8位状态变为D3、D2、D1、D0、D7、D6、D5、D4,其结果存入W(d=0)或f(d=1)中。
  实例:中断现场保护是中断技术中重要部分。由于PIC16C××指令系统中没有进栈PUSH和出栈POP指令,所以只能用其它指令来实现。因为在主程序中常常用到工作寄存器W和状态寄存器STATUS,所以中断现场保护常要保护寄存器W和STATUS。
  下面是对PIC16C7×系列芯片中断现场保护的实例程序。
MOVWF?? W_TEMP  ??????? ;将W内容存入到临时寄存器             W_TEMP中SWAPF?? STATUS,W ??? ;交换STATUS与W内容
MOVWF STATUS_TEMP??? ;将STATUS的内容存入到临
…           时寄存器STATUS_TEMP中
中断服务程序

SWAPF?? STATUS_TEMP,W;交换STATUS_TEMP与W            的内容MOVWF STATUS   ?? 籗TATUS复原成原来的状态
SWAPF?? W_TEMP,F   ;交换内容
SWAPF?? W_TEMP,W  ;W复原成原来的状态
  说明:上述程序中各条指令的注释基本上都是以程序应达到的目的而注释的,对每条指令的功能几乎未涉及。这是初学者应特别注意的。
  11 子程序调用指令(Subroutine Call)
  指令格式:CALL k;k为立即地址
  说明:子程序调用,不同型号芯片的实现方法不尽相同,其共同点是首先将返回地址((PC)+1)压栈保护,再转入所调用的子程序入口地址执行(与MCS-51指令功能相似)。
指令格式模式:HERE??? CALL???? DELAY;调用延时子程序 
       … 
      DELAY MOVLW 0x80 ;延时子程序 
        ??? RETLW 0
  说明:调用指令执行前,PC=地址HERE
  调用指令执行后,PC=地址DELAY(标号),堆栈指针TOS=HERE+1(返回地址)。
  实例:见下条指令的实例
  12 寄存器内容取反指令
  指令格式:COMF f,d
  说明:COMF是Complement f的缩写。其中d=1时,操作(f)→f;d=0时,操作(f)→w。
  功能:寄存器f内容取反后送入W(d=0)或f自身(d=1)。
  实例: ??? ORG  ?? 0x1FF 
     ?? GOTO???? MAIN 
     ?? ORG  ?? 0
  DELAY???? …
  ?? MAIN????? MOVLW?? 0??????? ;主程序开始
  ??    TRTS????? 5??????? ;设置RA口为输出?
????????    ? BCF?????? 5,0  ;置RA口0位为0
  ?? LOOP  ?? CALL???? DELAY;闪动延时
      ? COMF???? 5 ?????? ;RA口求反(亮—灭—亮……控制)
      GOTO???? LOOP?? ;循环?
?        …
  说明:上述指令是一种PIC16C54 LED发光控制实验部分程序。其中延时子程序DELY未列出,但不影响本条指令的识读。程序中的主程序开始的三条指令,均已介绍过,紧跟着的CALL指令是调用执行子程序,其入口地址为标号DELAY。子程序执行结束后,又执行COMF 5的LED发光亮—灭…亮—灭……控制指令。后面一条GOTO LOOP指令是达到LED循环点亮目的。
  13 面向位的操作指令(共4条,PIC高级产品多增一条)
  该类指令除一条位清零外,另有一条寄存器f位b的置1指令和另外两条位跳步指令(PIC高级产品多增一条f的b位触发转换指令)。
  (1)位置1指令。指令格式 BSF f,b  说明:BSF是Bit Set f的缩写。F和b的意义与前述相同,该条指令的功能是将寄存器f的b位置1。
  (2)位测试、为零间跳指令。指令格式 BTFSC??? f,b  说明:BTFSC是Bit Test,Skip if Clear的缩写。指令功能是测试寄存器f位“b”,如为0,跳过下一条指令;为1顺序执行,即当f(b)=0时,就不执行当前指令而执行下一条指令(间跳),即用一条空指令NOP代替它,所以该条指令占用2个指令周期。
  (3)位测试、为1间跳指令。指令格式 BTFSS f,b  说明:BTFSS是Bit Test,Skip if Set的缩写。其指令的逻辑功能与上条相反,位测试f(b)=1就间跳执行,f(b)=0顺序执行。
  上面介绍的PIC 8位单片机汇编语言指令仅是部分指令,此外还有循环左、右移指令;W和寄存器f相“加”、相“与”指令和进入睡眠方式等指令。鉴于报纸版面的限制,不在这里一一介绍,今后将在程序的应用试验中再作补充说明。
有点多,建议你还是打印下来慢慢看!

阅读更多 >>>  化学检验工中级证书是什么

PIC单片机汇编语言求助

你想先学习汇编语言或C语言后,再来学习PIC单片机这个想法不可取.
我是去年暑假开始学习PIC单片机的,我之前只是在课堂上学了点微机原理和c语言,但只是学学而已,不挂科.
学习PIC单片机一定要理论和实际一起动手.也就是说你要分阶段来学,先看书只要你能写最小系统的程序就行.然后你在自己焊接扳子,做最小系统的实验.再做流水灯,数码管的显示,AD转换等等....都是理论和实践相结合.
我就是这样学的,虽然入门有点困难,但是只要入门了一个月就搞定了,之后你再学其它的单片机就简单多了.
我建议你先用汇编给PIC编程,等已经小有成就后,你在学习用C给51编程,等你学会了用C给51编程,再买本讲用C给PIC编程的书看3个小时你就会用c给PIC编程了.
一切都是理论和实践同步就行,我就是用这种方法来学单片机的,我现在已经学会了PIC\51\430\AVR了
首先,你已经知道这段是宏指令,那么macro这个伪指令就是声明这个宏指令的宏名和开始一段宏指令,知道出现endm才是结束宏。宏就类似于C语言中的函数,和汇编中的‘子程序’调用的不同的是,宏可以调用其他的宏或者调用自己(递归操作,如果你学过C语言就知道,最经典的就是做斐波那契数列)。但调用其他宏或者递归调用自己最多只能嵌套调用16次(超过就溢出)。
这样的话
ConfiguredUSB macro
。。。。
endm
其实就等于C语言中的:
void ConfiguredUSB ()
{
。。。。
}
另外宏可以带形参,比如ConfiguredUSB macro num1,num2 就等于 :
void ConfiguredUSB(uchar num1,uchar num2)
而调用宏并不需要CALL命令,而直接写宏名即可。
而local这个伪指令有点像C语言里的定义一个局部变量那样。比如写 local num1,num2
就等于C语言中的uchar num1,uchar num2.。并且,即使其他宏里或者主程序里出现num1,也不会和这个冲突,宏里面用local定义的变量只能在宏内部合法。而你这个程序里的local enumloop只是为了声明这个enumloop这个标签是宏内部的,可能在主程序里还有一个enumloop相同的标签,local是要提醒编译器不要把两个enumloop弄混乱了。
接下来说说程序,看宏名知道你这个宏是用于USB模块的设置的。banksel 还是一个伪指令,是指要跳转到USWSTAT所在的BANK,MOVLW 0X03把二进制数00000011读进工作寄存器W,然后让USWSTAT和w做与运算,其实就是要把USWSTAT的高6位都变成零,只留下低两位。结果存到W寄存器中。然后这个结果和编程者自己定义的CONFIG_STATE(可能是常量)进行比较如果相同,那么结束,不行同的话,goto到前面enumloop所指定的地方循环继续执行读USWSTAT低两位的操作。
BTW:楼上的 fbaiqd ,既然你已经会了这么多单片机,干嘛不解释解释这个程序??????

PIC单片机编程的介绍

该书是“图解PIC单片机应用技术”丛书之一。本书以从未接触过微控制器的人为对象,把理解编程基本思路作为重点,分别介绍PIC微控制器的内部动作,编程过程分析,PIC微控制器数字量接口的应用,以及如何熟练使用内置设备、驱动电机等。附录部分给出PIC的开发步骤、向PIC微控制器写入程序、指令表、PIC16F877A等。该书图文并茂,实例丰富,内容循序渐进,具有很强的实用性。该书可供PIC单片机爱好者、高等院校相关专业师生,以及从事PIC单片机项目开发制作的工程技术人员阅读和参考。

大家好,我是初学PIC12F683单片机,我编写了一个按键扫描程序,不知道怎么哪里出错,一直实现不了,请大家

第一个按键扫描 if(key1==0)
led1=0; 点亮
else led1=1; 灭
第二个按键扫描 if(key2==0)
led2=0; 点亮
else led2=1; 灭
两个按键都不按时候 if((key1)&&(key2))
led3=0; 点亮
else led1=1; 灭
程序写完了。 自己复制过去吧。
那些消抖我就不写了,只把主要的写了。
if(GPIO0=0) //这个的意思不是GPIO0==0,你修改一下
TRISIO这个是方向寄存器,是表示IO口是输入还是输出,TRISIO=1表示输入,TRISIO=0表示输出;
GPIO这个是数据寄存器,GPIO=1表示IO口输出高电平,GPIO=0表示输出代电平
#include

void delay(int x)

{

int a,b;

for(a=x;a>0;a--)

for(b=110;b>0;b--);

}

void main()

{

ANSEL=0;

CMCON0=0X07;

TRISIO0=1;

TRISIO1=1;

TRISIO2=0;

TRISIO3=0;

TRISIO4=0;

while(1)

{

if(GP0==0)

{

delay(20);

if(GP0==0)

{

GP2=0;//点亮LED1

}

}

if(GP1==0)

{

delay(20);

if(GP1==0)

{

GP3=0;//点亮LED2

}

}

if(GP1 && GP1)

{

GP2=0;

}

}

}

领教了。

我初学PIC单片机C语言编程,请问C语言中如何定义PIC16C管脚。我用的是MPLAB中的PICC编程工具。

需要查看芯片说明书,看看你要定义的管脚所用到的寄存器,然后定义,你可以搜索一下PIC16C通用手册看看
TRISA=0FFH,定义为输入
TRISA=00H,定义为输出,其他类似
直接用就可以了,干嘛还定义!

网站数据信息

"pic单片机编程入门,pic单片机 实现10ms定时的简单程序"浏览人数已经达到19次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:pic单片机编程入门,pic单片机 实现10ms定时的简单程序的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!