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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

分享一個 PCF8591 AD轉換文件

[復制鏈接]
跳轉到指定樓層
樓主
ID:344053 發表于 2018-6-18 13:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用12864顯示,AD芯片采用IIC通訊方式,需要用多路時要做小許修改。
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. //P0口為12864數據輸出口
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define Delay4us(){_nop_();_nop_();_nop_();_nop_();}

  7. sbit LCD_RS=P2^6;
  8. sbit LCD_RW=P2^5;
  9. sbit LCD_EN=P2^7;

  10. sbit PM=P1^0;
  11. sbit SCL=P1^1; //I2C時鐘引腳
  12. sbit SDA=P1^2;//I2C數據輸入輸出引腳

  13. uchar Recv_Buffer[4];//數據接收緩沖
  14. uint Voltage[]={'0','0','0'};//數據分解為電壓x.xx
  15. bit bdata IIC_ERROR; //I2C錯誤標志位
  16. uchar LCD_Line_1[]={"1- .  V  2- .  V"};
  17. uchar LCD_Line_2[]={"3- .  V  4- .  V"};

  18. //延時
  19. void delay(int ms)
  20. {
  21.         uchar i;
  22.         while(ms--) for(i=0;i<250;i++) Delay4us();
  23. }

  24. //LCD忙檢測
  25. bit LCD_Busy_Check()
  26. {
  27.         bit Result;
  28.         LCD_RS=0;LCD_RW=1;
  29.         LCD_EN=1;Delay4us();Result=(bit)(P0&0x80);
  30.         LCD_EN=0;
  31.         return Result;
  32. }

  33. //寫指令
  34. void LCD_Write_Command(uchar cmd)
  35. {
  36.         while(LCD_Busy_Check());
  37.         LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();
  38.         P0=cmd;Delay4us();
  39.         LCD_EN=1;Delay4us();LCD_EN=0;
  40. }

  41. // 寫數據
  42. void LCD_Write_Data(uchar dat)
  43. {
  44.         while(LCD_Busy_Check());
  45.         LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;Delay4us();
  46.         LCD_EN=1;Delay4us();LCD_EN=0;
  47. }

  48. //初始化
  49. void LCD_Initialise()
  50. {
  51.         LCD_Write_Command(0x38);delay(5);
  52.         LCD_Write_Command(0x0c);delay(5);
  53.         LCD_Write_Command(0x06);delay(5);
  54.         LCD_Write_Command(0x01);delay(5);
  55. }
  56. //設置顯示位置
  57. void LCD_Set_Position(uchar pos)
  58. {
  59.         //LCD_Write_Command(pos|0x80);
  60.         LCD_Write_Command(pos);
  61. }

  62. //顯示一行
  63. void LCD_Display_A_Line(uchar Line_Addr,uchar s[])
  64. {
  65.         uchar i;
  66.         LCD_Set_Position(Line_Addr);
  67.         for(i=0;i<16;i++)LCD_Write_Data(s[i]);
  68. }

  69. // 將模數轉換后得到的值分解存入緩存
  70. void Convert_To_Voltage(uchar val)
  71. {
  72.         uchar Tmp; //最大值為255,對應5V,255/5=51
  73.         Voltage[2]=val/51+'0';//整數部分
  74.         Tmp=val%51*10;// 第一位小數
  75.         Voltage[1]=Tmp/51+'0';
  76.         Tmp=Tmp%51*10;
  77.         Voltage[0]=Tmp/51+'0';
  78. }

  79. //啟動I2C總線
  80. void IIC_Start()
  81. {
  82.         SDA=1;
  83.         SCL=1;
  84.         Delay4us();
  85.         SDA=0;
  86.         Delay4us();
  87.         SCL=0;
  88. }

  89. //停止I2C總線
  90. void IIC_Stop()
  91. {
  92.         SDA=0;
  93.         SCL=1;
  94.         Delay4us();
  95.         SDA=1;
  96.         Delay4us();
  97.         SCL=0;
  98. }

  99. // 從機發送應答位
  100. void Slave_ACK()
  101. {
  102.         SDA=0;
  103.         SCL=1;
  104.         Delay4us();
  105.         SCL=0;
  106.         SDA=1;
  107. }

  108. // 從機發送非應答位
  109. void Slave_NOACK()
  110. {
  111.         SDA=1;
  112.         SCL=1;
  113.         Delay4us();
  114.         SCL=0;
  115.         SDA=0;
  116. }

  117. //發送一字節
  118. void IIC_SendByte(uchar wd)
  119. {
  120.         uchar i;
  121.         for(i=0;i<8;i++) //循環移入8位
  122.         {
  123.                 SDA=(bit)(wd&0x80);_nop_();_nop_();
  124.                 SCL=1;Delay4us();SCL=0;wd<<=1;
  125.         }
  126.         Delay4us();
  127.         SDA=1; //釋放總線并準備讀取應答
  128.         SCL=1;
  129.         Delay4us();
  130.         IIC_ERROR=SDA;//IIC_ERROR=1表示無應答
  131.         SCL=0;
  132.         Delay4us();
  133. }

  134. //接收一字節
  135. uchar IIC_ReceiveByte()
  136. {
  137.         uchar i,rd=0x00;
  138.         for(i=0;i<8;i++)
  139.         {
  140.                 SCL=1;
  141.                 rd<<=1;
  142.                 rd|=SDA;
  143.                 Delay4us();
  144.                 SCL=0;
  145.                 Delay4us();
  146.         }
  147.         SCL=0;
  148.         Delay4us();
  149.         return rd;
  150. }

  151. //連續讀入4路通道的A/D轉換結果并保存到Recv_Buffer
  152. void ADC_PCF8591(uchar CtrlByte)
  153. {
  154.         uchar i;
  155.         IIC_Start();
  156.         //PCF8591地址定義1001****,高四位固定1001
  157.         //第3,2,1位對應A2,A1,A0第0位為讀寫標志位,1為讀0為寫
  158.         //下面代碼中0x90,0x91分別為10010000,10010001
  159.         
  160.         IIC_SendByte(0x90);// 發送寫地址
  161.         if(IIC_ERROR==1)return;
  162.         // IIC_SendByte(CtrlByte);//發送控制字節
  163.         //if(IIC_ERROR==1)return;
  164.         //屏蔽上面兩行會產生警告
  165.         IIC_Start();//重新發送開始命令
  166.         IIC_SendByte(0x91);// 發送讀地址
  167.         if(IIC_ERROR==1)return;
  168.         IIC_ReceiveByte();//空讀一次,調整讀順序
  169.         Slave_ACK(); //收到一字節后發送一個應答位
  170.         /*------------------------------
  171.         個人認為下面句子有問題,但是不知道怎么改,如果把
  172.         Recv_Buffer[i++]=IIC_ReceiveByte();中的++去掉,整個四組都是一個結果
  173.         但是加上好像有些重復,并且13組相同,還是不很好啊
  174.         */
  175.         for(i=0;i<4;i++)
  176.         {
  177.                 Recv_Buffer[i++]=IIC_ReceiveByte();
  178.                 Slave_ACK();//收到一個字節后發送一個應答位
  179.         }
  180.         Slave_NOACK();
  181.         IIC_Stop();//收到一個字節后發送一個非應答位
  182. }

  183. // 向 PCF8591發送1字節進行AD轉換
  184. void DAC_PCF8591(uchar CtrlByte,uchar dat)
  185. {
  186.         IIC_Start();
  187.         Delay4us();//啟動I2C
  188.         IIC_SendByte(0x90); //發送地址字節
  189.         if(IIC_ERROR==1)return;
  190.         IIC_SendByte(CtrlByte); //發送控制字節
  191.         if(IIC_ERROR==1)return;
  192.         IIC_SendByte(dat);//發送待轉換為模擬量的數值
  193.         
  194.         if(IIC_ERROR==1)return;
  195.         IIC_Stop();
  196.         Delay4us();
  197.         Delay4us();
  198. }

  199. void timer0init()
  200. {
  201.         PM=0;//傳感器的輸入信號
  202.         TMOD=0x11;//設置定時器0為工作方式1
  203.         TH0=(65536-40)/256;
  204.         TL0=(65536-40)%256;
  205.         ET0=1;//開定時器0中斷
  206.         TR0=1;//啟動定時器0
  207.         EA=0; //開總中斷
  208. }
  209. //主程序
  210. /*
  211. PCF8591控制字節定義:0***0***,第3,7位固定為0
  212. 第6位取0時為模擬輸入,取1時為模擬輸出
  213. 第4,5位為00表示4路單端的模擬輸入
  214. 第二位為自動遞增標志,取1時自動遞增
  215. 第0,1位取值為00,01,10,11分別表示通道0,1,2,3
  216. 調用ADC_PCF8591時參數為00000100,即0x04
  217. 調用DAC_PCF8591時參數為01000000,即0x40
  218. */

  219. void main()
  220. {
  221.         LCD_Initialise();
  222.         timer0init();
  223.         while(1)
  224.         {
  225.                 ADC_PCF8591(0x04);
  226.                 Convert_To_Voltage(Recv_Buffer[0]);
  227.                 LCD_Line_1[2]=Voltage[2];
  228.                 LCD_Line_1[4]=Voltage[1];
  229.                 LCD_Line_1[5]=Voltage[0];
  230.                 Convert_To_Voltage(Recv_Buffer[1]);
  231.                 LCD_Line_1[11]=Voltage[2];
  232.                 LCD_Line_1[13]=Voltage[1];
  233.                 LCD_Line_1[14]=Voltage[0];
  234.                 Convert_To_Voltage(Recv_Buffer[2]);
  235.                 LCD_Line_2[2]=Voltage[2];
  236.                 LCD_Line_2[4]=Voltage[1];
  237.                 LCD_Line_2[5]=Voltage[0];
  238.                 Convert_To_Voltage(Recv_Buffer[3]);
  239.                 LCD_Line_2[11]=Voltage[2];
  240.                 LCD_Line_2[13]=Voltage[1];
  241.                 LCD_Line_2[14]=Voltage[0];
  242.                 // 液晶兩行顯示四個通道的轉換結果
  243.                 LCD_Display_A_Line(0x80, LCD_Line_1);
  244.                 LCD_Display_A_Line(0x90, LCD_Line_2);
  245.                 // 將0通道模擬轉換后的數值重新轉換為模擬量并從Aout輸出
  246.                
  247.                 //通過LED亮度表現出來
  248. //                DAC_PCF8591(0x40,Recv_Buffer[0]);
  249.         }
  250. }

  251. void timer0() interrupt 1
  252. {
  253.    int N;
  254.    TH0=(65536-40)/256;  
  255.    TL0=(65536-40)%256;
  256.    N++;  
  257.    //if(N==7)
  258.    //PM=1;  
  259.    if(N==8)
  260.    PM=0;
  261.    if(N>=250)
  262.    {  
  263.       PM=1;
  264.       N=0;
  265.      }
  266. }


復制代碼


pcf8591.zip

2.4 KB, 下載次數: 12, 下載積分: 黑幣 -5

主要文件,工程需自建

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区在线观看 | 国产精品久久久久久一区二区三区 | 蜜桃精品噜噜噜成人av | 久久蜜桃av一区二区天堂 | 久久国产精品偷 | 亚洲精品一区二区三区蜜桃久 | 草在线| 国产精品99久久久久久久久 | 国产精品久久亚洲 | 蜜桃av人人夜夜澡人人爽 | 久久高清 | 成人国产精品免费观看 | 久久国产婷婷国产香蕉 | 国产福利在线免费观看 | 超碰97人人人人人蜜桃 | 日韩资源 | 亚洲免费视频网站 | 欧美国产视频 | 亚洲精品大全 | 国产精品a久久久久 | av一区在线观看 | 中文字幕第十五页 | 一区二区三区欧美大片 | 久久久国产一区二区三区 | 国产av毛片 | 婷婷五月色综合 | 日韩二区三区 | 国产精品99 | 国产一区二区在线播放 | 精品一区二区三区不卡 | 久久精品成人 | 色婷婷综合网 | 欧美一区二区三区 | 麻豆精品一区二区三区在线观看 | 在线国产一区二区 | 亚洲高清三级 | 亚洲视频在线免费观看 | 黄网站涩免费蜜桃网站 | 国产欧美日韩视频 | 九九亚洲精品 | 午夜精品网站 |