Ⅰ 刚学PIC16F877,第一条程序就不懂了。。。 下面这条是什么意思 “ __CONFIG(WDTDIS&LVPDIS&RC); ”
这些东西其实是宏定义出来的,是对配置位的各种配置信息的宏定义,你要找到定义他们的头文件
WDTDIS 看门狗关闭,WDT是看门狗寄存器 WDTDIS是watchdog disable的缩写
LVPDIS 低压编程方式关闭
RC RC振荡
Ⅱ PIC单片机串口C程序
#include<reg51.h>
unsigned char a,flag;
unsigned int i;
void init_serial();
void init_serial() //初始化串口
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void serial() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
void main()
{
init_serial();
i=100;
flag=0;
while(1)
{
if(flag==1) //接受串口信息
{
ES=0;
P0=0x00;
while(i--);
P0=0xff;
SBUF=a;
flag=0;
while(!TI);
TI=0;
i=100;
ES=1;
}
}
}
这个是我自己写的,单片机与计算机串口通信。计算机向单片机发送一个数据 然后单片机接受到后又把那个数据返回计算机。 欢迎提问……
Ⅲ pic单片机EEPROM怎么编写程序
在你的C文件里引用EEPROM函数的头文件,eeprom_routines.h
然后在程序中使用
voideeprom_write(unsignedcharaddr,unsignedcharvalue);
unsignedchareeprom_read(unsignedcharaddr);
这两个函数了。
这两个函数一个读一个写。比如你想写0x10到地址为0x55的EEPROM,
就写:eeprom_write(0x55,0x10);
同理,如果想读取0x55地址处的值,
就写:ee_value=eeprom_read(0x55);
如果编译时编译器提示找不到eeprom_routines.h,可以在
X:ProgramFilesHI-TECHSoftwarePICC9.81include目录下找,然后复制到自己项目文件夹下。
对了,我用的是MPLabIDE,编译器使用的是PICC。
Ⅳ pic线路优选怎么用
pic线路优选的用法如下:
1、运行picpick程序,单击左上角的“文件”按钮。
2、在弹出窗口的右侧列表单击一种截图类型。
3、在功能区中进行相关的设置。
4、接着再单击“文件”菜单,出来的列表将鼠标移动到“另存为”,点击一种图片格式。PicPick是一款截取全屏、活动窗口、指定区域、固定区域、手绘区域功能,支持滚动截屏,屏幕取色,支持双显示器,具备白板、屏幕标尺、直角坐标或极坐标显示与测量,具备强大的图像编辑和标注功能的软件。截图可以保存到剪贴板、自动或手动命名的文件(png/gif/jpg/bmp)。
Ⅳ 最近刚学PIC单片机,有个程序看不懂,请高手帮下,越详细越好:
INDF 和 FSR两个寄存器构成了一个间接寻址的作用。
FSR有点像C语言中的指针,INDF是一个虚拟的寄存器,对它操作其实是对FSR锁指向的内存单元操作。
简单的说,当20h这个数赋给了FSR,那么就是FSR作为指针指向了内存中地址为20h的这个单元(以下就用<20h>来表示这个单元,以区别十六进制的20h这个数值),此时INDF就被映射到<20h>。
从头说起:
1:W被赋值20h这个数;2:FSR被赋值和W寄存器相同的数20H,此时FSR指向了<20h>;3:此时W寄存器因为没被改变过,所以其数值依然是十六进制的20h那么MOVWF 20H其实就是把W里的数据赋值给<20h>这个内存单元 也就是 <20h> = 20H ;
4:重点来了 INCF INDF,让INDF自加1。前面说了对INDF操作其实就是对FSR所指向的单元操作,也就等同于 INCF <20h>(真正程序里不能这么写的,因为<20h>这杨写法是错误的) 类似C与语言中的<20h>++
5:FSR自加1,FSR内部的值等于21h所以FSR指向了<21h>这个内存单元。
6:<20h>单元的数值高4位和低4位转换一下数据。所以 <20h> = 02h
7:把<20h>的内容赋值给W寄存器,所以w = 02h
8:FSR此时 等于21h ,把21h和W的02h做与运算,结构 0 赋值给FSR。
Ⅵ 大家帮我看个PIC的LED闪烁程序
小哥,问题表达清楚,是要A端口的某一个LED闪烁还是所有A端口LED闪烁;
TRISA=0X07表明RA0,RA1,RA2是作为输入功能的,当然不能作为输出去控制LED;
另外,想对A端口的某一位操作,可定义成TRISAbits.TRISA3,就是你理解的TRISA3;
其他的如LATAbits.LATA3、PORTAbits.RA3
Ⅶ PIC单片机程序
MOVF 30H,W 将寄存器30H的值放入W寄存器
ADDWF 50H,F 把W寄存器与寄存器50H的值相加,结果放在50H
BTFSS STATUS,C 判断STATUS寄存器里的C位是否置1(这是一个进位标志,判断30H和50H的值相加时候有没有产生进位),如果为1则跳过下一条指令(GOTO LOOP)
INCF 20H,F 寄存器20H的值加1,结果存在20H(这是因为低位30H和50H相加时候产生进位了,所以高位要加一)
MOVF 20H,W 把20H的值放入W寄存器
ADDWF 40H,F 20H和40H的值相加,结果保存在40H
其实整个程序的意思就是低位相加:30H+50H
再进行高位相加:20H+40H
中间加入判断了一下30H+50H的时候有没有进位产生
程序没有问题。
Ⅷ PIC单片机指令
F代表本次操作的寄存器,
在MOVF
20H,
F
这句话里表示吧W寄存器的数据存到地址为20H的空间里.
你可以看看
头文件
的
宏定义
里,
F是等于1的,W等于0,
MOVF
20H,
F
其实是对应了MOVF
20H,
1
这句话.
只是为了让程序员写程序的时候好判断,特此在头文件里宏定义了
出现F就表示是1,如果出现W,就表示0.
MOVF
20H,
F
这句话最后的这个位置,
可以写F或W或1或0
而
ADDWF
f,d
和上面的MOVF
f,d一样,只是这个指令的说明而已.
并不能用在真正的程序里
,或者说它像一个公式
的解释,
你要用MOVF这条指令,
它的结构是MOVF
f,d这样的,
运用的时候,
MOVF不变,把小写f替换成你要操作的寄存器(这里是20H),然后
后面这个小写d
是替换成上面说的
F或W或1或0
或者
这个d的位置可以省略不写.
下面说一下这几个句子的区别,
咱们先假定程序有一个地址在20h的变量TMP
ADDWF
f,d
;
这只是一个
教科书上对这指令的解释,
告诉你f
应该填什么东西,
d应该填什么东西()
ADDWF
TMP,F
;
这才是程序,意思是吧W寄存器的数值和TMP相加结果存到TMP里,F在这里告诉单片机结果存到TMP里
.
操作数
是
W寄存器和TMP变量
ADDWF
20H
,F
;这和前面那句一样只是
不用TMP,直接用地址来表示变量
ADDWF
20H
,1
;这和前面那句一样只是
不用TMP,直接用地址来表示变量,并且F用1表示,
=======分界线,下面的指令和上面的逻辑上不同=============
ADDWF
TMP,W
这个是指W寄存器和TMP变量相加,结果存到W里
,
W在这里表示结果存到W寄存器里
ADDWF
TMP,
1
和前面那句话一样,只是W用1来表示.
ADDWF
TMP
这个是最常用的,如果TMP这个操作数后面的是W或者是0,那么它可以省略掉,跟前面的一个意思
,就是把W和TMP相加,结果存到W里.
ADDWF
20H
同上
综上所述,
这只是一个表述的问题而已.
另外指出一下你的错误
“将f寄存器内容传送至W(d=0)或者(d=1),这是函数的原型!”
这只是指令说明,没有什么函数的,不要把它看成是什么函数。汇编里没有函数的,没有类似数学的函数表达式,也没有
C程序
的那种函数(在汇编里类似于
C函数
的叫做“
子程序
”)
,
PIC单片机
的数据手册对初学者来说不太好理解的,
如果还有
不懂可以在
网络HI
里问我,或者发站内信。
Ⅸ pic单片机 实现10ms定时的简单程序
刚刚学PIC单片机编程,一个装置,在接受到中断时,装置不报警,没有接受到另外,CGQ值对alarm_silencer();影响的逻辑关系有点乱,所以我没看alarm_,
Ⅹ 求PIC单片机汇编示例程序
想知道哪种,给你粘贴,下面是一些计算子程序
;******************************************************************
;一、十六位二进制转换为BCD数子程序
;******************************************************************
MOVLW 10H ;
MOVWF CNT ;
BCF STATUS,C ;
CLRF R2 ;
CLRF R1 ;
CLRF R0 ;
LOOP RLF AL ;
RLF AH ;
RLF R0 ;
RLF R1 ;
RLF R2 ;
DECFSZ CNT ;
GOTO ADJDEC ;
RETURN
ADJDEC MOVLW R0 ;
MOVWF FSR ;
CALL ADJBCD ;
MOVLW R1 ;
MOVWF FSR ;
CALL ADJBCD ;
MOVLW R2 ;
MOVWF FSR ;
CALL ADJBCD ;
GOTO LOOP ;
ADJBCD MOVLW 3H ;
ADDWF INDF,W ;
MOVWF TMP ;
BTFSC TMP,3 ;
MOVWF INDF ;
MOVLW 30H ;
ADDWF INDF,W ;
MOVWF TMP ;
BTFSC TMP,7 ;
MOVWF INDF ;
RETURN
;***************************************************************************
;乘法宏
;两个八位无符号数乘法,乘积为十六位。部分积右移相加算法:乘数带进位右移一位,
;检查进位是否为一,若是一,部分积寄存器加被乘数,否则不加;然后部分积寄存器
;带进位右移一位;重复上述过程直至循环次数为八结束。
;***************************************************************************
;宏的引用格式:MUL A,B
;完成操作: (A)*(B)---(A,B)
;影响状态位:C、Z和DC
;8*8位乘法宏MUL,结果的高字节部分存入(A),低字节存入(B)
;***************************************************************************
MUL MACRO A,B ;
LOCAL MLOOP ;
;****************************************************************************
;如只用乘法子程序,就下段。
;****************************************************************************
CLRF TMPA ;
CLRF TMPB ;
MOVLW 8 ;
MOVWF CNT ;
MOVF A,W ;
BCF STATUS,C ;
MLOOP RRF B ;
BTFSC STATUS,C ;
ADDWF TMPA ;
RRF TMPA ;
RRF TMPB ;
DECFSZ CNT ;
GOTO MLOOP ;
MOVF TMPA,W ;
MOVWF A ;
MOVF TMPB,W ;
MOVWF B ;
;*****************************************************************************
ENDM
;*****************************************************************************
;除法宏DIV
;除法是乘法的逆运算。与十进制长除法类似,从被除数的最高有效位开始,把被除数左移
;一位至余数上,如果余数不够减去除数,则商寄存器左移,移入位为零,反之移入位为一
;余数减去被除数,把被除数的下一位移至除数上。重复上述过程直至处理完所有位。
;******************************************************************************
;宏的引用格式:DIV A,B
;完成操作: (A)为商部分,(B)为余数部分
;影响状态位:C、Z和DC
;8/8位除法宏DIV,结果(A)为商部分,(B)为余数部分
;***************************************************************************
DIV MACRO A,B ;
LOCAL MLOOP ;
;****************************************************************************
;如只用除法子程序,就下段。
;****************************************************************************
MOVF A,W ;
MOVWF TMPA ;
MOVF B,W ;
MOVWF TMPB ;
MOVLW 8 ;
MVOWF CNT ;
CLRF A ;
CLRF B ;
DLOOP BCF STATUS,C ;
RLF TMPA ;
RLF B ;
MOVF TMPB,W ;
SUBWF B,W ;
BTFSC STATUS,C ;
MOVWF B ;
RLF A ;
DECFSZ CNT ;
GOTO DLOOP ;
;****************************************************************************
ENDM ;
;****************************************************************************
;间接寻址
CLRF R0 ;清除R0寄存器里的内容
MOVLW R0 ;
MOVWF FSR ;将R0寄存器的地址送入间接寻址指针FSR
MOVF INDF,0 ;
MOWF TEMP ;将间接寻址指针FSR所指地址R0寄存器里的内容送入TEMP
MOVLW 88H ;
MOVWF INDF ;将88H送入间接寻址指针FSR所指地址R0寄存器里
;*******************************************************************************
;将两位BCD数送入显示
;显示十位BCD数
DISPLAY SWAPF TEMP,W ;将TEMP寄存器里的内容的高低字节交换并送入W
ANDLW 0FH ;将0FH与W寄存器里的内容相与并送入W
CALL CODE_TAB ;查表取段码
MOVWF PORTD ;送入PORTD端口
MOVLW 1H ;
MOVWF PORTC ;选通PORTC,1
CALL DELAY ;调用延时
;显示个位BCD数
MOVF TEMP,W ;
ANDLW 0FH ;
CALL CODE_TAB ;
MOVWF PORTD ;
MOVLW 2H ;
MOVWF PORTC ;
CALL DELAY ;
;*********************************************************************************************
;16位二进制除以8位二进制
;*******************************************************************************************
DIV16
MOVF A,0
MOVWF DIV_H
MOVF BX,0
MOVWF DIV_L ;被除数高低字节分别送进各寄存器
MOVLW 9H
MOVWF DIVB ;将除数送进寄存器
MOVLW 10H
MOVWF CNT ;按被除数位数设定移位次数
CLRF AL
CLRF AH
CLRF BX
DLOOP
BCF STATUS,C
RLF DIV_L
RLF DIV_H
RLF BX
MOVF DIVB,W
SUBWF BX,W
BTFSC STATUS,C
MOVWF BX
RLF AL
RLF AH
DECFSZ CNT
GOTO DLOOP
RETURN
;****************************************************************************************************
;8位乘以16位二进制乘法运算程序
;****************************************************************************************************
MUL8
CLRF TMPA ;清除积的高位寄存器
CLRF TMPB ;清除积的中位寄存器
CLRF TMPC ;清除积的低位寄存器
MOVLW 10H ;因为8位二进制乘以16位二进制,乘数为16位,移位乘数,所以移位次数为16次
MOVWF CNT ;
MOVF BX,W ;将8位被乘数送进W
BCF STATUS,C;
MLOOP RRF TEMP_H ;
RRF TEMP_L ;带C循环右移16位乘数
BTFSC STATUS,C ;
ADDWF TMPA ;
RRF TMPA ;
RRF TMPB
RRF TMPC
DECFSZ CNT ;
GOTO MLOOP ;
MOVF TMPA,W ;
MOVWF AA ;
MOVF TMPB,W ;
MOVWF A
MOVF TMPC,W ;将乘积送进各寄存器。
MOVWF BX
RETURN