pic單片機c語言程序
1. 單片機c語言程序設計實訓100例:基於PIC+Proteus模擬的目錄
第1章PIC單片機C語言程序設計概述
1.1 PIC單片機簡介
1.2 MPLAB+C語言程序開發環境安裝及應用
1.3 PICC/PICC18/MCC18程序設計基礎
1.4 PIC單片機內存結構
1.5 PIC單片機配置位
1.6 基本的I/O埠編程
1.7 中斷服務程序設計
1.8 PIC單片機外設相關寄存器
1.9 C語言程序設計在PIC單片機應用系統開發中的優勢
第2章PROTEUS操作基礎
2.1 PROTEUS操作界面簡介
2.2 模擬電路原理圖設計
2.3 元件選擇
2.4 模擬運行
2.5 MPLAB IDE與PROTEUS的聯合調試
2.6 PROTEUS在PIC單片機應用系統開發中的優勢
第3章 基礎程序設計
3.1 閃爍的LED
3.2 用雙重循環控制LED左右來回滾動顯示
3.3 多花樣流水燈
3.4 LED模擬交通燈
3.5 單只數碼管循環顯示0~9
3.6 4隻數碼管滾動顯示單個數字
3.7 8隻數碼管掃描顯示多個不同字元
3.8 K1~K5控制兩位數碼管的開關、加減與清零操作
3.9 數碼管顯示4×4鍵盤矩陣按鍵
3.10 數碼管顯示撥碼開關編碼
3.11 繼電器及雙向可控硅控制照明設備
3.12 INT中斷計數
3.13 RB埠電平變化中斷控制兩位數碼管開關與加減顯示
3.14 TIMER0控制單只LED閃爍
3.15 TIMER0控制流水燈
3.16 TIMER0控制數碼管掃描顯示
3.17 TIMER1控制交通指示燈
3.18 TIMER1與TIMER2控制十字路口秒計時顯示屏
3.19 用工作於同步計數方式的TMR1實現按鍵或脈沖計數
3.20 用定時器設計的門鈴
3.21 報警器與旋轉燈
3.22 用工作於捕獲方式的CCP1設計的頻率計
3.23 用工作於比較模式的CCP1控制音階播放
3.24 CCP1 PWM模式應用
3.25 模擬比較器測試
3.26 數碼管顯示兩路A/D轉換結果
3.27 EEPROM讀寫與數碼管顯示
3.28 睡眠模式及看門狗應用測試
3.29 單片機與PC雙向串口通信模擬
3.30 PIC單片機並行從動埠PSP讀寫測試
第4章 硬體應用
4.1 74HC138與74HC154解碼器應用
4.2 74HC595串入並出晶元應用
4.3 用74HC164驅動多隻數碼管顯示
4.4 數碼管BCD解碼驅動器7447與4511應用
4.5 8×8LED點陣屏顯示數字
4.6 8位數碼管段位復用串列驅動晶元MAX6951應用
4.7 串列共陰顯示驅動器MAX7219與7221應用
4.8 14段與16段數碼管串列驅動顯示
4.9 16鍵解碼晶元74C922應用
4.10 1602LCD字元液晶測試程序
4.11 1602液晶顯示DS1302實時時鍾
4.12 1602液晶工作於4位模式實時顯示當前時間
4.13 帶RAM內存的實時時鍾與日歷晶元PCF8583應用
4.14 2×20串列字元液晶演示
4.15 LGM12864液晶顯示程序
4.16 PG160128A液晶圖文演示
4.17 TG126410液晶串列模式顯示
4.18 HDG12864系列液晶演示
4.19 Nokia7110液晶菜單控製程序
4.20 8通道模擬開關74HC4051應用測試
4.21 用帶I2C介面的MCP23016擴展16位通用I/O埠
4.22 用帶SPI介面的MCP23S17擴展16位通用I/O埠
4.23 用I2C介面控制MAX6953驅動4片5×7點陣顯示器
4.24 用I2C介面控制MAX6955驅動16段數碼管顯示
4.25 用帶SPI介面的數/模轉換器MCP4921生成正弦波形
4.26 用帶SPI介面的數/模轉換器MAX515控制LED亮度循環變化
4.27 正反轉可控的直流電機
4.28 PWM控制MOSFET搭建的H橋電路驅動直流電機運行
4.29 正反轉可控的步進電機
4.30 用L297+L298控制與驅動步進電機
4.31 PC通過RS-485器件MAX487遠程式控制制單片機
4.32 I2C介面DS1621溫度感測器測試
4.33 SPI介面溫度感測器TC72應用測試
4.34 溫度感測器LM35全量程應用測試
4.35 K型熱電偶溫度計
4.36 用鉑電阻溫度感測器PT100設計的測溫系統
4.37 DS18B20溫度感測器測試
4.38 SHT75溫濕度感測器測試
4.39 1-Wire式可定址開關DS2405應用測試
4.40 光敏電阻應用測試
4.41 MPX4250壓力感測器測試
4.42 用I2C介面讀寫存儲器AT24C04
4.43 用SPI介面讀寫AT25F1024
4.44 PIC18 I2C介面存儲器及USART介面測試程序
4.45 PIC18 SPI介面存儲器測試程序
4.46 PIC18定時器及A/D轉換測試
4.47 用PIC18控制Microwire介面繼電器驅動器MAX4820
4.48 MMC存儲卡測試
4.49 ATA硬碟數據訪問
4.50 微芯VLS5573液晶顯示屏驅動器演示
第5章 綜合設計
5.1 用DS1302/DS18B20+MAX6951設計的多功能電子日歷牌
5.2 用PCF8583設計高模擬數碼管電子鍾
5.3 用4×20LCD與DS18B20設計的單匯流排多點溫度監測系統
5.4 用內置EEPROM與1602液晶設計的加密電子密碼鎖
5.5 用PIC單片機與1601LCD設計的計算器
5.6 電子秤模擬設計
5.7 數碼管顯示的GP2D12模擬測距警報器
5.8 GPS全球定位系統模擬
5.9 能接收串口信息的帶中英文硬字型檔的80×16點陣顯示屏
5.10 用M145026與M145027設計的無線收發系統
5.11 紅外遙控收發模擬
5.12 交流電壓檢測與數字顯示模擬
5.13 帶位置感應器的直流無刷電機PMW控制模擬
5.14 3端可調正穩壓器LM317應用測試
5.15 模擬射擊訓練游戲
5.16 帶觸摸屏的國際象棋游戲模擬
5.17 溫室監控系統模擬
5.18 PIC單片機MODBUS匯流排通信模擬
5.19 PIC單片機內置CAN匯流排通信模擬
5.20 基於PIC18+Microchip TCP/IP協議棧的HTTP伺服器應用
參考文獻
2. PIC單片機輸出PWM波的C語言源程序
#ifndef __PWM__H__
#define __PWM__H__
void pwm_ccp1(unsigned char a,unsigned char b);
void pwm_ccp2(unsigned char a,unsigned char b);
#endif
void pwm_ccp1(unsigned char a,unsigned char b) //左邊PWM
//CCP1 模塊的 PWM 工作方式,周期為(b+1)*4*Tosc*(TMR2前分頻值)=b+1 us //pwm高電平=a:CCP1CON(第四五位)Tosc*(TMR2前分頻值)
//pwm高電平=a:CCP1CON(第四五位)Tosc*(TMR2前分頻值)
{ //a>b時有最高轉速
CCPR1L=a; //* 設置工作循環的高 8bit 為 a
CCP1CON=0X0C; //0000 1100 設置 CCP1 為 PWM 工作方式,且工作循環的低 bit2 為 11*/
CCP1IE=0;; //* 禁止總中斷和外圍中斷 */
PR2=b; //* 設置 PWM 周期 */
TRISC2=0; //* 設置 RC2/CCP1 為輸出 */
T2CON=0X04; //* 0000 1000前分頻比為 1:1 ,後分頻器1:2,打開 TMR2 ,同時輸出 PWM 信號 */
}
void pwm_ccp2(unsigned char a,unsigned char b) //右邊PWM
//CCP2 模塊的 PWM 工作方式,周期為(b+1)*4*Tosc*(TMR2前分頻值),
//pwm高電平=a:CCP2CON(第四五位)Tosc*(TMR2前分頻值)
{
CCPR2L=a; //* 設置工作循環的高 8bit 為 a
CCP2CON=0X0C; //* 設置 CCP2 為 PWM 工作方式,且工作循環的低 bit2 為 11*/
CCP2IE=0; //* 中斷屏蔽
PR2=b; //* 設置 PWM 周期 */
TRISC1=0; //* 設置 RC1/CCP2 為輸出 */
T2CON=0X04; //* 前分頻比為 1 ,打開 TMR2 ,同時輸出 PWM 信號 */
}
3. PIC單片機C語言編程,埠設置問題,if語句條件設置問題,AD轉換問題。
肯定是設置trisC,況且你trisa和b都好使,c就不好使了這也太奇怪了吧。它說不識別,那就是你頭文件定義錯了。請檢查頭文件是否和晶元型號匹配。有可能頭文件里沒有#define trisc吧。
bittest應該是一個函數,不是一個宏。不要用define來定義。要用函數的方法來定義。你這個算是編程的基礎錯誤吧。
首先,你porta的0~3已經設置為analog了(在cmcon里)。設置成analog的話是沒法讀取digital信號的。這4個口永遠都是讀0的。所以你編的肯定不能用。
需要設置ADC。一般用默認設置就好了,額外的配置就是porta的那些埠需要對應到ADC上。然後配置ADC的開始方式。定義好之後,在程序里只要ADC_GO(不知道你那裡是什麼命令)就可以了。然後讀取的數值自動存儲到ADC的一個寄存器里。
具體的你要看對應晶元的datasheet了,每款晶元的adc都不一樣。不過相差不多。
4. 在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(); //調用顯示函數
}
}
5. 關於PIC單片機C語言編程
1:第一個問號:是; 第二個問號:不一定;
2:一些C30有多種類型版本,你說的30C和36可能不是指同一種類型。
3:沒破解的編譯器過期就不能編譯程序了。想用就需要重裝(貌似它會在系統內記錄的,所以應該是重裝操作系統才行)。
4:肯定不可靠。我有過編譯經歷,破解的編譯出來的在邏輯上就會有問題。但這不影響普通學生入門者做設計。如果你是做工業、航天領域設計的,你的領導也不會讓你用破解版或者未注冊版。所以現在很多單位寧願用匯編來編譯程序。
PICC有支持 PIC10/12/16/18/24/32系列單片機 的C編譯器。同時也支持dsPIC30/33 系列DSC晶元的C編譯器
6. pic系列單片機用c語言編程時,讓他執行A/D轉換的指令是什麼
在C語言里沒有指令,只有語句,用C語言執行A/D轉換如下:
//A/D轉換初始化子程序
void
adinitial()
{
ADCON0=0x41;
//選擇A/D通道為RA0,且打開A/D轉換器
//在工作狀態,使A/D轉換時鍾為8Tosc
ADCON1=0X8E;
//轉換結果右移,及ADRESH寄存器的高6位為"0"
//把RA0口設置為模擬量輸入方式
ADIE=1;
//A/D轉換中斷允許
PEIE=1;
//外圍中斷允許
TRISA0=1;
//設置RA0為輸入方式
}
//讀ADRESH寄存器就能得到AD轉換值了,
匯編的如下:
ADINT
MOVLW
0X51
MOVWF
ADCON0
;選擇A/D轉換通道為RA2,且打開A/D在工
;作狀態,並使A/D轉換時鍾為8tosc
BANKSEL
ADCON1
;選BANK1體
MOVLW
0X80
MOVWF
ADCON1
;轉換結果右移,即ADRESH寄存器的高6位;為「0」,且把RA2口設置成模擬量輸入口
CLRF
PIE1
;禁止其它中斷
BSF
PIE1,ADIE
;A/D轉化中斷允許
BSF
TRISA,2
;設置RA2口為輸入方式
BSF
INTCON,PEIE
;外圍中斷允許
BSF
INTCON,GIE
;總中斷允許
BCF
STATUS,RP0
;返回BANK0
RETURN