當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 編程軟體 » c30編譯器

c30編譯器-九游会j9娱乐平台

發布時間: 2024-07-02 08:35:18

ⅰ 在pic中如何用c語言編寫程序

//09/10/24
//lcd1602顯示時間 日期 星期 溫度
//通過按鍵校時:k10--小時,k11--分鍾,k12--秒(歸零),k13-星期,br1--年,rb2--月,rb3--日。
//晶元要求:pic16f877a

#include //包含單片機內部資源預定義
__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) temp00)/100; //十位
ge=((const) temp00)0/10; //個位
shifen=((const) temp00)0; //十分位
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(); //調用顯示函數
}
}

ⅱ mpalb c30編譯的時候編譯通過,但出現link eorr ,是什麼問題

樓上的回答扯到哪去了?人家問的是微芯單片機,pic24f在mplab ide下用c30編譯器時產生的錯誤!
這種情況應該是代碼應用了超出器件范圍的資源.
我也遇到過用xc16編譯代碼產生這樣的問題!免費版的xc16沒有代碼優化功能,編譯時不停提示,有限許可證...最後產生的代碼量太大,導致儲存器不夠分配而引起.

ⅲ 關於pic單片機c語言編程

1:第一個問號:是; 第二個問號:不一定;
2:一些c30有多種類型版本,你說的30c和36可能不是指同一種類型。
3:沒破解的編譯器過期就不能編譯程序了。想用就需要重裝(貌似它會在系統內記錄的,所以應該是重裝操作系統才行)。
4:肯定不可靠。我有過編譯經歷,破解的編譯出來的在邏輯上就會有問題。但這不影響普通學生入門者做設計。如果你是做工業、航天領域設計的,你的領導也不會讓你用破解版或者未注冊版。所以現在很多單位寧願用匯編來編譯程序。

picc有支持 pic10/12/16/18/24/32系列單片機 的c編譯器。同時也支持dspic30/33 系列dsc晶元的c編譯器

ⅳ 求mplab c30編譯器

http://www.pic16.com/jszl/jszl.htm
這裡面不僅有編譯器,還有中文版的編譯器用戶指南

ⅳ pic mplab編譯器到底用哪個

首先你說的這些都是pic單片機的c語言編譯器。picc都是hitech公司針對pic系列的c語言編譯器。ccs是另一個公司的。他們跟microchip(pic單片機的生產商)都沒有關系,屬於第三方軟體。在mplab里出現只是他們公司間的合作,捆綁上這些編譯器的試用版(試用三十天)。
如果你用pic18、pic24或dspic30/33這些單片機的話。推薦使用microchip自己出的c編譯器mplab c18(對應pic18),mplab c30(pic24和dspic30/33)。因為這些編譯器的編譯效率要優於其他第三方,並且有microchip的官方應用文檔支持。
而pic10、pic12、pic16等系列的8位單片機因為內部的程序區比較小,microchip並沒有推出針對他們的c語言編譯器。而ccs和hitech則有針對他們的c語言編譯器。就編譯效率來說。ccs是最好的,但它在中國的的技術支持卻很少。大部分的軟體使用文檔都是英文的。在國內的應用也沒有hitech的picc那麼好。如果這三種系列的單片機,推薦用picc。
另外,上述的所有編譯器除了mplab c30在icd2附送的光碟里有學生版(只針對dspic30/33,免費版)外,其他的所有針對pic單片機的c編譯器都是收費的。最便宜的是picc for pic12/16 ,好像才800多。
不過…… …………………… 網上有破解版本的。哈哈。
另外,如果是用pic10、pic12、pic16等系列的8位單片機,推薦不要先用c語言寫程序。用mplab捆綁的匯編編譯器(這是免費送的)。雖然學起來比較費勁,但能讓你更好的了解pic單片機。畢竟現在外頭好多用pic單片機的企業都要求用匯編寫程序(就為了最大效率的使用程序存儲器)。

ⅵ 關於pic單片機編程,mplab平台下的c編譯器,c18、c30、c32,在哪裡查看是pro專業版還是free免費版!

隨便建個工程,編譯結果會提醒你是pro mode還是lite mode,或者在編譯選項菜單裡面可以看到是哪種版本,一般都用破戒的,至於試用版期限編譯結果或者打開軟體應該有提示

ⅶ 一般8位pic單片機使用c語言還是匯編語言編程,好像編譯器不是支持所有類型的單片機

pic單片機的c語言編譯器是分類支持各類pic單片機的。
一般做工業產品的公司大多用匯編來編寫程序,原因有:
1:pic的8位單片機一般rom和ram都相對較小,而現在的pic的c編譯器在優化方面做的不是很好,簡單的一個c語句編譯器能編出很多行匯編代碼。所以有些開發人員認為用c還不如直接用匯編寫。
2:因為pic的c編譯器不是免費的,破解版的又存在一些邏輯漏洞什麼的。而用pic單片機應用的大多是一些需要穩定性極高的控制場合,所以很多開發公司都乾脆直接使用匯編來寫。

熱點內容
resin下jsp不能正常編譯 發布:2024-07-17 16:34:44 瀏覽:229
sqlserver如何切換主備伺服器 發布:2024-07-17 16:23:02 瀏覽:299
mc18伺服器ip 發布:2024-07-17 16:23:02 瀏覽:379
仙境傳說手游腳本 發布:2024-07-17 16:09:24 瀏覽:691
matlab命令窗口和新建腳本 發布:2024-07-17 15:51:26 瀏覽:375
建ftp文件夾 發布:2024-07-17 15:51:26 瀏覽:955
魔獸撿物腳本 發布:2024-07-17 15:27:56 瀏覽:130
開發ip伺服器 發布:2024-07-17 15:24:42 瀏覽:388
安卓系統視頻製作哪個好用 發布:2024-07-17 15:10:47 瀏覽:210
androidapk結構 發布:2024-07-17 15:10:43 瀏覽:945
网站地图