導航:首頁 > 編程語言 > pic單片機c語言編程實例

pic單片機c語言編程實例

發布時間:2024-10-15 21:44:22

『壹』 在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語言中如何喂狗

首先你要說明你用的是哪款PIC的單片機和用哪個C編譯器。
PIC有中低端的八位單片機PIC10/12/16的,高端的八位單片機PIC18系列,1十六位單片機PIC24和dsPIC,還有一個PIC32是三十二位的。上述的都可以通過調用宏指令CLRWDT();來實現喂狗。
但他們的宏指令的聲明一般都是在各自的頭文件中,比如根據他們的數據手冊PIC10/12/16系列的宏指令聲明都在htc.h文件中,pic.h里我還沒試過。
而PIC18我用過的是MPLAB C18編譯器,其聲明宏指令的頭文件是這個晶元的名稱,如PIC18F4680.h。
而PIC24我用的是MPLAB C30編譯器我是直接根據數據手冊的要求在C文件里定義宏的:
#define ClrWdt() {__asm__ volatile ("clrwdt");}
而前面的八位單片機的C語言也可以用下列嵌入匯編的方法: asm("CLRWDT");

『叄』 pic系列單片機用c語言編程時,讓他執行A/D轉換的指令是什麼

AD轉換不是一條指令就可以完成的,它要先經過埠設置,AD設置等過程後才能准備進入AD轉換,下例是從北航的<PIC16單片機C程序設計與PROTEUS模擬>一書中得到的啟發編制的程序,希望對你能有幫助.建議你看一下這本書,對初學和想進一步提高在PIC單片機應用編程等會有用的.

附圖是對應程序的,在模擬時調整電位器可以看到AD結果的變化,並通過計算器可以驗證程序的正確性.

//ADl轉換示例,可以改變輸入電壓、AD通道、結果對齊方式等,看其變化

#include<pic.h>

__CONFIG(0x3F39);//配置位設置

voidmain(void)

{ chari,X,Y;

TRISA=0xFF; //將所有的A口設置為輸入

TRISE=0x03; //將所有的E口設置為輸入

TRISD=0; //C口與D口全為輸出

TRISC=0;

ADCON1=0b10000000; //設置AD結果對齊方式、AD時鍾選擇(與ADCON0的位7,6一起),AD埠設置等

ADCON0=0b01011001; //AD時鍾選擇(與ADCON1的位6一起),通道選擇,AD模塊使能

while(1)

{ NOP();

for(i=0;i<3;i++) //延時時間大約20us

NOP();

ADGO=1; //開始AD

while(ADGO==1); //等待AD轉換完成

ADIF=0;

X=ADRESH; //讀取AD結果高位元組至C口

PORTC=X;

Y=ADRESL; //讀取AD結果低位元組至D口

PORTD=Y;

};

}

『肆』 單片機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伺服器應用
參考文獻

『伍』 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 信號 */
}

『陸』 最近剛學PIC單片機,有個程序看不懂,請高手幫下,越詳細越好:

INDF 和 FSR兩個寄存器構成了一個間接定址的作用。
FSR有點像C語言中的指針,INDF是一個虛擬的寄存器,對它操作其實是對FSR鎖指向的內存單元操作。
簡單的說,當20h這個數賦給了FSR,那麼就是FSR作為指針指向了內存中地址為20h的這個單元(以下就用<20h>來表示這個單元,以區別十六進制的20h這個數值),此時INDF就被映射到<20h>。
從頭說起:
1:W被賦值20h這個數;2:FSR被賦值和W寄存器相同的數20H,此時FSR指向了<20h>;3:此時W寄存器因為沒被改變過,所以其數值依然是十六進制的20h那麼MOVWF 20H其實就是把W里的數據賦值給<20h>這個內存單元 也就是 <20h> = 20H ;
4:重點來了 INCF INDF,讓INDF自加1。前面說了對INDF操作其實就是對FSR所指向的單元操作,也就等同於 INCF <20h>(真正程序里不能這么寫的,因為<20h>這楊寫法是錯誤的) 類似C與語言中的<20h>++
5:FSR自加1,FSR內部的值等於21h所以FSR指向了<21h>這個內存單元。
6:<20h>單元的數值高4位和低4位轉換一下數據。所以 <20h> = 02h
7:把<20h>的內容賦值給W寄存器,所以w = 02h
8:FSR此時 等於21h ,把21h和W的02h做與運算,結構 0 賦值給FSR。

『柒』 關於PIC單片機C語言編程 MPLAB和PICC的問題

1、新建工程向導里會詢問使用哪種編譯器. 選擇PICC就可以了. 如果沒找到PICC那需要在 Project 菜單最後一行 選擇語言 裏手動設置語言. 另外最好把PICC和MAPLAB安裝在同一個目錄下。
2、先安裝MPLAB7.51和PICC,做好安裝在同一目錄下,MPLAB會自動進行關聯設置,否則需人工干預,在MPLAB頂上 Project 菜單最後一行『選擇語言』裏手動設置語言。

閱讀全文

與pic單片機c語言編程實例相關的資料

熱點內容
單片機中斷應用 瀏覽:620
搜狗app哪個好用 瀏覽:450
中信銀行還完貸款什麼時候給解壓 瀏覽:233
ug自學編程入門 瀏覽:612
英語口語900句pdf 瀏覽:565
javabyte拼接 瀏覽:481
加密應用在哪裡找vivo 瀏覽:290
python讀寫圖像 瀏覽:289
不是金山毒霸會員文件還能加密嗎 瀏覽:955
python網站開發教程 瀏覽:875
安卓超感畫質引擎是什麼意思 瀏覽:323
ug80編程穩定嗎 瀏覽:706
樂高ev3魔方機器人編程 瀏覽:891
文件夾120 瀏覽:753
怎麼判斷用幾個密鑰進行加密 瀏覽:433
學韓語哪個app最好 瀏覽:940
怎麼才能讓蘋果手機登安卓號 瀏覽:599
史上最強大腦演算法 瀏覽:327
java圖形識別演算法 瀏覽:971
安卓手機開機怎麼會出現圓圈 瀏覽:203