當前位置:首頁 » 編程語言 » pic單片機c語言開發入門
擴展閱讀
idm怎麼配置進去光碟機 2022-09-25 12:39:12
硬體虛擬工具密碼是多少 2022-09-25 12:33:57

pic單片機c語言開發入門

發布時間: 2022-08-11 10:22:48

1. 誰有PIC單片機c語言開發入門的PDF給小弟發個,想學習下,希望一起交流下,我的郵箱:[email protected]

我也在找PIC單片機C語言開發入門的pdf,誰有的話也給我發一份 [email protected]

2. 學習PIC單片機C語言編程,想買本書 ,基本上是零基礎,最好是實例多點,注釋完整容易看懂的~大家給推薦下~

是這樣的 學習單片機前 的確是要先打點基礎 不然聽起來莫名其妙 到最後越來越吃力!首先會C語言 要學得比較好!然後再學 《微機原理》這門課 這門課很重要 雖然學得時8088晶元 很過時 但是你要是學懂了 那麼單片機以及往後的神馬都是相通的! 而且微機原理中學得是匯編語言 這種語言好處就是 學懂匯編就能知道微機中 包括單片機中是如何運行的!電工電子是一門課 重要的是電子這門課 也就是常說的模電和數電!這門課也很重要 在以後進行單片機二次開發時候能起來很大作用!打基礎就先這么多了 學完以上的就可以正式開始學習單片機 不會有難度了 但是想成為真正的電子工程師 還要學一些課程 比方說高頻電子電路 很重要!至於說學習的目的 在等你學完單片機 自己體會我覺得更好!回答完畢 希望滿意!

3. 請幫我介紹幾本用C語言開發單片機的入門書,謝謝了

------------------------------------
AVR單片機C語言開發入門指導
出版社: 清華大學出版社
作者 : 沈文 Eagle lee 詹衛前
------------------------------------
PIC單片機C語言開發入門
出版社: 北京航空航天大學出版社
作者 : 武鋒 等
------------------------------------
MSP430系列單片機C語言程序設計與開發
出版社: 北京航空航天大學出版社
作者: 胡大可
------------------------------------
8051單片機C語言開發環境實務與設計
出版社:科學出版社
作者: 賴麟文
------------------------------------
C51單片機高效入門
出版社: 機械工業
作者 : 徐瑋
------------------------------------

問題補充:

如果是學習Atmel的AVR的話,選擇下面這本書是你不二的選擇,寫得非常經典。

AVR單片機C語言開發入門指導
出版社: 清華大學出版社
作者 : 沈文 Eagle lee 詹衛前

4. 求學習pic單片機c語言入門的書(電子版),我的郵箱是[email protected] 急急急!!!!

用 C 語言來開發單片機系統軟體最大的好處是編寫代碼效率高、軟體調試直觀、維護
升級方便、代碼的重復利用率高、便於跨平台的代碼移植等等,因此C 語言編程在單片機
系統設計中已得到越來越廣泛的運用。針對PIC 單片機的軟體開發,同樣可以用C 語言實
現。
但在單片機上用 C 語言寫程序和在PC 機上寫程序絕對不能簡單等同。現在的PC 機資
源十分豐富,運算能力強大,因此程序員在寫PC 機的應用程序時幾乎不用關心編譯後的可
執行代碼在運行過程中需要佔用多少系統資源,也基本不用擔心運行效率有多高。寫單片機
的C 程序最關鍵的一點是單片機內的資源非常有限,控制的實時性要求又很高,因此,如
果沒有對單片機體系結構和硬體資源作詳盡的了解,以筆者的愚見認為是無法寫出高質量實
用的C 語言程序。這就是為什麼前面所有章節中的的示範代碼全部用基礎的匯編指令實現
的原因,希望籍此能使讀者對PIC 單片機的指令體系和硬體資源有深入了解,在這基礎之
上再來討論C 語言編程,就有水到渠成的感覺。
本書圍繞中檔系列 PIC 單片機來展開討論,Microchip 公司自己沒有針對中低檔系列PIC
單片機的C 語言編譯器,但很多專業的第三方公司有眾多支持PIC 單片機的C 語言編譯器
提供,常見的有Hitech、CCS、IAR、Bytecraft 等公司。其中筆者最常用的是Hitech 公司的
PICC 編譯器,它穩定可靠,編譯生成的代碼效率高,在用PIC 單片機進行系統設計和開發
的工程師群體中得到廣泛認可。其正式完全版軟體需要購置,但在其網站上有限時的試用版
供用戶評估。另外,Hitech 公司針對廣大PIC 的業余愛好者和初學者還提供了完全免費的學
習版PICC-Lite 編譯器套件,它的使用方式和完全版相同,只是支持的PIC 單片機型號限制
在PIC16F84、PIC16F877 和PIC16F628 等幾款。這幾款Flash 型的單片機因其所具備的豐富
的片上資源而最適用於單片機學習入門,因此筆者建議感興趣的讀者可從PICC-Lite 入手掌
握PIC 單片機的C 語言編程。
在此列出幾個主要的針對 PIC 單片機的C 編譯器相關連接網址,供讀者參考:
Hitech-PICC: www.htsoft.com
IAR: www.iar.com
CCS: www.ccsinfo.com/picc.shtml
ByteCraft: www.bytecraft.com/mpccaps.html
本章將介紹 Hitech-PICC 編譯器的一些基本概念,由於篇幅所限將不涉及C 語言的標准
語法和基礎知識介紹,因為在這些方面都有大量的書籍可以參考。重點突出針對PIC 單片
機的特點而所需要特別注意的地方

相關電子書已發送!

5. 初學者請問PIC單片機用MPLAB軟體進行C語言編程,看什麼書比較合適

《PIC16F87X單片機實用軟體與介面技術-C語言及其應用》(劉和平編著)

6. 想學習PIC編程要先學習什麼

PIC=peripheral interface control
pic集成了很多外圍器件,例如CCP模塊,通訊模塊等
PIC 單片機是一個小的計算機,PIC單片機有計算功能和記憶內存像CPU並由軟體控制允行。最好是有本教程然後自己就可以直接買件輸入程序練習了。建議你先看看微機原理作為鋪墊,C語言是必要的,另外學學匯編語言也是很有用的。
C語言在前期,就是你的匯編可以的情況下沒有 太大的用,但是學到後面的話你就會發現會匯編很復雜,而C就會比較簡單容易了

7. PIC單片機 c語言編程

以DIP-40的PIC16F877A來舉例 燈閃動頻率為1秒
void Delay_Ms(unsigned char n);
void main(void)
{
while(1)
{
RA0 = 1;//2腳輸出
//11腳是供電
RD2 = 1;//21腳輸出
trisA = 0x04; //4腳RA2作為輸入
if(RA2 == 0) //如果4腳為低電平
{
//執行代碼
}
else //如果4腳為高電平
{
//執行代碼
}
Delay_Ms(1000); //延時1秒
RA0 = 0;//2腳輸出
//11腳是供電
RD2 = 0;//21腳輸出
Delay_Ms(1000); //延時1秒
}
}
void Delay_Ms(unsigned char n) //延時程序
{
unsigned int i;
unsigned char j;
for(j=0;j<n;j++)
{
for(i=0;i<Fosc/44000;i++)
{
}
}
}

8. 在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(); //調用顯示函數
}
}