Ⅰ 剛學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