A. PIC16F887單片機如何使用內部振盪器作為系統時鍾源
PIC16F877好像沒有內部震盪源,需要外界電阻電容或晶體.因為很長時間不玩PIC的晶元了,有點忘了.說的不對請諒解.
B. 晶振20MHZ,用C語言編寫一個延時5ms的函數
如果用軟體延時,你可以用示波器測試,修改參數,直到調准為止。
C. 高手你好,單片機PIC16F887與PIC16F877A主要有什麼區別編程時要注意哪些
主要區別,887是納瓦系列,功耗比877或877a要低;
887有內部RC振盪器,887/887A沒有內部振盪器;
887有一個普通CCP模塊,一個增強型CCP模塊,877A只有兩個普通的CCP模塊;
887有十四個10位AD輸入通道,877隻有八個10位AD輸入通道
887可以使用內部復位電路(RE3可以做IO或者做復位引腳),877A無此功能;
還有其他的東西,在實際的使用中,你要對著DATASHEET來看(特別是IO口的使用,不同的型號IO口內部結構都可能不太一樣,認真看datasheet),887有中文的datasheet,去這里下載chinese版本的: http://ww1.microchip.com/downloads/en/DeviceDoc/41291e_cn.pdf
877A沒有中文版,如果用到那就自己慢慢看英文的: http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf
另外,我很少用PROTEUS(上大學時候用過),現在我基本上是用實際晶元來做硬體模擬。沒法回答你的PROTEUS問題。但我可以告訴你的是,Mplab IDE里的debuger選項中有Proteus VSM。你可以在Proteus軟體里先畫好圖,然後保存關閉。然後在MPLAB里打開你的程序項目,然後打開Debugger -> Select Tools -> Proteus VSM,然後在彈出的PROTEUS窗口打開你剛畫的PROTEUS文件,就可以在MPLAB里直接調用Proteus來模擬程序了。 這樣可以直接單步調試程序,可以讓你直觀看到每一條指令對單片機和電路的改變。
D. PIC16f887 點亮LED 問題
__CONFIG(FOSC_INTRC_NOCLKOUT & WDTE_OFF & PWRTE_ON& CP_OFF& BOREN_OFF& MCLRE_ON&IESO_OFF& FCMEN_OFF&LVP_OFF );
這樣試一下看
E. 誰有用pic單片機16f877實現產生隨機數的c語言程序和模擬圖
這個簡單,你開一個定時器,然後隨機讀取定時器內的值,該值就是隨機數了。當然,這個是偽隨機數。
F. 單片機C語言
#include <intrins.h>
c51中的intrins.h庫函數
_crol_ 字元循環左移
_cror_ 字元循環右移
_irol_ 整數循環左移
_iror_ 整數循環右移
_lrol_ 長整數循環左移
_lror_ 長整數循環右移
_nop_ 空操作8051 NOP 指令
_testbit_ 測試並清零位8051 JBC 指令
詳解:
函數名: _crol_,_irol_,_lrol_
原 型: unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
功 能:_crol_,_irol_,_lrol_以位形式將val 左移n 位,該函數與8051「RLA」指令
相關,上面幾個函數不同於參數類型。
例:
#include
main()
{
unsigned int y;
C-5 1 程序設計 37
y=0x00ff;
y=_irol_(y,4); /*y=0x0ff0*/
}
函數名: _cror_,_iror_,_lror_
原 型: unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
功 能:_cror_,_iror_,_lror_以位形式將val 右移n 位,該函數與8051「RRA」指令
相關,上面幾個函數不同於參數類型。
例:
#include
main()
{
unsigned int y;
y=0x0ff00;
y=_iror_(y,4); /*y=0x0ff0*/
}
函數名: _nop_
原 型: void _nop_(void);
功 能:_nop_產生一個NOP 指令,該函數可用作C 程序的時間比較。C51 編譯器在_nop_
函數工作期間不產生函數調用,即在程序中直接執行了NOP 指令。
例:
P()=1;
_nop_();
P()=0;
函數名: _testbit_
原 型:bit _testbit_(bit x);
功 能:_testbit_產生一個JBC 指令,該函數測試一個位,當置位時返回1,否則返回0。
如果該位置為1,則將該位復位為0。8051 的JBC 指令即用作此目的。
_testbit_只能用於可直接定址的位;在表達式中使用是不允許的。
G. 繪制一單片機最小系統電路圖,編寫程序控制P1.7口輸出低電平,並點亮發光二極體。求大神解答哇😭
編程實現對 8 個 LED 的輸出控制 將實驗箱中的 8255 片選信號連接到 218H~21FH,將 8255 的 4 個寄存器地址(A、B、 C 埠及控制字寄存器埠)設置為 218H~21BH。將 8255 的埠 A 的 8 個引腳:PA0~PA7 與 8 個 LED 對應相連,然後打開實驗箱電源,最後編程對 8 個 LED 進行顯示控制。
程序清單:
CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,21BH
MOV AL,80H
OUT DX,AL ;工作方式初始化
MOV DX,218H
MOV AL,0FEH ;設置輸出數據,即顯示模式
MOV CX,80 ;設置循環次數
LN: OUT DX,AL
ROL AL,1
CALL DELAY ;調用延遲程序
LOOP LN
MOV AH,4CH
INT 21H ;返回 dos
DELAY PROC ;延遲子程序
PUSH CX
MOV BX,2000
A0: MOV CX,3000
A1: LOOP A1
DEC BX
JNZ A0
POP CX
RET DELAY
ENDP
CODE ENDS
END START。吳鑒鷹單片機開發板。
從剛開始接觸單片機,到現在已經有4年的時間了,在這期間學習和使用了51單片機、飛思卡爾單片機,LPC2138,PIC16F887等系列的單片機,每接觸一款單片機,都會經歷熟悉其基本開發,然後將其用於項目中的過程,對於如何學習一款單片機,自己做了如下的總結。
大家都知道,51單片機是最容易入門的,不僅因為其編程簡單,更重要的是網上的資料非常豐富。所以一般學習單片機開發的都將51單片機作為入門開發的首選。我學習51單片機的時候是採用這樣的一個步驟進行學習的:
第一步(熟悉的過程):買了一款51單片機開發板,然後就開始了我的學習之旅,剛開始的時候沒有去看視頻教程,而是對著一本實驗教材進行學習,那本實驗教材的名字記不清楚了,但是其內容就是圍繞單片機的LED燈進行控制,將51單片機內部的各個功能部件全部都使用到了,這樣就能使我在很短的時間內,通過控制LED燈的亮、滅熟悉了51單片機的內部的各種資源,這時對51單片機也就沒有感到陌生了。所以,個人覺得,學習單片機,要從實驗入手,先熟悉單片機再說,開發語言開始使用的是C語言。
第二步(進階的過程):有了第一步的基礎之後,接下來的便是進階的過程,當時,我看的是郭天祥十天學會單片機的視頻教程,因為這個教程從基礎到復雜的編程慢慢深入,講的比較的全面,而且也生動,所以那一階段,也是我學習單片機進步最快的階段,每次聽課的時候,按照上面的實驗,以及課堂上面調試程序時出現的一些問題,自己認真的在電腦上進行調試,並分析產生故障的原因,讓我有了一定的開發基礎。在看完了視頻教程之後,後面又對基礎的知識進行了下補習,主要是看單片機原理性的教材,因為有些細節性的東西還是要從教材上面獲得。
H. 單片機控制紅外程序
給你一個PIC寫的接收紅外遙控器的程序。
//******************************************************
//mcu: PIC16F883
//author:
//data:
//ver: 1.0
//********************************************************
#include <pic.h>
#include <pic16f887.h>
#include "main.h"
// 函數聲明部份
void interrupt IRQ_TEST(void);
void fun_intset(void);
void set_port(void);
void fun_timerset(void);
void delay_10us(void);
void delay_130us(void);
void test_remote(void);
// 主函數
void main()
{
set_port();
fun_timerset();
fun_intset();
delay_10ms();
ram_ini();
GIE=1;
while(1)
{
asm("clrwd");
test_remote();
}
}
//埠I/O定義子程序
void set_port()
{
ANSEL =0X00; //porta io port
ANSELH=0X00; //portb io port
//TRISX BIT=1, PORTX AS INPUT
TRISA = 0x0F; //RA0-RA3 INPUT ,RA4-RA5 OUTPUT
TRISB = 0x07; //RB0 PASS0, RB1-RB2 INPUT ,RB3-RB6 OUTPUT
TRISC = 0x0F;
// TRISC = 0x03; //RC0-RC1 INPUT,RC5-RC6 OUTPUT , RC3 RC4 EEPROM SCL SDA
PORTC=0;
PORTA=0XFF;
// WPUB=0XFF;
PORTB=0X07;
}
//中斷子程序
void interrupt IRQ_TEST(void)
{
if(T0IF) //Timer0中斷服務子程序
{
TMR0=0xce;
T0IF=0;
timer_100us++; //100us
}
if(INTF==1)
{
INTF=0;
timer_rec=timer_100us;
timer_100us=0;
flag_rec_remote=1;
}
}
//定時器0初始化設置子程序
void fun_timerset()
{
//Timer0初始化設置
PSA=0;//Timer0 使用預分頻器
//Timer0選擇分頻率為1:2
PS0=0;PS1=0;PS2=0;
//內部時鍾定時方式,定時時間:200uS,誤差:0uS
T0CS=0;
// TMR0=0x9b;
TMR0=0xce; //100us
}
/*
//定時器2初始化設置子程序
void fun_timer2set()
{
//Timer2初始化設置
//timer2使用預分頻率1:1
T2CKPS0=0;T2CKPS1=0;
//timer2使用後分頻率1:1
TOUTPS0=0;
TOUTPS1=0;
TOUTPS2=0;
TOUTPS3=0;
//定時器2定時時間為:200uS,誤差:0uS
TMR2=0x38;
TMR2ON=1;
}
*/
//中斷允許設置子程序
void fun_intset()
{
T0IE=1;//Tiemr0中斷允許
INTEDG=0; //RB0 FALLAGE INTERRUPT
INTE=1;
INTF=0;
}
void ram_ini(void)
{
}
//------------------------------------------------------------
//*****************************************************************************
void delay_10us(void)
{
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
}
void delay_130us(void)
{
uchar i;
for(i=0;i<13;i++)
{
NOP;
NOP;
NOP;
}
}
void delay_10ms(void)
{
unsigned int i;
for(i=0;i<1000;i++)
{
NOP;
NOP;
NOP;
NOP;
NOP;
}
}
void test_remote(void)
{
uchar rec_ok,i;
if(flag_rec_remote==1)
{
flag_rec_remote=0;
// remote_buf[rec_byte]=timer_rec; //test use
// rec_byte++; //test use
// return; //test use
if(flag_rec_head==0)
{
if(timer_rec>=90&&timer_rec<=140) //135
{
flag_rec_head=1;
rec_byte=0;
rec_bit=0;
rec_buf=0;
return;
}
}
else
{
if(timer_rec>=8&&timer_rec<=12) //11.2
{
rec_buf=(rec_buf>>1);
rec_buf=rec_buf&0x7f;
}
else if(timer_rec>=18&&timer_rec<=22) //22
{
rec_buf=(rec_buf>>1);
rec_buf=rec_buf|0x80;
}
else if(timer_rec>=90&&timer_rec<=140)
{
flag_rec_head=1;
rec_byte=0;
rec_bit=0;
rec_buf=0;
return;
}
else
{
flag_rec_head=0;
rec_byte=0;
rec_bit=0;
rec_buf=0;
return;
}
}
if(flag_rec_head==1)
{
rec_bit++;
if(rec_bit==8)
{
remote_buf[rec_byte]=rec_buf;
rec_byte++;
rec_bit=0;
if(rec_byte==4)
{
NOP;
NOP;
NOP;
NOP;
rec_byte=0;
rec_bit=0;
rec_buf=0;
flag_rec_head=0;
}
}
}
}
}
I. PIC16F877A單片機,晶振是4M(內部的晶振),怎麼用C語言實現1us的延時
是ms吧,我用過的都是ms,基本上不用us
delay1ms(uchar T) //單位時間Tms延時,即T是多少,就延時多少ms
{
uchar time;
while(T--)
for(time=0;time<89;time++);
}
這個我用MPLAB的秒錶測過,是1ms,差一點點,T越大越准確,不過要注意變數類型
還有這個也行
delay1ms(uchar T) //單位時間Tms延時
{
uchar time;
while(T--)
for(time=0;time<89;time++);
}
J. keil中的16F887在哪
keil只支持編譯8051內核的單片機,16f887是pic單片機。
你要編譯pic16f887需要去microchip官網下載mplab編譯器。
如還有問題,歡迎追問