久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1626|回復: 0
打印 上一主題 下一主題
收起左側

C51單片機的AD PCF5819采集程序 帶Proteus仿真和代碼

[復制鏈接]
跳轉到指定樓層
樓主
分享一下做基于C51的AD數據采集用的PCF5819 有實驗文檔 還有仿真以及代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

將AD轉換后,轉成電壓量(保留2位小數),顯示于數碼管,并發送到PC機的串口調試助手上。
二、 儀器用具及材料
Keil、Proteus 8 Professional、串口助手、串口模擬器。
三、 實驗內容及原理
1.  電路分析
本次使用的數碼元器件有八位共陽數碼管,串口,PCF8591以及單片機STC15W4K32S4。
(具體電路圖見附件一)
2.  軟件編程
(1)  數碼管
因為實驗涉及小數所以本次顯示數碼的碼字有兩種,一種是不帶小數點的,一種是帶小數點的。不帶小數點的 “code unsigned char segcode[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};”
帶小數點的“ code unsigned char segcode1[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7F};”
數碼管還涉及到三位數字的顯示,雖然是一個整數和兩個小數,但本質上可以用一個函數先將這個數直接變成三位數,然后將第一位的數字加上“.”顯示的效果就是保留兩位小數的數字。具體如下

int fenli(float e)  //分離函數 將AD轉換以后的小數變成三位整數
{
    int x,y,z;
    x=e*1000;
    z=e*100;
    y=x%10;
    if(y>=5)
    {
        z=z+1;
    }
    return z;
}
數碼管顯示小數函數如下:
void shumaguan(int x)   //數碼管顯示函數顯示被分離的數字
{
    int i,j,ge,shi,bai;
    bai=x/100%100%10;  
    shi=x/10%100%10;
    ge=x%1000%10;
    P0=segcode[10];  //清除所有位數
    P2=0xe0;
    P2=0;
    P0=0xFF;
    P2=0xc0;
    P2=0;
    P0=segcode1[bai];  // 顯示百位
    P2=0xe0;
    P2=0;
    P0=0x01;
    P2=0xc0;
    P2=0;
    for(i=0;i<1;i++)
  for(j=0;j<1;j++);
    P0=segcode[shi];  //顯示十位
    P2=0xe0;
    P2=0;
    P0=0x02;
    P2=0xc0;
    P2=0;
    P0=segcode[ge];  //顯示個位
    P2=0xe0;
    P2=0;
    P0=0x04;
    P2=0xc0;
    P2=0;
}
(2)  I2C的軟件編程
主要有以下幾個步驟1.啟動信號;2停止信號;3應答信號;4等待應答信號;5發送字節;6接收字節;
(3)  串口的編程
   本次串口的輸出需要用到文本格式所以需要在頭文件上加上stdio.h,另外還需要改寫char putchar(char c)底層函數這樣就可以用printf()函數通過串口來發送文本,代碼如下。
char putchar(char c)
{  ES=0;  //關閉串口中斷
   SBUF=c;
   while(!TI);   //等待發送完成
   TI=0;         //清除發送完成標志
   ES=1;  //開啟串口中斷
   return c;
}
(4)  PCF8591的串口通信代碼以及采集AD的IO口選擇。
本次實驗主要用到的是AIN0口并不允許模擬電壓輸出模擬輸入方式是4通道輸入,另外不自動增加通道號因此控制字節為0x00;具體代碼如下:
unsigned char PCF8591_Adc(void)
{
unsigned char temp;
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(0x00);
    IIC_WaitAck();

    IIC_Start();
   
IIC_SendByte(0x91);
    IIC_WaitAck();
    temp=IIC_RecByte();
    IIC_SendAck(1);
    IIC_Stop();
    return temp;
}
(5)  主函數的編程
流程圖如右圖。


代碼如下
int main()
{
int a,b;
  float c=255,e;
  int x,n=1;

  while(1)
  {
  while(n)
      {
      PCF8591_Adc();
      a=PCF8591_Adc();
      e=a/c*5;
      x=fenli(e);
      UartInit();
      printf("%.2fV\n",e);
      shumaguan(x);

          n=0;
      }
      PCF8591_Adc();
      b=PCF8591_Adc();   
      if(b!=a)
      {
          n=1;
      }
  }
}      
總的代碼見附件二。
四、 實驗過程與數據記錄
1.   將原理圖中的滑動變阻器調成100%啟動proteus模擬軟件,串口輸出5.00V如下圖


數碼管顯示如下圖

將滑動變阻器下調到99%串口輸出如下圖

數碼管顯示如下

將滑動變阻器改成50%串口顯示如下

數碼管顯示如下圖


9、總結
這次實驗涉及的內容較多有數碼管的顯示串口以及I2C的通信等,算是個不大不小的項目,這次實驗也是我鞏固了之前所學C語言的知識,也對串口通信以及I2C的通信有了一個新的了解和認知,希望在今后的學習中能挑戰更多更有趣的實驗。

下載: 仿真和文檔.7z (191.53 KB, 下載次數: 10)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜在线观看 | 亚洲午夜精品视频 | www日本高清| 亚洲综合视频 | 国产日本精品视频 | 在线免费观看视频你懂的 | 成人一区二区视频 | 成人在线中文 | 九九热精品视频在线观看 | 成人在线中文字幕 | 精品成人佐山爱一区二区 | 欧美日韩一区二区在线 | 国内av在线| 免费在线色 | 中文字幕免费观看 | 91新视频 | 国产免费一区二区 | 欧美日韩亚洲一区 | 在线播放国产一区二区三区 | 中文久久 | 黄色中文字幕 | 一级片免费视频 | 亚洲国产精品99久久久久久久久 | 国产精品一区二区电影 | 亚洲精品99999 | 人干人人| 欧美福利视频 | 99精品视频在线观看 | 中文字幕国产 | 国产高清免费视频 | 中文字字幕一区二区三区四区五区 | 一区日韩 | 欧产日产国产精品99 | 国产欧美一区二区三区免费 | 天堂精品视频 | 亚洲欧洲小视频 | 亚洲精品乱码8久久久久久日本 | 亚洲精品乱码久久久久久蜜桃91 | 久久av网 | 国产高清一区二区 | 天天插天天舔 |