• <menu id="ugcm4"><strong id="ugcm4"></strong></menu>
  • 技術熱線: 4007-888-234

    PIC單片機C語言編程實例二

    更新時間: 2019-01-05
    閱讀量:2009

    6.1 A/D轉換的應用
    例6.1 A/D轉換初始化程序
    //A/D轉換初始化子程序
    void adinitial( )
    {
    ADCON0 = 0x51; //選擇A/D通道為RA2,打開A/D轉換器
    //在工作狀態,且使AD轉換時鐘為8tosc
    ADCON1 = 0X80; //轉換結果右移,及ADRESH寄存器的高6位為”0”
    //且把RA2口設置為模擬量輸入方式
    PIE1 = 0X00;
    PIE2 = 0X00;
    ADIE = 1; //A/D轉換中斷允許
    PEIE = 1; //外圍中斷允許
    TRISA2=1; //設置RA2為輸入方式
    }

    6.1.2 程序清單
    下面給出一個調試通過的例程,可作為讀者編制程序的參考。該程序中用共用體的方式把A/D轉換的10位結果組合在一起。有關共用體的詳細資料請參考本書相關章節。

    include

    union adres
    {int y1;
    unsigned char adre[2];
    }adresult; //定義一個共用體,用于存放A/D轉換的結果
    unsigned char i;
    unsigned int j;
    //系統各I/O口初始化子程序
    void initial()
    {
    TRISD=0X00; //D口為輸出
    i=0x00;
    }
    //A/D轉化初始化子程序
    void adinitial()
    {
    ADCON0=0x51; //選擇A/D通道為RA2,打開A/D轉換器
    //在工作狀態,且使A/D轉換時鐘為8tosc
    ADCON1=0X80; //轉換結果右移,及ADRESH寄存器的高6位為”0”
    //且把RA2口設置為模擬量輸入方式
    PIE1=0X00;
    PIE2=0X00;
    ADIE=1; //A/D轉換中斷允許
    PEIE=1; //外圍中斷允許
    TRISA2=1; //設置RA2為輸入方式
    }
    //延時子程序
    void delay()
    {
    for(j=5535;—j;) continue;
    }
    //報警子程序
    void alarm()
    {
    i=i^0xFF; //通過異或方式每次把i的各位值取反
    PORTD=i; //D口輸出i的值
    }
    //中斷服務程序
    void interrupt adint(void)
    {
    ADIF=0; //清除中斷標志
    adresult.adre[0]=ADRESL;
    adresult.adre[1]=ADRESH; //讀取并存儲A/D轉換結果,A/D轉換的結果通過共
    //用體的形式放入了變量y1中
    if(adresult.y1>0x200)
    {
    alarm(); //如果輸入的模擬量大于2.5V(對應數字量
    //0X200h),則調用報警子程序
    delay(); //調用延時子程序,使電壓檢測不要過于頻繁
    }
    else PORTD=0XF0 ; //如果輸入的模擬量小于2.5V,則與D口相連的
    //8個發光二極管的低4個發亮,表示系統正常
    ADGO=1; //啟動下一次A/D轉換
    }
    //主程序
    main()
    {
    adinitial(); //A/D轉換初始化
    initial(); //系統各I/O口初始化
    ei(); //總中斷允許
    ADGO=1; //啟動A/D轉換
    while(1)
    {
    ;
    } //等待中斷,在中斷中循環檢測外部電壓
    }

    6.2.2 I2C總線工作方式相關子程序
    1.C語言編寫的I2C總線工作方式的初始化子程序
    //I2C初始化子程序
    void i2cint()
    {
    SSPCON = 0X08; //初始化SSPCON寄存器
    TRISC3 =1; //設置SCL為輸入口
    TRISC4 =1; //設置SDA為輸入口
    TRISA4 = 0;
    SSPSTAT=0X80; //初始化SSPSTAT寄存器
    SSPADD=0X02; //設定I2C時鐘頻率
    SSPCON2=0X00; //初始化SSPCON2寄存器
    di(); //關閉總中斷
    SSPIF=0; //清SSP中斷標志
    RA4=0; //關掉74HC165的移位時鐘使能,以免74HC165移位
    //數據輸出與I2C總線的數據線發生沖突(此操作與該
    //實驗板的特殊結構有關,不是通用的)
    SSPEN=1; //SSP模塊使能
    }

    2.C語言編寫的I2C總線工作方式傳輸數據子程序
    需要發送的數據在寄存器j中。
    //I2C總線輸出數據子程序
    i2cout()
    {
    SEN=1; //產生I2C啟動信號
    for(n=0x02;—n;) continue;//給予一定的延時,保證啟動
    do {
    RSEN=1; //產生I2C重啟動信號
    }while(SSPIF==0); //如果沒能啟動,則反復啟動,直到啟動為止
    SSPIF=0; //SSPIF標志清0
    SSPBUF=0X58; //I2C總線發送地址字節
    do {
    ;
    }while(SSPIF==0); //等待地址發送完畢
    SSPIF=0; //SSPIF標志清0
    SSPBUF=0X01; //I2C總線發送命令字節
    do {
    ;
    }while(SSPIF==0); //等待命令發送完畢
    SSPIF=0; //SSPIF標志清0
    SSPBUF=j; //I2C總線發送數據字節
    do {
    ;
    }while(SSPIF==0); //等待數據發送完畢
    SSPIF=0; //SSPIF標志清0
    PEN=1; //產生停止條件
    do {
    ;
    }while(SSPIF==0); //等待停止條件產生
    SSPIF=0; //SSPIF標志清0
    }
    6.2.4程序清單
    下面給一個例程。該程序利用MAX518進行D/A轉換,且從D/A0引腳輸出一個正弦波形??勺鳛樽x者編制程序的參考。特別注意,在調試該程序時,把模板上的鈕子開關S8拔向高電平,以免發生資源沖突。

    include

    //本程序將通過PIC16F877的I2C方式驅動D/A轉換器MAX518,使其D/A0通道輸出
    //一個連續的正弦波形(注:本程序并沒對正弦波的頻率進行控制)
    const char table[ ] = {0X80,0X86,0X8D, 0X93,0X99,0X9F,0XA5,0XAB,
    0XB1,0XB7,0XBC,0XC2,0XC7,0XCC,0XD1,0XD6,0XDA,0XDF,0XE3,0XE7,0XEA,0XEE,0XF1,0XF4,0XF6,0XF8,0XFA,0XFC,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFB,0XF9,0XF7,0XF5,0XF2,0XEF,0XEC,0XE9,0XE5,0XE1,0XDD,0XD8,0XD4,0XCF,0XCA,0XC5,0XBF,0XBA,0XB4,0XAE,0XA8,0XA2,0X9C,0X96,0X90,0X89,0X83,0X80,0X79,0X72,0X6C,0X66,0X60,0X5A,0X55,0X4E,0X48,0X43,0X3D,0X38,0X33,0X2E,0X29,0X25,0X20,0X1C,0X18,0X15,0X11,0X0E,0X0B,0X09,0X07,0X05,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X04,0X06,0X08,0X0A,0X0D,0X10,0X13,0X16,0X1A,0X1E,0X22,0X27,0X2B,0X30,0X35,0X3A,0X40,0X45,0X4C,0X51,0X57,0X5D,0X63,0X69,0X6F,0X76,0X7C};
    //以上的數組用于存放正弦表,在定義數組時,前面應該加上 const,
    //以使數組存放于ROM中,而不至于占用太多的RAM
    unsigned char i;
    unsigned char j;
    unsigned char n;
    //I2C初始化子程序
    void i2cint()
    {
    SSPCON = 0X08; //初始化SSPCON寄存器
    TRISC3 =1; //設置SCL為輸入口
    TRISC4 =1; //設置SDA為輸入口
    TRISA4 = 0;
    SSPSTAT=0X80; //初始化SSPSTAT寄存器
    SSPADD=0X02; //設定I2C時鐘頻率
    SSPCON2=0X00; //初始化SSPCON2寄存器
    di(); //關閉總中斷
    SSPIF=0; //清SSP中斷標志
    RA4=0; //關掉74HC165的移位時鐘使能,以免74HC165
    //移位數據輸出與I2C總線的數據線發生沖突
    SSPEN=1; //SSP模塊使能
    }
    //I2C總線輸出數據子程序
    void i2cout()
    {
    SEN=1; //產生I2C啟動信號
    for(n=0x02;—n;) continue;//給予一定的延時,保證啟動
    do {
    RSEN=1; //產生I2C啟動信號
    }while(SSPIF==0); //如果沒能啟動,則反復啟動,直到啟動為止
    SSPIF=0; //SSPIF標志清0
    SSPBUF=0X58; //I2C總線發送地址字節
    do {
    ;
    }while(SSPIF==0); //等待地址發送完畢
    SSPIF=0; //SSPIF標志清0
    SSPBUF=0X01; //I2C總線發送命令字節
    do {
    ;
    }while(SSPIF==0); //等待命令發送完畢
    SSPIF=0; //SSPIF標志清0
    SSPBUF=j; //I2C總線發送數據字節
    do {
    ;
    }while(SSPIF==0); //等待數據發送完畢
    SSPIF=0; //SSPIF標志清0
    PEN=1; //產生停止條件
    do {
    ;
    }while(SSPIF==0); //等待停止條件產生
    SSPIF=0; //SSPIF標志清0
    }
    //主程序
    main ()
    {
    i2cint(); //I2C初始化
    while(1){
    for(i=0x00;i<=127;++i)
    {
    j=table[i]; //從數組中得到需要傳輸的數據量
    i2cout(); //利用I2C總線方式送出數據
    }
    }
    }

    刺激欲乱狂亲伦
  • <menu id="ugcm4"><strong id="ugcm4"></strong></menu>