久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

學(xué)習(xí)單片機(jī)c語言還是語言

時(shí)間:2019-05-15 10:26:44下載本文作者:會(huì)員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《學(xué)習(xí)單片機(jī)c語言還是語言》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《學(xué)習(xí)單片機(jī)c語言還是語言》。

第一篇:學(xué)習(xí)單片機(jī)c語言還是語言

匯編語言(AssemblyLanguage)是面向機(jī)器的程序設(shè)計(jì)語言。匯編語言是一種用文字助記符來表示機(jī)器指令的符號(hào)語言,是最接近機(jī)器碼的一種語言。其主要優(yōu)點(diǎn)是占用資源少、程序執(zhí)行效率高。但是不同的CPU,其匯編語言可能有所差異,所以不易移植。

匯編語言的缺點(diǎn):

(1)編寫的代碼非常難懂,不好維護(hù)

(2)很容易產(chǎn)生bug,難于調(diào)試

(3)只能針對特定的體系結(jié)構(gòu)和處理器進(jìn)行優(yōu)化

(4)開發(fā)效率很低,時(shí)間長且單調(diào)

匯編語言的特點(diǎn)

1.面向機(jī)器的低級(jí)語言,通常是為特定的計(jì)算機(jī)或系列計(jì)算機(jī)專門設(shè)計(jì)的2.保持了機(jī)器語言的優(yōu)點(diǎn),具有直接和簡捷的特點(diǎn)

3.可有效地訪問、控制計(jì)算機(jī)的各種硬件設(shè)備,如磁盤、存儲(chǔ)器、CPU、I/O端口等

4.目標(biāo)代碼簡短,占用內(nèi)存少,執(zhí)行速度快,是高效的程序設(shè)計(jì)語言

5.經(jīng)常與高級(jí)語言配合使用,應(yīng)用十分廣泛

對于不同型號(hào)的計(jì)算機(jī),有著不同的結(jié)構(gòu)的匯編語言,學(xué)習(xí)難度大。

C語言是一種結(jié)構(gòu)化的高級(jí)語言。其優(yōu)點(diǎn)是可讀性好,移植容易,易學(xué)易用,是普遍使用的一種計(jì)算機(jī)語言。

c語言優(yōu)點(diǎn):

1、語言簡潔,使用方便靈活,可大幅度提高開發(fā)速度,系統(tǒng)越復(fù)雜,開發(fā)效率越高。

2、無須深入了解單片機(jī)內(nèi)部結(jié)構(gòu),和復(fù)雜的單片機(jī)匯編語言指令集

3、可進(jìn)行模塊化開發(fā),軟件邏輯結(jié)構(gòu)清晰,有條理,易于分工合作

4、可移植性好,寫好的一個(gè)c語言算法,可方便地移植到其他單片機(jī)上,而匯編語言相對要復(fù)雜的多。

5、可直接操作硬件

隨著單片機(jī)的內(nèi)部資源越來越多,存儲(chǔ)空間越來越大,資源已經(jīng)不是考慮的首要問題,c語言可以大大提高開發(fā)的效率,c 語言是初學(xué)者的首選語言。匯編語言在實(shí)時(shí)性,執(zhí)行效率上有不可替代的優(yōu)勢。大部分情況下c語言就可以滿足要求,在實(shí)時(shí)性要求高的某些場合中,可用c語言和匯編語言混合編程的方式,兼顧開發(fā)效率和實(shí)時(shí)性。了解匯編語言對于學(xué)習(xí)單片機(jī)的內(nèi)部結(jié)構(gòu),執(zhí)行過程非常有幫助,是成為單片機(jī)高手需要掌握的語言。c語言進(jìn)行單片機(jī)程序設(shè)計(jì)是單片機(jī)開放與應(yīng)用的必然趨勢。

小企鵝diy科學(xué)探究學(xué)習(xí)網(wǎng)

更多文章:轉(zhuǎn)到 文章分類-單片機(jī)

第二篇:單片機(jī)C語言學(xué)習(xí)

單片機(jī)C語言之一___________________________________________________________________ _____________________ 預(yù)處理 一》宏定義:

1、不帶參數(shù):

#define 標(biāo)識(shí)符 常量表達(dá)式

/*#define是宏定義命令,宏名(標(biāo)識(shí)符)好習(xí)慣用大寫*/ #define NIL 0x80

2、帶參數(shù):/*相當(dāng)于小函數(shù)*/ #define 宏名(參數(shù)表)字符串

/*不僅要時(shí)行字任串替換還要進(jìn)行參數(shù)的替換,在宏定義時(shí),宏名與帶參數(shù)的括弧之間不應(yīng)該加空格,否則將空格以后的字符串都作為替代字符串的一部分,這可是很容易出錯(cuò)的*/ 如:#define SQ(a,b)a*b 使用:x=12;y=10;area=SQ(x,y);/*則area=12*10=120*/ 二》文件包含:

#include <文件名>或#include “文件名” /*在C中用雙引用形式更保險(xiǎn),在C51中常用物是尖括弧形式*/ 三》條件編譯:

/*一般源程序中的所有程序行都參加編譯,但有時(shí)希望對其中一部分內(nèi)容只在滿足一定條件下才進(jìn)行編譯,也就是對一部分內(nèi)容指定編譯的條件。*/ #if、#elif、#else、#endif、#ifdef、#ifndef /*選擇不同的編譯范圍,產(chǎn)生不同的代碼,提供通用性。*/ /*如對8051在6MHZ與12MHZ下有*/ #ifdef cpu==8051 #define FREQ 6 /*程序段*/ #else #define FREQ 12/*程序段*/ #endif /*這樣下面的原程序不用做任何修改便可以使用于兩種時(shí)鐘頻率的單片機(jī)系統(tǒng)*/ 四》其他:

1、#error:捕捉不可預(yù)料的編譯條件

#if(myv!=0&&myv!=1)/*假定其值必為0或1*/ #error myv must be 1 or 0/*出錯(cuò)時(shí)顯示*/ #endif

2、#pragma:用于在程序中向編譯器傳送各種編譯控制命令 #pragma 編譯命令序列

/*例:想按如下命令編譯ex.c c51 ex.c debug cod large可用:*/

#pragma DB CD LA #pragma disable /*禁止中斷*/

單片機(jī)C語言之二_____________________________________________________________________________________ 一》數(shù)據(jù)類型:

char int long 1:unsinged 0~255 0~65535 0~4294967295 2:signed-128~127-32768~32767-2147483648~2147483647 指針:* 3字節(jié) 位標(biāo)量: sbit 特殊功能寄存器:sfr 16位特殊功能寄存器:sfr16 占2個(gè)內(nèi)存單元,0~65535 可尋址位:sbit利用他可訪問51單片機(jī)的內(nèi)部RAM中的可尋址位或特殊功能寄存器中的可尋址位 sfr P0=0x80;sbit P0_1=P0^1;/*將P0口的口地址定義為80H,將P0.1位定義為P1_1*/ 二》數(shù)據(jù)存貯類型

表1.C51數(shù)據(jù)存貯類型

━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━ 數(shù)據(jù)存貯類型 ┃ 與存貯空間的對應(yīng)關(guān)系

━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━ data ┃ 直接尋址片內(nèi)數(shù)據(jù)存貯區(qū),訪速度快 bdata ┃ 可位尋址片內(nèi)數(shù)據(jù)存貯區(qū),允許位與字節(jié)混合訪問 idata ┃ 間接尋址片內(nèi)數(shù)據(jù)存貯區(qū),可訪問片內(nèi)全部RAM地址空間

pdata ┃ 分頁尋址片外數(shù)據(jù)存貯區(qū)(256字節(jié))由MOVX @R0訪問 xdata ┃ 片外數(shù)據(jù)存貯區(qū)(64K),由MOVX @DPTR訪問 code ┃ 代碼存貯區(qū)(64K),由MOVC @DPTR訪問

━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━ 變量的存貯類型定義: char data var /*字符變量var被定義為data存貯類型,C51編譯器將把該變量定位在51單片機(jī)片內(nèi)數(shù)據(jù)區(qū)存貯區(qū)中*/ bit bdata flag /*位變量flag被定義為bdata存貯類型,C51編譯器將把該變量定位在51單片機(jī)片內(nèi)數(shù)據(jù)區(qū)存貯區(qū)(RAM)中的位尋址區(qū):20H--2FH*/

三》typedef:重新定義數(shù)據(jù)類型

typedef 已有數(shù)據(jù)類型 新的數(shù)據(jù)類型 typedef int word;/*將word定義為整型*/ word i,j;/*將i,j定義為整型*/ 四》位運(yùn)算符:

━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━━━━┳━━━━━━ ~ ┃ & ┃ | ┃ ^ ┃ << ┃ >> ━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━━━━╋━━━━━━

按位取反┃ 按位與 ┃ 按位或 ┃ 按位異或 ┃ 左移 ┃ 右移

━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━━━━┻━━━━━━

對移位:如<< ,a<<2,即為將二進(jìn)制的a左移兩位,若a=0x8f,即10001111,a=a<<2,將導(dǎo)致a=0x3c(00111100),右邊補(bǔ)零。五》條件運(yùn)算符:

邏輯表達(dá)式? 表達(dá)式1:表達(dá)式2 六》指針與地址運(yùn)算符: *取內(nèi)容 &取地址

七》強(qiáng)制類型轉(zhuǎn)換:(類型)=表達(dá)式(char *)0xb000 八》sizeof 取數(shù)據(jù)類型、變量以及表達(dá)式的字節(jié)數(shù)的運(yùn)算符; 九》continue:中斷語句:結(jié)束本次循環(huán)。

單片機(jī)C語言之三_____________________________________________________________________________________ 函數(shù):

一》中斷服務(wù)函數(shù)與寄存器組定義:

函數(shù)類型 函數(shù)名(形式參數(shù)表)[interrupt n][using n] n為中斷號(hào),0~31:

━━━━┳━━━━━┳━━━━━ 中斷編號(hào)┃ 中斷向量┃ 入口地址 ━━━━╋━━━━━╋━━━━━ 0 ┃ 外中斷0 ┃ 0003H ━━━━╋━━━━━╋━━━━━ 1 ┃ 定時(shí)器0 ┃ 000BH ━━━━╋━━━━━╋━━━━━ 2 ┃ 外中斷1 ┃ 0013H

━━━━╋━━━━━╋━━━━━ 3 ┃ 定時(shí)器1 ┃ 001BH ━━━━╋━━━━━╋━━━━━ 4 ┃ 串行口 ┃ 0023H ━━━━┻━━━━━┻━━━━━

后面的n指的是四個(gè)工作寄存器組的一個(gè):0~3 對函數(shù)目標(biāo)代碼影響如下:

在函數(shù)入口處將當(dāng)前工作寄存器組保護(hù)到堆棧中;指定的工作寄存器內(nèi)容不會(huì)改變,函數(shù)返回前將被保護(hù)的工作寄存器組從堆棧中恢復(fù)!例(定時(shí)1ms):

#include sbit P1_0=P1^0;void timer0(void)interrupt 1 using 1{ P1_0=!P1_0;TH0=-(1000/256);TL0=-(1000%256);} main(){ SP=0x60;P1_0=0;TMOD=0X01;TH0=-(1000/256);TL0=-(1000%256);EA=1;ET0=1;TR0=1;do{}while(1);} /* 注意:

1、如果中斷函數(shù)中用到浮點(diǎn)運(yùn)算,必須保存浮點(diǎn)寄存器的狀態(tài)。(在math.h中保存浮點(diǎn)寄存器函數(shù)為pfsave, 恢復(fù)浮點(diǎn)寄存器的狀態(tài)函數(shù)為fprestore)

2、如果在中斷函數(shù)中調(diào)用了其他函數(shù),則被調(diào)函數(shù)所使用的工作寄存器組與中斷函數(shù)的一致!*/

單片機(jī)C語言之四_____________________________________________________________________________________

一、局部變量與全局變量(外部變量):

1、全局變量若不在開頭定義則加extern

2、全局變量會(huì)使代碼長,占用內(nèi)存多

二、存儲(chǔ)方式:

自動(dòng)變量(auto):缺省,函數(shù)調(diào)用存在,退出消失。

內(nèi)部變量 靜態(tài)變量(static):static int a=5;始終存在,退出不消失,但不能訪問。寄存器變量(register):速度最快。通常只給編譯器一個(gè)建議,由編譯器根 據(jù)實(shí)際情況確定。(見下)變量 全局變量(global): 外部變量

靜態(tài)變量(static): 寄存器變量例: #include int_power(m,e)int m;register int e;{ register int temp;temp=1;for(;e;e--)temp*=m;return(temp);} main(){ ?? }

三、函數(shù)的參數(shù)和局部變量的存儲(chǔ)器模式: 三種存儲(chǔ)器模式:small,compact,large.一個(gè)函數(shù)的存儲(chǔ)器模式確定了函數(shù)的參數(shù)和局部變量在內(nèi)存中的地址空間 small:內(nèi)部ram compact, large:外部RAM 函數(shù)類型 函數(shù)名(形式參數(shù)表)[存儲(chǔ)器模式] 例:

#pragma large /*默認(rèn)存儲(chǔ)器模式為large*/ extern int calc(char I,int b)small;/*指定small模式*/ extern int func(int I,float f)large;/*指定large模式*/ int large_te(int I,int k)/*未指定,按默認(rèn)的large模式處理*/ { return(mtest(I,k)+2);}

利用存儲(chǔ)器混合模式編程,充分利用有限的存儲(chǔ)空間,還可加快程序的執(zhí)行速度!

單片機(jī)C語言之五_____________________________________________________________________________________ 數(shù)組 1>初始化數(shù)組: unsigned char a[5]={0x11,0x22,0x33,0x44,0x55} 或

unsigned char a[ ] ={0x11,0x22,0x33,0x44,0x55,0x66} 3>數(shù)組作為函數(shù)的參數(shù):不但可以由變量作為函數(shù)的參數(shù)外,還可以用數(shù)組名作為函數(shù)的參數(shù)。一個(gè)數(shù)組數(shù)組名表示該數(shù)組的首地址。用一個(gè)數(shù)組名作為函數(shù)的參數(shù)時(shí),在執(zhí)行函數(shù)調(diào)用的過程中參數(shù)傳遞方式采用的是地址傳遞。將實(shí)際參數(shù)數(shù)組首地址傳遞給被調(diào)函數(shù)中的形式參數(shù)數(shù)組,這樣一來兩個(gè)數(shù)組就占有同一段內(nèi)存單元。見下圖:

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 起始地址1000 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] b[9] 用數(shù)組名作為函數(shù)的參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)函數(shù)中分別進(jìn)行數(shù)組定義而不能只在一方定義數(shù)組。而且在兩個(gè)函數(shù)中定義的數(shù)組類型必須一致,如果類型不一致將導(dǎo)致編譯出錯(cuò)。實(shí)參數(shù)組和型參數(shù)組的長度可以一致可以不一致,編譯器對形參數(shù)組的長度不做檢查,直只是將實(shí)參數(shù)組的首地址傳遞給行參數(shù)組。如果希望行參數(shù)組能得到實(shí)參數(shù)組的全部元素,則應(yīng)使兩個(gè)數(shù)組的長度一致。定義型參數(shù)組時(shí)可以不指定長度,只在數(shù)組名后面跟一個(gè)方括號(hào)[]。這時(shí)為了在被調(diào)函數(shù)中處理數(shù)組元素的需要,應(yīng)另外設(shè)置一個(gè)參數(shù)來傳遞數(shù)組元素的個(gè)數(shù)。

例:用數(shù)組作為函數(shù)的參數(shù),計(jì)算兩個(gè)不同長度的數(shù)組中所有元素的平均值 #include float average(array,n)int n;float array[ ];{ int I;float aver,sum=array[0];for(I=1;I

float pot_1[2]={99.9,88.8};float pot_2[3]={11,22,33.3};average(pot_1,2);average(pot_1,3);}

單片機(jī)C語言之六_____________________________________________________________________________________ 軟件法去干擾:

工程上我們在采集數(shù)據(jù)時(shí)一般要求精度達(dá)到5%%,大于這個(gè)值將認(rèn)為無效。我在實(shí)際應(yīng)用中采用8535對32路數(shù)據(jù)進(jìn)行采集(8535帶10位AD,帶看門狗),發(fā)現(xiàn)數(shù)據(jù)跳動(dòng)有時(shí)達(dá)7%%,這是由于各種干擾造成的。主要來自于隨機(jī)干擾,下面就各種干擾的方法給出簡單的去除方法:

1、白噪聲:最重要的統(tǒng)計(jì)特性為平均值為0,可采取每路數(shù)據(jù)采集幾次求平均的方法;

2、隨機(jī)干擾:該點(diǎn)明顯高于或低于附近正常采樣值,故采取中值濾波法,即對被測信號(hào)連續(xù)采樣M次,進(jìn)行大小排序,取大小居中的1/3個(gè)采樣值進(jìn)行算術(shù)平均;

3、電源干擾:特點(diǎn)是有固定周期,故可采用定時(shí)采樣求平均的方法。

由于各種排序與求平均算法用C易于實(shí)現(xiàn),故C常常用于采集系統(tǒng)中軟件去干擾。至于排序算法可參考上一篇文章,有一個(gè)經(jīng)典的程序。

在實(shí)際中我們采用每路猜9個(gè)值,排序,取中間3個(gè),求平均。然后。,每路數(shù)據(jù)幾乎不動(dòng)!

單片機(jī)C語言之七_(dá)____________________________________________________________________________________ 指針:可對內(nèi)存地址直接操作

基于存貯器的指以貯器類為參量,它在編譯時(shí)才被確定。因此為指針選擇存貯器的方法可以省掉,以這些指針的長度可為1個(gè)字節(jié)(idata *,data *,pdata *)或2個(gè)這節(jié)(code *,xdata *)。char xdata *address;ADC0809具有8個(gè)模擬量輸入通道,采用中斷方式,在中斷函數(shù)中讀取8個(gè)通道的A/D轉(zhuǎn)換值,分別存儲(chǔ)在外部RAM的1000H~1007H單元。ADC0809端口地址為00F0H。

程序定義了兩個(gè)指針變量* ADC和* ADCdata,分別指向ADC0809端口地址(00F0H)和外部RAM單元地址(1000H~1007H)

由*ADC=I送入通道數(shù),啟動(dòng)ADC0809進(jìn)行A/D轉(zhuǎn)換,轉(zhuǎn)換結(jié)束時(shí)產(chǎn)生INT1中斷。在中斷服務(wù)函數(shù)int1()中通過temp=*ADC和*ADCdata=temp;讀取A/D轉(zhuǎn)換結(jié)果并存到外部RAM中。#include unsigned int xdata *ADC;/*定義ADC0809端口指針*/ unsigned int xdata *ADCdata;/*定義ADC0809數(shù)據(jù)緩沖器指針*/ unsigned char I;

void main(){ ADC=0x00f0;/*定義端口地址和數(shù)據(jù)緩沖器地址*/ ADCdata=0x1000;I=8;/* ADC0809有8個(gè)模擬輸入通道*/ EA=1;EX1=1;IT1=1;/*開中斷*/ *ADC=I;/*啟動(dòng)ADC0809*/ WHILE(I);/*等待8個(gè)通道A/D轉(zhuǎn)換完*/ } void int1()interrupt 2 { unsigned char tmp;temp=*ADC;/*讀取A/D轉(zhuǎn)換結(jié)果*/ *ADCdata=temp;/*結(jié)果值存到數(shù)據(jù)緩沖區(qū)*/ ADCdata++;/*數(shù)據(jù)緩沖區(qū)地址加1*/ i—;*ADC=I;/*啟動(dòng)下一個(gè)模擬輸入通道A/D轉(zhuǎn)換*/ } 除了用指針變量來實(shí)現(xiàn)對內(nèi)存地址的直接操作外,c51編譯器還提供一組宏,該宏定義文件為:“absacc.h”,利用它可十分方便地實(shí)現(xiàn)對任何內(nèi)存空間的直接操作,改寫上面的程序: #include #include /*包含絕對地址操作預(yù)定義頭文件*/ #define ADC 0x00f0;/*定義ADC0809端口地址*/ #define ADCdata 0X1000 /*定義數(shù)據(jù)緩沖器地址*/ unsigned char I;void main(){ I=8;/ *ADC0809有8個(gè)模擬輸入通道*/ EA=1;ex1=1;it1=1;/ *開中斷*/ XBYTE[ADC]=I;/*啟動(dòng)0809 */ While(i);/*等待8個(gè)通道轉(zhuǎn)換完畢*/ } void int1()interrupt2 { unsigned char tmp;tmp=XBYTE[ADC];/*讀取A/D轉(zhuǎn)換結(jié)果*/ i--;XBYTE[ADCdata+I]=tmp;/**結(jié)果值存儲(chǔ)到數(shù)據(jù)緩沖器*/ XBYTE[ADC]=I;/*啟動(dòng)下一個(gè)模擬輸入通道A/D轉(zhuǎn)換*/ } 兩指針相減-----計(jì)算字符串的長度 #include main(){

char *s=”abcdef”;int strlen(char *s);printf(“n length of ‘%%s’=%%dn”,s,strlen(s));} int strlen(char *s){ char *p=s;while(*p!=’

主站蜘蛛池模板: 日本免费一区二区三区在线播放| 免费一区二区三区成人免费视频| 亚洲人精品亚洲人成在线| 一本大道伊人av久久综合| 五月婷婷开心中文字幕| 波多野结衣不打码视频| 性xxxx18免费观看视频| 国内揄拍国内精品对白86| 女人被狂躁到高潮视频免费网站| 欧美熟老熟妇色xxxxx| 久久综合九色综合国产| 国产无遮挡18禁无码网站免费| 狠狠亚洲色一日本高清色| 色翁荡熄又大又硬又粗又视频图片| 狠狠爱俺也去去就色| 少妇的肉体在线观看| 亚洲欧美日韩自偷自拍| 熟睡被义子侵犯中文字幕| 成人国产精品无码网站| 动漫精品专区一区二区三区不卡| 免免费国产aaaaa片| 国产成人午夜福利在线观看| 男女性杂交内射女bbwxz| 精品无码免费专区毛片| 国产极品女主播国产区| 强奷漂亮人妻系列老师| 久久久久国产精品人妻aⅴ四季| 厨房玩丰满人妻hd完整版视频| 亚洲国产av无码精品| 日韩一区二区三区北条麻妃| 一本久道中文无码字幕av| 国产午夜福利在线机视频| 又粗又硬又大又爽免费视频播放| 亚 洲 视 频 高 清 无 码| 亚洲熟妇国产熟妇肥婆| 亚洲人成网址在线播放小说| 免费无码又爽又高潮视频| 久久综合五月丁香久久激情| 自拍偷亚洲产在线观看| 欧美人成片免费看视频| 亚洲日韩成人av无码网站|