天堂草原最受欢迎的角色,天堂动漫,天堂在线,色天堂下载,天堂中文在线资源,亚洲男人天堂

技術熱線: 4007-888-234
設計開發

專注差異化嵌入式產品解決方案 給智能產品定制注入靈魂給予生命

開發工具

提供開發工具、應用測試 完善的開發代碼案例庫分享

技術支持

從全面的產品導入到強大技術支援服務 全程貼心伴隨服務,創造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產品競爭力

新聞中心

提供最新的單片機資訊,行業消息以及公司新聞動態

PIC16F877 單片機AD轉化的C源程序

更新時間: 2019-03-23
閱讀量:1769

十年專注單片機方案開發的方案公司英銳恩,分享PIC16F877 單片機A/D轉化的C的源程序。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。

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

       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總線方式送出數據

              }

       }

}

联系我们: 宁海县| 柘荣县| 四川省| 盐池县| 九龙县| 黔西| 永泰县| 蓝田县| 香河县| 威远县| 浏阳市| 宝山区| 化隆| 西林县| 临高县| 邵阳市| 五台县| 无为县| 准格尔旗| 宁津县| 朔州市| 股票| 巫山县| 宝坻区| 万山特区| 罗源县| 乌审旗| 修文县| 西城区| 化隆| 邵武市| 德惠市| 平果县| 灵台县| 怀柔区| 周口市| 伽师县| 天全县| 道真| 盘山县| 宕昌县|