本文目錄一覽:
- 1、PIC單片機C語言
- 2、PIC單片機用C語言編程 想 同時執行並循環兩個程序!
- 3、pic系列單片機用c語言編程時,讓他執行A/D轉換的指令是什麼?
- 4、在pic中如何用C語言編寫程序?
- 5、推薦個PIC視頻教程,C語言的,適合入門的,通俗易懂。感謝啦。我學過51,想在工作要學習PIC
- 6、c語言 PIC單片機
PIC單片機C語言
是左移,表示右移動
相當於 HC595_DATA_HIGH PORTC |0x01;
如果是HC595_DATA_HIGH PORTC |=(12),1左移2位,那就是0000 0100
相當於 HC595_DATA_HIGH PORTC |0x04;
就是把 HC595_DATA_HIGH PORTC這個數的2位(0,1,2—-第三位與1進行或運算)
注意:這裡指的是位運算,上面的0x01,0x04在 或運算的時候可以這麼寫,因為其他位都是0,沒有關係
PIC單片機用C語言編程 想 同時執行並循環兩個程序!
現在手頭沒有東西,不知道這樣子行不行,這裡是C做的;假設是PORTB口做輸出,下面的一段可能會幫助:初始化中PORT_B=0B1000 0000;PORTB_BUFF=0B0100 0000;
void your_PROGRAM(void)
{
PORTB_BUFF=PORTB_BUFF/2;
if(PORTB_BUFF==0) PORTB_BUFF=0B0100 0000;
PORTB=PORT_BPORTB_BUFF;
}
pic系列單片機用c語言編程時,讓他執行A/D轉換的指令是什麼?
AD轉換不是一條指令就可以完成的,它要先經過端口設置,AD設置等過程後才能準備進入AD轉換,下例是從北航的PIC16單片機C程序設計與PROTEUS仿真一書中得到的啟發編製的程序,希望對你能有幫助.建議你看一下這本書,對初學和想進一步提高在PIC單片機應用編程等會有用的.
附圖是對應程序的,在仿真時調整電位器可以看到AD結果的變化,並通過計算器可以驗證程序的正確性.
//ADl轉換示例,可以改變輸入電壓、AD通道、結果對齊方式等,看其變化
#include pic.h
__CONFIG(0x3F39); //配置位設置
void main(void)
{ char i,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;i3;i++) //延時時間大約20us
NOP();
ADGO=1; //開始AD
while(ADGO==1); //等待AD轉換完成
ADIF=0;
X=ADRESH; //讀取AD結果高字節至C口
PORTC=X;
Y=ADRESL; //讀取AD結果低字節至D口
PORTD=Y;
};
}
在pic中如何用C語言編寫程序?
//09/10/24
//lcd1602顯示時間 日期 星期 溫度
//通過按鍵校時:K10–小時,K11–分鐘,K12–秒(歸零),K13-星期,BR1–年,RB2–月,RB3–日。
//芯片要求:PIC16F877A
#includepic.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 bai;
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;i0;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;i0;i–)
{
k=code0x01;
TRISA0=0;
DQ=0; //數據線拉低產生時間片
asm(“nop”);
asm(“nop”);
if(k) DQ=1; //寫1則拉高數據電平
delay1(3); //延時42us,ds18b20對數據線採樣
asm(“nop”);
TRISA0=1; //採樣結束,釋放總線,拉高電平
code=code1;
delay1(7); //延時82us
}
}
//****************************************************
//讀ds18b20
unsigned char ds18b20_read_byte()
{
unsigned char i,k;
for(i=8;i0;i–)
{
k=k1;
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;i0;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=THV8;
t=t|TLV;
if(t0) //負溫度
{
temp=(~t+1)*0.0625*10+0.5; //負溫度時,取反加1再乘以0.0625得實際溫度,乘10+0.5顯示小數點一位,且四捨五入
}
else
temp=t*0.0625*10+0.5; //正溫度
if(t0)
bai=’-‘; //負溫度時百位顯示負號
else
bai=(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;j8;j++) //連續寫8bit
{
i_o=0; //先設置數據為0
sclk=0; //時鐘信號拉低
if(data0x01) //判斷待發送的數據位是0或1
{
i_o=1; //待發送數據位是1
}
data=data1; //待發送的數據右移1位
sclk=1; //拉高時鐘信號
}
sclk=0; //寫完一個字節,拉低時鐘信號
}
//———————————————
//讀一個字節函數
unsigned char read_byte()
{
int j; //設置循環變量
TRISB4=1; //設置數據口方向為輸入
for(j=8;j–;) //連續讀取8bit
{
sclk=0; //拉低時鐘信號
rx_data=rx_data1; //接收寄存器右移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;i7;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;i8;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;i0;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(bai);
// 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_data0x80) //否,則初始化DS1302
{
ds1302_init(); //調用DS1302初始化函數
set_time(); //調用設置時間函數
}
while(1)
{
get_time(); //調用取時間函數
change_time();
get_temp(); //調用溫度轉換函數
display(); //調用顯示函數
}
}
推薦個PIC視頻教程,C語言的,適合入門的,通俗易懂。感謝啦。我學過51,想在工作要學習PIC
PIC的很少有視頻教程,不過你可以找找。PIC的資料網上也多。我看的是《PIC單片機應用開發典型模塊》,裡面有例程,大多是C語言的。建議你多逛逛PIC的論壇(網上搜),有問題在上面提問,一般都有人幫你解決。
c語言 PIC單片機
你這是PIC16位機的中斷編程規定的格式,包括_T1Interrupt都是規定的,連大小寫都得一模一樣。這個是定時器1的中斷函數申明。你可以在C30手冊中看到它們,
如可以看到其他中斷入口的名稱:
0 _INT0Interrupt
1 _IC1Interrupt
2 _OC1Interrupt
3 _T1Interrupt
4 _IC2Interrupt
5 _OC2Interrupt
6 _T2Interrupt
7 _T3Interrupt
8 _SPI1Interrupt
9 _U1RXInterrupt
10 _U1TXInterrupt
11 _ADCInterrupt
12 _NVMInterrupt
13 _SI2CInterrupt
14 _MI2CInterrupt
15 _CNInterrupt
16 _INT1Interrupt
17 _IC7Interrupt
18 _IC8Interrupt
19 _OC3Interrupt
20 _OC4Interrupt
。。。。。。
你要學C30,這個手冊是必看的,這個手冊目前最新版本號是K,文檔編號為DS51284K,共有200多頁英文版。可以在公司網站中下載:
;nodeId=1406dDocName=en010065
在這個頁面你可以下載到更多的資料和軟件。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/150884.html