如果你习惯用C语言写程序的话,先告诫你,PIC系列的8位单片机很少用汇编写程序的。微芯也没推出针对pic8位单片机的C语言编译器(PIC18除外)。所以要用到C的时候,要用PICC这个编译器(这软件最便宜的也要五六百,但网上有破解)。如果用pic18系列或者PIC的16位单片机的话,推荐用微芯出的C语言编译器。(比PICC还贵,但也有破解的)。
搜索栏里找
你看看是这个不:
#ifndef _PIC_H
#define _PIC_H
#if defined(_10F200) || defined(_10F202) ||\\
defined(_10F204) || defined(_10F206)
#include <pic10f20xh>
#endif
#if defined(_12C508) || defined(_12C509) ||\\
defined(_12F508) || defined(_12F509) ||\\
defined(_12C508A) || defined(_12C509A) ||\\
defined(_12CE518) || defined(_12CE519) ||\\
defined(_12C509AG) || defined(_12C509AF) ||\\
defined(_12CR509A) || defined(_RF509AG) ||\\
defined(_RF509AF)
#include <pic125xxh>
#endif
#if defined(_16C432) || defined(_16C433)
#include <43xh>
#endif
#if defined(_16C52) || defined(_16C54) || defined(_16C54A) ||\\
defined(_16C54B) || defined(_16C54C) || defined(_16CR54A) ||\\
defined(_16CR54B) || defined(_16CR54C) || defined(_16C55) ||\\
defined(_16C55A) || defined(_16C56) || defined(_16C56A) ||\\
defined(_16CR56A) || defined(_16C57) || defined(_16C57C) ||\\
defined(_16CR57B) || defined(_16CR57C) || defined(_16C58A) ||\\
defined(_16C58B) || defined(_16CR58A) || defined(_16CR58B) ||\\
defined(_16C58) || defined(_16HV540)
#include <5xh>
#endif
#if defined(_16F54) || defined(_16F57)
#include <f5xh>
#endif
#if defined(_12C671) || defined(_12C672) ||\\
defined(_12CE673) || defined(_12CE674)
#include <pic1267xh>
#endif
#if defined(_12F629) || defined(_12F675)
#include <pic12f6xh>
#endif
#if defined(_12F683)
#include <pic12f683h>
#endif
#if defined(_12F675F) || defined(_12F675H) || defined(_12F675K)
#include <pic12rf675h>
#endif
#if defined(_16C505) || defined(_16F505)
#include <505h>
#endif
#ifdef _14000
#include <pic14000h>
#endif
#if defined(_16C554) || defined(_16C556) || defined(_16C557) || \\
defined(_16C558) || defined(_16C554A) || defined(_16C556A) || \\
defined(_16C558A)
#include <55xh>
#endif
#ifdef _16C61
#include <61h>
#endif
#if defined(_16C62) || defined(_16C62A) || defined(_16CR62) ||\\
defined(_16C62B)
#include <62h>
#endif
#if defined(_16C620) || defined(_16C621) || defined(_16C622) ||\\
defined(_16C620A) || defined(_16C621A) || defined(_16C622A) ||\\
defined(_16CE623) || defined(_16CE624) || defined(_16CE625) ||\\
defined(_16CR620A)
#include <62xh>
#endif
#if defined(_16C64) || defined(_16C64A) || defined(_16CR64)
#include <64h>
#endif
#if defined(_16C641) || defined(_16C642) ||\\
defined(_16C661) || defined(_16C662)
#include <6xxh>
#endif
#if defined(_16C65) || defined(_16C65A) || defined(_16CR65)
#include <65h>
#endif
#if defined(_16C66) || defined(_16C67)
#include <6xh>
#endif
#if defined(_16C71) || defined(_16C710) || defined(_16C711)
#include <71xh>
#endif
#if defined(_16C712) || defined(_16C715) || defined(_16C716)
#include <715h>
#endif
#if defined(_16C72) || defined(_16C72A) || defined(_16CR72)
#include <72h>
#endif
#if defined(_16C73) || defined(_16C73A) ||\\
defined(_16C74) || defined(_16C74A) ||\\
defined(_16C63) || defined(_16CR63) || defined(_16C63A) ||\\
defined(_16C65B) || defined(_16C73B) || defined(_16C74B) ||\\
defined(_16LC74B)
#include <74h>
#endif
#if defined(_16C76) || defined(_16C77)
#include <77h>
#endif
#if defined(_16C773) || defined(_16C774) || defined(_16C770) ||\\
defined(_16C771) || defined(_16C717) || defined(_16C745) ||\\
defined(_16C765)
#include <77xh>
#endif
#if defined(_16C781) || defined(_16C782)
#include <78xh>
#endif
#if defined(_16F627) || defined(_16F628)
#include <f6xh>
#endif
#if defined(_16F627A) || defined(_16F628A) || defined(_16F648A)
#include <f62xah>
#endif
#if defined(_16F630) || defined(_16F676)
#include <630h>
#endif
#if defined(_12F635) || defined(_16F636)
#include <f636h>
#endif
#if defined(_16F684)
#include <f684h>
#endif
#if defined(_16F688)
#include <f688h>
#endif
#if defined(_16F83) || defined(_16CR83) || defined(_16C84) || \\
defined(_16F84) || defined(_16F84A) || defined(_16CR84)
#include <84h>
#endif
#if defined(_16F87) || defined(_16F88)
#include <f87h>
#endif
#if defined(_16F873) || defined(_16F874) ||\\
defined(_16F876) || defined(_16F877) ||\\
defined(_16F872) || defined(_16F871) ||\\
defined(_16F870)
#include <87xh>
#endif
#if defined(_16F873A) || defined(_16F874A) ||\\
defined(_16F876A) || defined(_16F877A)
#include <8xah>
#endif
#if defined(_16F72) ||\\
defined(_16F73) || defined(_16F74) ||\\
defined(_16F76) || defined(_16F77)
#include <f7xh>
#endif
#if defined(_16F716)
#include <f716h>
#endif
#if defined(_16F737) || defined(_16F747) ||\\
defined(_16F767) || defined(_16F777)
#include <f7x7h>
#endif
#if defined(_16F818) || defined(_16F819)
#include <f81xh>
#endif
#if defined(_16C923) || defined(_16C924) ||\\
defined(_16C925) || defined(_16C926)
#include <9xxh>
#endif
#if defined(_7C695X)
#include <pic7695xh>
#endif
#if defined(_16C99) || defined (_16C99C)
#include <99h>
#endif
#if defined(_17C42) || defined(_17C42A) || defined(_17CR42) ||\\
defined(_17C43) || defined(_17CR43) || defined(_17C44)
#include <pic174xh>
#endif
#if defined(_17C752) || defined(_17C756) || defined(_17C756A) ||\\
defined(_17C762) || defined(_17C766)
#include <pic177xxh>
#endif
#define CLRWDT() asm("clrwdt")
#define SLEEP() asm("sleep")
#define NOP() asm("nop")
#define ___mkstr1(x) #x
#define ___mkstr(x) ___mkstr1(x)
#define __CONFIG(x) asm("\\tpsect config,class=CONFIG,delta=2");\\
asm("\\tdw "___mkstr(x))
#define __IDLOC(w) asm("\\tpsect idloc,class=IDLOC,delta=2");\\
asm("\\tglobal\\tidloc_word"); \\
asm("idloc_word"); \\
asm("\\tirpc\\t__arg," ___mkstr(w)); \\
asm("\\tdw 0&__arg&h"); \\
asm("\\tendm")
#if EEPROM_SIZE > 0
#define __EEPROM_DATA(a, b, c, d, e, f, g, h) \\
asm("\\tpsect eeprom_data,class=EEDATA,delta=2"); \\
asm("\\tdb\\t" ___mkstr(a) "," ___mkstr(b) "," ___mkstr(c) "," ___mkstr(d) "," \\
___mkstr(e) "," ___mkstr(f) "," ___mkstr(g) "," ___mkstr(h))
#endif
/
FLASH memory read/write/erase macros and function definitions
Notes:
__FLASHTYPE == 0 defined in devices that can only read flash memory - cannot write eg 16F777
__FLASHTYPE == 1 defined in traditional devices that can write 1 word at a time eg 16F877
__FLASHTYPE == 2 defined in devices that can only write in 4 word blocks eg 16F877A
__FLASHTYPE == 3 defined in devices requiring 32-word block erasure before writing eg 16F87
__FLASHTYPE == undefined if device can neither read nor write program memory
/
// macro FLASH_READ returns a word stored at a flash address
#if defined(__FLASHTYPE)
extern unsigned char flash_read(unsigned short addr);
#if EEPROM_SIZE > 0
#define FLASH_READ(addr) \\
(EEADR=(addr)&0xff, \\
EEADRH=(addr)>>8, \\
WREN=0, \\
EECON1 |= 0x80, \\
RD=1, \\
DC=0, \\
DC=0, \\
(EEDATH << 8) | EEDATA)
#else // FLASH_READ without EEPROM
#define FLASH_READ(addr) \\
(EEADR=(addr)&0xff, \\
EEADRH=(addr)>>8, \\
RD=1, \\
DC=0, \\
DC=0, \\
(EEDATH << 8) | EEDATA)
#endif
#endif // end FLASH_READ
// macro FLASH_WRITE used when writing only one word of data
#if __FLASHTYPE==2 || __FLASHTYPE==3
#define FLASH_WRITE(addr,data) \\
do{ \\
unsigned short x=data; \\
flash_copy((const unsigned char )&x,1,addr); \\
}while(0)
extern void flash_copy(const unsigned char source_addr,unsigned char length,unsigned short dest_addr);
#elif __FLASHTYPE==1
#define FLASH_WRITE(addr, value) \\
EEADR=((addr)&0xff); \\
EEADRH=((addr)>>8); \\
EEDATH=((value)>>8); \\
EEDATA=((value)&0xff); \\
EECON1 |= 0x80; \\
WREN=1; \\
EECON2 = 0x55; \\
EECON2 = 0xaa; \\
WR=1; \\
asm("nop"); \\
asm("nop"); \\
WREN=0
#endif // end FLASH_WRITE
// macro FLASH_ERASE used to clear a 32-Byte sector of flash
#if __FLASHTYPE==3
#define FLASH_ERASE(addr) \\
while(WR)continue; \\
EEADR=((addr)&0xFF); \\
EEADRH=((addr>>8)&0xFF); \\
EECON1=0x94; \\
CARRY=0;if(GIE)CARRY=1;GIE=0;\\
EECON2=0x55;EECON2=0xAA;WR=1; \\
asm("\\tNOP"); \\
if(CARRY)GIE=1
// library function version
extern void flash_erase(unsigned short addr);
#endif // end FLASH_ERASE
//
/ EEPROM memory read/write macros and function definitions /
//
#if EEPROM_SIZE > 0
#ifdef __FLASHTYPE
// macro versions of EEPROM write and read
#define EEPROM_WRITE(addr, value) \\
while(WR)continue;EEADR=(addr);EEDATA=(value); \\
EECON1&=0x7F;CARRY=0;if(GIE)CARRY=1;GIE=0; \\
WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \\
if(CARRY)GIE=1
#define EEPROM_READ(addr) ((EEADR=(addr)),(EECON1&=0x7F),(RD=1),EEDATA)
#else // else doesn\'t write flash
#define EEPROM_WRITE(addr, value) \\
while(WR)continue;EEADR=(addr);EEDATA=(value); \\
CARRY=0;if(GIE)CARRY=1;GIE=0; \\
WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \\
if(CARRY)GIE=1
#define EEPROM_READ(addr) ((EEADR=(addr)),(RD=1),EEDATA)
#endif
/ library function versions /
extern void eeprom_write(unsigned char addr, unsigned char value);
extern unsigned char eeprom_read(unsigned char addr);
#endif // end EEPROM routines
//
/ Global interrupt enable/disable macro definitions /
//
#ifdef _PIC16
#ifndef ei
#define ei() (GLINTD = 0) // interrupt disable bit
#endif ei
#if defined(_17C42)
#ifndef di
#define di() { do { GLINTD = 1; } while ( GLINTD == 0 ); } // disable interrupt bit
#endif di
#else
#ifndef di
#define di() (GLINTD = 1) // interrupt disable bit
#endif di
#endif
#elif defined _PIC14
#ifndef ei
#define ei() (GIE = 1) // interrupt enable bit
#endif ei
#if defined(_14000) || defined(_16C61) || defined(_16C62) ||\\
defined(_16C63) || defined(_16C63A) || defined(_16C64) ||\\
defined(_16C65) || defined(_16C65B) || defined(_16C71) ||\\
defined(_16C73) || defined(_16C73B) || defined(_16C74) ||\\
defined(_16C74B) || defined(_16C84) || defined(_16C745) ||\\
defined(_16C765) || defined(_16LC74B)
#ifndef di
#define di() { do { GIE = 0; } while ( GIE == 1 ); } // disable interrupt bit
#endif di
#else
#ifndef di
#define di() (GIE = 0) // interrupt enable bit
#endif di
#endif
#endif
#endif / _PIC_H /
单片机的结构可以精划分为内核+外设;
即 “单片机内核+外设 = 单片机”,如果内核相同的两个单片机,相互之内是兼容的,虽不完全兼容,但是可以达到85%,比如说AT89S53和STC89系列的,都是51的内核,所以他们是85%兼容的,基本上AT89S53上内运行的,在STC89系列都能运行。
而你问的两种单片机,同属于一种内核,即8051内核,所以85%以上是能通用的,只有个别的寄存器可能需要小小改动一下。
想知道哪种,给你粘贴,下面是一些计算子程序
;
;一、十六位二进制转换为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
;88位乘法宏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
给你几个型号,如果一定要15V工作,只有加升压芯片
PIC12F508:8脚,2-55V
PIC10F200:6脚,2-55V
P89LPC01:8脚,24-36V,除电压外,与PC12F508 pin-to-pin兼容
MC9RS08KA1:6或8脚,18-55V
主要有:
MOV P1,#0AAH
ACALL延迟
MOV P1,#55H
ACALL延迟
SJMP主要
延迟:MOV R7,#0FFH /> DE:MOV R6
DJNZ R6,#0FFH,
DJNZ R7,
RET
最后,这是你想要的效果,不妨试试哦!
以上就是关于pic单片机用什么开发软件(pic单片机开发环境)全部的内容,包括:pic单片机用什么开发软件(pic单片机开发环境)、怎样在我的电脑中找到pic.h头文件、pic单片机程序不同能用吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)