導航:首頁 > 編程語言 > pic在線編程

pic在線編程

發布時間:2022-08-29 14:31:56

『壹』 用C語言編程時,怎麼將PIC的I/O按位分配(求大神幫忙,在線等)

如果RS PORTAbits.RA01可用,直接用#define RS PORTAbits.RA01定義就可以了。

『貳』 PIC編程軟體

Microchip官網:http://www.microchip.com/
Microchip IDE下載頁面:http://www.microchip.com/pagehandler/en-us/family/mplabx/
在這個下載頁面根據你的操作系統選擇對應的IDE(開發環境),然後再下載對應的編譯器(compiler),比如你用的是8位的單片機就下載XC8,16位的就下載XC16,32位的就下載XC32。
先裝開發環境,三個編譯器可以全部都裝上,都支持C語言。

『叄』 pic C語言編程

配置寄存器,關掉IO不要用到復用功能!比如AD、比較器等等。

『肆』 PIC單片機引腳編程問題

其實這5根線的名字分別是--〉 vcc 供電; GND 地; ICSPCLK:在線編程下載時鍾信號口; ICSPDAT:在線編程下載數據口 ; /MCLR : 編程電壓。將編程器的對應口和單片機上這幾個口用導線連接起來就可以了。好用點的話,用2.54mm 的接插件,不嫌麻煩的話用電烙鐵直接焊接好了.

『伍』 PIC單片機編程軟體

KEIL沒辦法編譯PIC的任何單片機的程序
用PIC單片機生產商MICROCHIP公司自己推出的MPLAB ide軟體開發程序,免費的。
但這個軟體默認安裝的沒有C編譯器(默認的只能編譯匯編文件)。你還得去Microchip那裡下載PICC for PIC18(HI-TECH公司做的,這公司被MICROCHIP收購了),或者是Microchip公司自己開發MPLAB C18編譯器。這些編譯器安裝後自動嵌入到MPLAB內部。
反正這兩個都是收費的(最便宜的PICC買800rmb)。但網上有很多關於他們的破解版

『陸』 想學習PIC編程要先學習什麼

基礎--PLC指令,這兩者必須要學的

『柒』 在pic中如何用C語言編寫程序

//09/10/24
//lcd1602顯示時間 日期 星期 溫度
//通過按鍵校時:K10--小時,K11--分鍾,K12--秒(歸零),K13-星期,BR1--年,RB2--月,RB3--日。
//晶元要求:PIC16F877A

#include<pic.h> //包含單片機內部資源預定義
__CONFIG(0x1832);
//晶元配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振盪

#define i_o RB4 //定義DS1302的數據口
#define sclk RB0 //定義DS1302的時鍾口
#define rst RB5 //定義DS1302的復位口
#define rs RA1 //1602
#define rw RA2
#define e RA3
# define DQ RA0 //定義18B20數據埠

unsigned char TLV=0 ; //採集到的溫度高8位
unsigned char THV=0; //採集到的溫度低8位

unsigned char ;
unsigned char shi; //整數十位
unsigned char ge; //整數個位
unsigned char shifen; //十分位
float temp;

void display();

//定義讀取時間和日期存放表格
char table1[7];
//定義0-9的顯示代碼
const char table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char rx_data,read_data,count,sec,min,hour,day,mon,week,year,time;

//----------------------------------------------
//ds18b20部分
//------------------------------------------------
//延時函數
void delay1(unsigned int x)
{
unsigned int i;
for(i=x;i>0;i--);
}

//------------------------------------------------
//延時函數
void delay2(char x,char y)
{
char z;
do{
z=y;
do{;}while(--z);
}while(--x);
}
//其指令時間為:7+(3*(Y-1)+7)*(X-1)如果再加上函數調用的call 指令、頁面設定、傳遞參數花掉的7 個指令。
//則是:14+(3*(Y-1)+7)*(X-1)。

//***************************************
//初始化ds18b20
void ds18b20_init()
{
char presence=1;
while(presence)
{
TRISA0=0; //主機拉至低電平
DQ=0;
delay2(2,99); //延時503us
TRISA0=1; //釋放匯流排等電阻拉高匯流排,並保持15~60us
delay2(2,8); //延時70us
if(DQ==1) presence=1; //沒有接收到應答信號,繼續復位
else presence=0; //接收到應答信號
delay2(2,60); //延時430us
}
}

//*****************************************************
//寫ds18b20
void ds18b20_write_byte(unsigned char code)
{
unsigned char i,k;
for(i=8;i>0;i--)
{
k=code&0x01;
TRISA0=0;
DQ=0; //數據線拉低產生時間片
asm("nop");
asm("nop");
if(k) DQ=1; //寫1則拉高數據電平
delay1(3); //延時42us,ds18b20對數據線采樣
asm("nop");
TRISA0=1; //采樣結束,釋放匯流排,拉高電平
code=code>>1;
delay1(7); //延時82us
}
}

//****************************************************
//讀ds18b20
unsigned char ds18b20_read_byte()
{
unsigned char i,k;
for(i=8;i>0;i--)
{
k=k>>1;
TRISA0=0;
DQ=0; //數據線拉低再拉高產生讀時間片
asm("nop");
asm("nop");
TRISA0=1;
asm("nop");
asm("nop");
if(DQ) k=k|0x80; //15us內要完成讀位
delay1(6); //延時72us後釋放匯流排
}
return (k);
}

//********************************************
//啟動溫度轉換函數
void get_temp()
{
int i;
signed int t;
TRISA0=1;
ds18b20_init(); //復位等待從機應答
ds18b20_write_byte(0XCC); //忽略ROM匹配
ds18b20_write_byte(0X44); //發送溫度轉化命令
for(i=2;i>0;i--)
{

display(); //調用多次顯示函數,確保溫度轉換完成所需要的時間
}
ds18b20_init(); //再次復位,等待從機應答
ds18b20_write_byte(0XCC); //忽略ROM匹配
ds18b20_write_byte(0XBE); //發送讀溫度命令
TLV=ds18b20_read_byte(); //讀出溫度低8
THV=ds18b20_read_byte(); //讀出溫度高8位
TRISA0=1; //釋放匯流排

t=THV<<8;
t=t|TLV;
if(t<0) //負溫度
{
temp=(~t+1)*0.0625*10+0.5; //負溫度時,取反加1再乘以0.0625得實際溫度,乘10+0.5顯示小數點一位,且四捨五入
}
else
temp=t*0.0625*10+0.5; //正溫度
if(t<0)
='-'; //負溫度時百位顯示負號
else
=(const) temp/1000+0x30; //百位
shi=((const) temp%1000)/100; //十位
ge=((const) temp%1000)%100/10; //個位
shifen=((const) temp%1000)%100%10; //十分位
NOP();
}

//---------------------------------------------
//------------DS1303部分-----------------------
//---------------------------------------------
//延時程序
void delay() //延時程序
{
int i; //定義整形變數
for(i=0x64;i--;); //延時
}

//寫一個位元組數據函數
void write_byte(unsigned char data)
{
int j; //設置循環變數
for(j=0;j<8;j++) //連續寫8bit
{
i_o=0; //先設置數據為0
sclk=0; //時鍾信號拉低
if(data&0x01) //判斷待發送的數據位是0或1
{
i_o=1; //待發送數據位是1
}
data=data>>1; //待發送的數據右移1位
sclk=1; //拉高時鍾信號
}
sclk=0; //寫完一個位元組,拉低時鍾信號
}

//---------------------------------------------
//讀一個位元組函數
unsigned char read_byte()
{
int j; //設置循環變數
TRISB4=1; //設置數據口方向為輸入
for(j=8;j--;) //連續讀取8bit
{
sclk=0; //拉低時鍾信號
rx_data=rx_data>>1; //接收寄存器右移1位
if(i_o==1) rx_data=rx_data|0x80;
sclk=1; //拉高時鍾信號
}
TRISB4=0; //恢復數據口方向為輸出
sclk=0; //拉低時鍾信號
return(rx_data); //返回讀取到的數據
}

//----------------------------------------------
//寫DS1302
void write_ds1302(unsigned char addr,unsigned char code)
{
rst=0;
sclk=0;
rst=1;
write_byte(addr);
write_byte(code);
sclk=0;
rst=1;
}

//-------------------------------------------
//讀DS1302
void read_ds1302(unsigned char addr)
{
rst=0;
sclk=0;
rst=1;
write_byte(addr);
read_data=read_byte();
//return read_data;
}

//---------------------------------------------
//讀取時間函數
void get_time()
{

int i; //設置循環變數
rst=1; //使能DS1302
write_byte(0xbf); //發送多位元組讀取命令
for(i=0;i<7;i++) //連續讀取7個位元組數據
{
table1[i]=read_byte(); //調用讀取1個位元組數據的函數
}
rst=0; //復位DS1302
}

//DS1302初始化函數
void ds1302_init()
{
sclk=0; //拉低時鍾信號
rst =0; //復位DS1302
rst=1; //使能DS1302
write_ds1302(0x8e,0); //發控制命令
rst=0; //復位
}

//---------------------------------------------
//設置時間函數
void set_time()
{
//定義待設置的時間: 秒、 分、 時、 日、月、星期、年、控制字
const char table[]={0x00,0x00,0x12,0x23,0x10,0x05,0x09,0x00};
int i; //定義循環變數
rst=1; //使能DS1302
write_byte(0xbe); //時鍾多位元組寫命令
for(i=0;i<8;i++) //連續寫8個位元組數據
{
write_byte(table[i]); //調用寫一個位元組函數
}
rst=0; //復位
}

//-------------------------------------------
//8位二進制數轉換為十進制數
void two_to_ten(unsigned char i)
{
time=(table1[i]&0x0f)+(table1[i]>>4)*0x0a;
}

//-------------------------------------------
//十進制數轉換為BCD碼
void ten_to_bcd(unsigned char i)
{
time=((i/0x0a)<<4)|(i%0x0a);
}

//------------------------------------------
//校時程序
void change_time()
{
if(RC0==0) //改變星期---k13
{
delay();
if(RC0==0)
{
if(count==0)
{
count=1;
two_to_ten(5);
week=time;
week++;
if(week>=8)
{
week==1;
write_ds1302(0x8A,1);
}
else
write_ds1302(0x8A,week);
}
}
}
else if(RC1==0) //秒歸零--k12
{
delay();
if(RC1==0)
{
if(count==0)
{
count=1;
write_ds1302(0x80,0);
}
}
}
else if(RC2==0) //改變分位--k11
{
delay();
if(RC2==0)
{
if(count==0)
{
count=1;
two_to_ten(1);//BCD碼轉換成十進制數
min=time;
min++;
if(min>=60)
{
min=0;
write_ds1302(0x82,min);
}
else
{
ten_to_bcd(min);//十進制數轉換為BCD碼存進DS1302
write_ds1302(0x82,time);
}
}
}
}

else if(RC3==0) //改變小時位--k10
{
delay();
if(RC3==0)
{
if(count==0)
{
count=1;
two_to_ten(2);//BCD碼轉換成十進制數
hour=time;
hour++;
if(hour>=24)
{
hour=0;
write_ds1302(0x84,hour);
}
else
{
ten_to_bcd(hour);
write_ds1302(0x84,time);
}
}
}
}

else if(RB2==0)
{
delay();
if(RB2==0)
{
if(count==0)
{
count=1;
two_to_ten(4);//BCD碼轉換成十進制數
mon=time;
mon++;
if(mon>=13)
{
mon=1;
write_ds1302(0x88,mon);
}
else
{
ten_to_bcd(mon);
write_ds1302(0x88,time);
}
}
}
}

else if(RB3==0)
{
delay();
if(RB3==0)
{
if(count==0)
{
count=1;
two_to_ten(3);//BCD碼轉換成十進制數
day=time;
day++;
if((table1[6]%4==0)&&(table1[4]==2)&&(day>=30)) //潤年2月
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1[6]%4)!=0)&&(table1[4]==2)&&(day>=29))//非潤年的2月
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1[4]==1)||(table1[4]==3)||(table1[4]==5)||(table1[4]==7)||(table1[4]==8)||(table1[4]==0x10)||(table1[4]==0x12))&&(day>=32))
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1[4]==4)||(table1[4]==6)||(table1[4]==9)||(table1[4]==0x11))&&(day>=31))
{
day=1;
write_ds1302(0x86,day);
}
else
{
ten_to_bcd(day);
write_ds1302(0x86,time);
}
}
}
}

else if(RB1==0)
{
delay();
if(RB1==0)
{
if(count==0)
{
count=1;
two_to_ten(6);//BCD碼轉換成十進制數
year=time;
year++;
if(year>=16)
{
year=0x00;
write_ds1302(0x8c,0);
}
else
{
ten_to_bcd(year);
write_ds1302(0x8c,time);
}
}
}
}
else
count=0;

}

//****************************************
//**************lcd1602*******************
//****************************************
//延時程序
//void delay()
// {
// unsigned char i;
// for(i=100;i>0;i--);
// }

//****************************************
//LCD寫一個位元組數據
void write_lcd(unsigned char code)
{
PORTD=code;
rs=1;
rw=0;
e=0;
delay();
e=1;
}

//****************************************
//lcd寫命令函數
void lcd_enable(unsigned char code)
{
PORTD=code;
rs=0;
rw=0;
e=0;
delay();
e=1;
}
//*****************************************
//lcd顯示設置
void lcd_init()
{
lcd_enable(0x01); //清除顯示
lcd_enable(0x38); //設置16X2顯示,5X7點陣
lcd_enable(0x0c); //開顯示,不顯示游標
lcd_enable(0x06); //游標左移
}

//-------------------------------------------
//顯示函數
void display()
{
// PORTD=0X80; //小時
lcd_enable(0X80);
write_lcd((table1[2]>>4)+0x30);

// PORTD=0x81;
lcd_enable(0x81);
write_lcd((table1[2]&0x0f)+0x30);

// PORTD=0X82;
lcd_enable(0X82);
write_lcd(':');

// PORTD=0X83; //分
lcd_enable(0X83);
write_lcd((table1[1]>>4)+0x30);

// PORTD=0x84;
lcd_enable(0x84);
write_lcd((table1[1]&0x0f)+0x30);

// PORTD=0X85;
lcd_enable(0X85);
write_lcd(':');

// PORTD=0X86; //秒
lcd_enable(0X86);
write_lcd((table1[0]>>4)+0x30);

// PORTD=0x87;
lcd_enable(0x87);
write_lcd((table1[0]&0x0f)+0x30);

// PORTD=0X89; //溫度的百位
lcd_enable(0X89);
write_lcd();

// PORTD=0X8a; //溫度的十位
lcd_enable(0X8a);
write_lcd(shi+0x30);

// PORTD=0X8b; //溫度的個位
lcd_enable(0X8b);
write_lcd(ge+0x30);

// PORTD=0X8c;
lcd_enable(0X8c);
write_lcd('.');

// PORTD=0X8d; //溫度的十分位
lcd_enable(0X8d);
write_lcd(shifen+0x30);

// PORTD=0X8e; //顯示'C'
lcd_enable(0X8e);
write_lcd('C');
//
// PORTD=0XC0; //年
lcd_enable(0XC0);
write_lcd((table1[6]>>4)+0x30);

//PORTD=0XC1;
lcd_enable(0XC1);
write_lcd((table1[6]&0x0f)+0x30);

// PORTD=0XC2;
lcd_enable(0XC2);
write_lcd('-');

// PORTD=0XC3; //月
lcd_enable(0XC3);
write_lcd((table1[4]>>4)+0x30);

// PORTD=0xC4;
lcd_enable(0xC4);
write_lcd((table1[4]&0x0f)+0x30);

// PORTD=0XC5;
lcd_enable(0XC5);
write_lcd('-');

// PORTD=0XC6; //日
lcd_enable(0XC6);
write_lcd((table1[3]>>4)+0x30);

// PORTD=0xC7;
lcd_enable(0xC7);
write_lcd((table1[3]&0x0f)+0x30);

// PORTD=0XCD; //星期
lcd_enable(0XCD);
write_lcd((table1[5]&0x0f)+0x30);

}

//--------------------------------------------
//引腳定義函數
void port_init()
{
TRISA=0x00; //設置A口全輸出
TRISD=0X00; //設置D口全輸出
ADCON1=0X06; //設置A口為普通I/O口
TRISB=0X0E; //
OPTION=0X00; //開啟B口弱上拉
PORTA=0XFF;
PORTD=0XFF; //先熄滅所有顯示
lcd_init();
TRISC=0XEF; //RC3輸出,其他為輸入
PORTC=0XEF;
count=0;
}

//----------------------------------------------
//主函數
void main()
{
port_init(); //調用引腳初始化函數
read_ds1302(0x81); //查看DS1302是否起振
if(read_data&0x80) //否,則初始化DS1302
{
ds1302_init(); //調用DS1302初始化函數
set_time(); //調用設置時間函數
}
while(1)
{
get_time(); //調用取時間函數
change_time();
get_temp(); //調用溫度轉換函數
display(); //調用顯示函數
}
}

『捌』 PIC單片機C語言編程的高手來幫幫忙啊!

你好,對於你這個問題其實也不是太難,不要在乎片子有多復雜,也不要在乎問題有多難,關鍵是勇於挑戰他,你弄永遠不行,程序是調試出來的,別人給你寫的你不一定可以用得上。AD985X系列的DDS晶元大同小異,基本也就是協議問題。仔細看一下,手冊上的介紹對你很有幫助,還有就是關於你選擇的PIC的那款片子,也很簡單,給你一個相關的程序參考一下,真的是大同小異無非是細節問題。這個沒有人能幫到你,靠自己是最好的也可以學習很多東西。還是那句話程序師調試出來的

如果在調試過程中有什麼問題請Hi我,常在線

AD9851的驅動程序

//頭文件
#include "SPCE061A.h"
//變數說明
unsigned long int Freq_Ctrl_Word = 0x051eb851; //頻率控制字 先傳低位再傳高位
unsigned int Phase_Ctrl_Word = 0x0000; //相位控制字 先傳低位再傳高位
unsigned int Order_Ctrl_Word = 0x0000;//b32:0 6倍頻關閉 b33b34:00 電源工作模式
//定義AD9851與SPCE061A的介面
#define M_DATA 0x0001
#define M_UD 0x0002
#define M_CLK 0x0004
#define Set_IOA_Bit(x) (*P_IOA_Data = *P_IOA_Buffer | x) //置高
#define Clear_IOA_Bit(x) (*P_IOA_Data = *P_IOA_Buffer & ~x) //置低
//====================================================================
// ----Function: void Init_AD9851(void)
// -Description: 初始化與AD9851連接的IO口
// --Parameters: 無
// ------Return: 無
// -------Notes: 不影響其他IO口
//====================================================================
void Init_AD9851(void)
{
*P_IOA_Dir |= (M_DATA + M_UD + M_CLK);
*P_IOA_Attrib |= (M_DATA + M_UD + M_CLK);
*P_IOA_Data &= ~(M_DATA + M_UD + M_CLK);
}
//====================================================================
// ----Function: void Write_AD9851(void)
// -Description: 向AD9851寫入頻率控制字,命令控制字和相位控制字
// --Parameters: 無
// ------Return: 無
// -------Notes: 無
//====================================================================
void Write_AD9851(void)
{
unsigned long int mask = 0x0001;
unsigned int i;
Clear_IOA_Bit(M_UD); //M_UD置低
//送32位頻率控制字
for(i = 0;i < 32;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Freq_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask << 1;
}
//送3位的命令控制字
mask = 0x0001;
for(i = 0;i < 3;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Order_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask << 1;
}
//送5位相位控制字
mask = 0x0001;
for(i = 0;i < 5;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Phase_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask << 1;
}
Set_IOA_Bit(M_UD); //M_UD置高 ,產生上升沿 ,頻率更新使能,輸出有效
}

最後在說一下個人的理解,也就是DDS與MCU之間的介面問題,個人認為有點像SPI,只不過SPI的數據口是串列的,而在這這里是分時並行。主要問題就是協議,唯一的辦法就是求助於數據手冊,我剛出去查了一下,好像全是E文的,建議前期工作就是對照Google翻譯這個數據手冊,很有必要。

學習和創作的過程也很有趣,雖然很艱辛

『玖』 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在線編程相關的資料

熱點內容
卸載聯想app哪個好 瀏覽:719
php文字轉圖片 瀏覽:328
豆客後台怎麼加密碼 瀏覽:574
jpg轉換pdf破解版 瀏覽:978
php基礎書籍推薦 瀏覽:775
伺服器與外網不通如何驗證 瀏覽:351
電子版是不是就是文件夾 瀏覽:50
游戲屬性文件加密 瀏覽:462
如何讓安卓手機桌面圖標下移 瀏覽:528
ubuntuphp5環境搭建 瀏覽:99
賭癮解壓視頻 瀏覽:917
晉城移動dns伺服器地址 瀏覽:294
php開源文庫系統 瀏覽:134
android記事本源碼 瀏覽:407
安卓11小游戲怎麼玩法 瀏覽:190
gif有損壓縮 瀏覽:937
windows下安裝linux命令操作 瀏覽:844
米家app怎麼設置進門亮燈 瀏覽:652
任我行伺服器為什麼會影響截圖 瀏覽:296
安卓留言板怎麼刪除 瀏覽:18