国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
單片機(jī)C語(yǔ)言學(xué)習(xí)
單片機(jī)C語(yǔ)言學(xué)習(xí)
來(lái)源:電子工程師筆記 

單片機(jī)C語(yǔ)言


                預(yù)處理
一》宏定義:

1、不帶參數(shù):
#define 標(biāo)識(shí)符 常量表達(dá)式
    /*#define是宏定義命令,宏名(標(biāo)識(shí)符)好習(xí)慣用大寫(xiě)*/
#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í)希望對(duì)其中一部分內(nèi)容只在滿(mǎn)足一定條件下才進(jìn)行編譯,也就是對(duì)一部分內(nèi)容指定編譯的條件。*/

#if、#elif、 #else、#endif、#ifdef、#ifndef
    /*選擇不同的編譯范圍,產(chǎn)生不同的代碼,提供通用性。*/
    /*如對(duì)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語(yǔ)言之二_____________________________________________________________________________________
一》數(shù)據(jù)類(lèi)型:
        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利用他可訪(fǎng)問(wèn)51單片機(jī)的內(nèi)部RAM中的可尋址位或特殊功能寄存器中的可尋址位
sfr P0=0x80;
sbit P0_1=P0^1;
    /*將P0口的口地址定義為80H,將P0.1位定義為P1_1*/

二》數(shù)據(jù)存貯類(lèi)型
                  表1. C51數(shù)據(jù)存貯類(lèi)型
━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━
數(shù)據(jù)存貯類(lèi)型 ┃        與存貯空間的對(duì)應(yīng)關(guān)系                
━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━
     data     ┃  直接尋址片內(nèi)數(shù)據(jù)存貯區(qū),訪(fǎng)速度快                 
     bdata    ┃  可位尋址片內(nèi)數(shù)據(jù)存貯區(qū),允許位與字節(jié)混合訪(fǎng)問(wèn)
     idata    ┃  間接尋址片內(nèi)數(shù)據(jù)存貯區(qū),可訪(fǎng)問(wèn)片內(nèi)全部RAM地址空間
     pdata    ┃  分頁(yè)尋址片外數(shù)據(jù)存貯區(qū)(256字節(jié))由MOVX @R0訪(fǎng)問(wèn)           
     xdata    ┃  片外數(shù)據(jù)存貯區(qū)(64K),由MOVX @DPTR訪(fǎng)問(wèn)
     code     ┃  代碼存貯區(qū)(64K),由MOVC @DPTR訪(fǎng)問(wèn)
━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━
變量的存貯類(lèi)型定義:
char data var
    /*字符變量var被定義為data存貯類(lèi)型,C51編譯器將把該變量定位在51單片機(jī)片內(nèi)數(shù)據(jù)區(qū)存貯區(qū)中*/
bit bdata flag
    /*位變量flag被定義為bdata存貯類(lèi)型,C51編譯器將把該變量定位在51單片機(jī)片內(nèi)數(shù)據(jù)區(qū)存貯區(qū)(RAM)中的位尋址區(qū):20H--2FH*/


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

typedef 已有數(shù)據(jù)類(lèi)型 新的數(shù)據(jù)類(lèi)型
typedef int word;
    /*將word定義為整型*/
word i,j;
    /*將i,j定義為整型*/

四》位運(yùn)算符:
        ━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━━━━┳━━━━━━
            ~   ┃    &     ┃     |    ┃    ^          ┃     <<     ┃    >>        
        ━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━━━━╋━━━━━━ 
        按位取反┃  按位與  ┃   按位或 ┃ 按位異或   ┃  左移      ┃     右移
        ━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━━━━┻━━━━━━

對(duì)移位:如<< ,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)制類(lèi)型轉(zhuǎn)換:(類(lèi)型)=表達(dá)式
(char *)0xb000

八》sizeof 取數(shù)據(jù)類(lèi)型、變量以及表達(dá)式的字節(jié)數(shù)的運(yùn)算符;

九》continue:中斷語(yǔ)句:結(jié)束本次循環(huán)。


單片機(jī)C語(yǔ)言之三_____________________________________________________________________________________
函數(shù):
一》中斷服務(wù)函數(shù)與寄存器組定義:

函數(shù)類(lèi)型 函數(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
對(duì)函數(shù)目標(biāo)代碼影響如下:
在函數(shù)入口處將當(dāng)前工作寄存器組保護(hù)到堆棧中;指定的工作寄存器內(nèi)容不會(huì)改變,函數(shù)返回前將被保護(hù)的工作寄存器組從堆棧中恢復(fù)!
例(定時(shí)1ms):

    #include <reg51.h>
    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語(yǔ)言之四_____________________________________________________________________________________
一、 局部變量與全局變量(外部變量):

1、 全局變量若不在開(kāi)頭定義則加extern
2、 全局變量會(huì)使代碼長(zhǎng),占用內(nèi)存多

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

內(nèi)部變量 靜態(tài)變量(static):static int a=5;始終存在,退出不消失,但不能訪(fǎng)問(wèn)。

寄存器變量(register):速度最快。通常只給編譯器一個(gè)建議,由編譯器根
據(jù)實(shí)際情況確定。(見(jiàn)下)

變量 全局變量(global):
外部變量
靜態(tài)變量(static):

寄存器變量例:
    #include<stdio.h>
    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ù)類(lèi)型 函數(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語(yǔ)言之五_____________________________________________________________________________________
        數(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)用的過(guò)程中參數(shù)傳遞方式采用的是地址傳遞。將實(shí)際參數(shù)數(shù)組首地址傳遞給被調(diào)函數(shù)中的形式參數(shù)數(shù)組,這樣一來(lái)兩個(gè)數(shù)組就占有同一段內(nèi)存單元。見(jiàn)下圖:

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ù)組類(lèi)型必須一致,如果類(lèi)型不一致將導(dǎo)致編譯出錯(cuò)。實(shí)參數(shù)組和型參數(shù)組的長(zhǎng)度可以一致可以不一致,編譯器對(duì)形參數(shù)組的長(zhǎng)度不做檢查,直只是將實(shí)參數(shù)組的首地址傳遞給行參數(shù)組。如果希望行參數(shù)組能得到實(shí)參數(shù)組的全部元素,則應(yīng)使兩個(gè)數(shù)組的長(zhǎng)度一致。定義型參數(shù)組時(shí)可以不指定長(zhǎng)度,只在數(shù)組名后面跟一個(gè)方括號(hào)[]。這時(shí)為了在被調(diào)函數(shù)中處理數(shù)組元素的需要,應(yīng)另外設(shè)置一個(gè)參數(shù)來(lái)傳遞數(shù)組元素的個(gè)數(shù)。
例:用數(shù)組作為函數(shù)的參數(shù),計(jì)算兩個(gè)不同長(zhǎng)度的數(shù)組中所有元素的平均值

    #include<stdio.h>

float average(array,n)
    int n;
    float array[ ];
{
    int I;
    float aver,sum=array[0];
    for(I=1;I<n;I++)
        sum=sum+array[I];
    aver=sum/n;
    return(aver);
}
main()
{
    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語(yǔ)言之六_____________________________________________________________________________________
        軟件法去干擾:
    工程上我們?cè)诓杉瘮?shù)據(jù)時(shí)一般要求精度達(dá)到5%%,大于這個(gè)值將認(rèn)為無(wú)效。我在實(shí)際應(yīng)用中采用8535對(duì)32路數(shù)據(jù)進(jìn)行采集(8535帶10位AD,帶看門(mén)狗),發(fā)現(xiàn)數(shù)據(jù)跳動(dòng)有時(shí)達(dá)7%%,這是由于各種干擾造成的。主要來(lái)自于隨機(jī)干擾,下面就各種干擾的方法給出簡(jiǎn)單的去除方法:

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

    2、隨機(jī)干擾:該點(diǎn)明顯高于或低于附近正常采樣值,故采取中值濾波法,即對(duì)被測(cè)信號(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語(yǔ)言之七_(dá)____________________________________________________________________________________
指針:可對(duì)內(nèi)存地址直接操作
    基于存貯器的指以貯器類(lèi)為參量,它在編譯時(shí)才被確定。因此為指針選擇存貯器的方法可以省掉,以這些指針的長(zhǎng)度可為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()中通過(guò)temp=*ADC和*ADCdata=temp;讀取A/D轉(zhuǎn)換結(jié)果并存到外部RAM中。

    #include<reg51.h>
    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; /*開(kāi)中斷*/
    *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)換*/
}

除了用指針變量來(lái)實(shí)現(xiàn)對(duì)內(nèi)存地址的直接操作外,c51編譯器還提供一組宏,該宏定義文件為:“absacc.h”,利用它可十分方便地實(shí)現(xiàn)對(duì)任何內(nèi)存空間的直接操作,改寫(xiě)上面的程序:
    #include<reg51.h>
    #include<absacc.h> /*包含絕對(duì)地址操作預(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; / *開(kāi)中斷*/
    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ì)算字符串的長(zhǎng)度
    #include<stdio.h>
main() {
    char *s=”abcdef”;
    int strlen(char *s);
    printf(“\n length of ‘%%s’=%%d\n”,s,strlen(s));
}

int strlen(char *s) {
    char *p=s;
    while(*p!=’\0’)p++;
    return(p-s);
}

結(jié)果為:length of ‘abcdef’=6

注:不允許指針之間進(jìn)行加,乘,除,移位,或屏蔽運(yùn)算,也不允許用float類(lèi)型數(shù)據(jù)與指針做加,減運(yùn)算!

抽象型指針:
ANSI新標(biāo)準(zhǔn)增加了一種“void * ”的指針類(lèi)型,這是一種抽象型指針,即可以定義一個(gè)指針變量,但不指定該指針是指向哪種類(lèi)型的數(shù)據(jù)的。在賦值時(shí)需進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換:
Char *p1;
Void *p2;
P1=(char*)p2;
抽象型指針可以用來(lái)在每個(gè)存儲(chǔ)區(qū)內(nèi)訪(fǎng)問(wèn)任意絕對(duì)地址或者用來(lái)產(chǎn)生絕對(duì)調(diào)用。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MSC-51單片機(jī)學(xué)習(xí)筆記之1
小結(jié)一下KeilC與IAR對(duì)函數(shù)參數(shù)及返回值的處理
【單片機(jī)C語(yǔ)言基礎(chǔ)入門(mén)】第三章:變量與數(shù)據(jù)類(lèi)型
變量 keil存儲(chǔ)器類(lèi)型
單片機(jī)C語(yǔ)言編程心得
面向51單片機(jī)的Keil uVision4基本數(shù)據(jù)類(lèi)型簡(jiǎn)介
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服