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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C51單片機數字電壓表設計

[復制鏈接]
跳轉到指定樓層
樓主

  1. #include<reg52.h>   
  2. #include <intrins.h>

  3. #define  AddWr 0x90    //PCF8591 地址

  4. sbit scl=P2^0;       //I2C  時鐘
  5. sbit sda=P2^1;       //I2C  數據
  6. bit ack;             //應答標志位

  7. unsigned char date;
  8. sbit C1=P2^6;//數碼管1
  9. sbit C2=P2^7;//數碼管2
  10. sbit Dp=P2^5;//小數點
  11. table[10]=
  12. {0x3f,0x06,0x5B,0x4F,0x66,
  13. 0x6D,0x7D,0x07,0x7F,0x6F};//0~9
  14. unsigned int data dis[3]={0x00,0x00,0x00};
  15. unsigned int getData;
  16. /*******************************************************************
  17.                      起動總線函數               
  18. 函數原型: void  Start_I2c();  
  19. 功能:     啟動I2C總線,即發送I2C起始條件.  
  20. ********************************************************************/
  21. void Start_I2c()
  22. {
  23.   sda=1;         /*發送起始條件的數據信號*/
  24.   _nop_();
  25.   scl=1;
  26.   _nop_();        /*起始條件建立時間大于4.7us,延時*/
  27.   _nop_();
  28.   _nop_();
  29.   _nop_();
  30.   _nop_();   
  31.   sda=0;         /*發送起始信號*/
  32.   _nop_();        /* 起始條件鎖定時間大于4μs*/
  33.   _nop_();
  34.   _nop_();
  35.   _nop_();
  36.   _nop_();      
  37.   scl=0;       /*鉗住I2C總線,準備發送或接收數據 */
  38.   _nop_();
  39.   _nop_();
  40. }

  41. /*******************************************************************
  42.                       結束總線函數               
  43. 函數原型: void  Stop_I2c();  
  44. 功能:     結束I2C總線,即發送I2C結束條件.  
  45. ********************************************************************/
  46. void Stop_I2c()
  47. {
  48.   sda=0;      /*發送結束條件的數據信號*/
  49.   _nop_();       /*發送結束條件的時鐘信號*/
  50.   scl=1;      /*結束條件建立時間大于4μs*/
  51.   _nop_();
  52.   _nop_();
  53.   _nop_();
  54.   _nop_();
  55.   _nop_();
  56.   sda=1;      /*發送I2C總線結束信號*/
  57.   _nop_();
  58.   _nop_();
  59.   _nop_();
  60.   _nop_();
  61. }

  62. /*******************************************************************
  63.                  字節數據發送函數               
  64. 函數原型: void  I2C_SendByte(UCHAR c);
  65. 功能:     將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
  66.           此狀態位進行操作.(不應答或非應答都使ack=0)     
  67.            發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
  68. ********************************************************************/
  69. void  I2C_SendByte(unsigned char  c)
  70. {
  71. unsigned char  i;

  72. for(i=0;i<8;i++)  /*要傳送的數據長度為8位*/
  73.     {
  74.      if((c<<i)&0x80)sda=1;   /*判斷發送位*/
  75.        else  sda=0;               
  76.      _nop_();
  77.      scl=1;               /*置時鐘線為高,通知被控器開始接收數據位*/
  78.       _nop_();
  79.       _nop_();             /*保證時鐘高電平周期大于4μs*/
  80.       _nop_();
  81.       _nop_();
  82.       _nop_();         
  83.      scl=0;
  84.     }
  85.    
  86.     _nop_();
  87.     _nop_();
  88.     sda=1;                /*8位發送完后釋放數據線,準備接收應答位*/
  89.     _nop_();
  90.     _nop_();   
  91.     scl=1;
  92.     _nop_();
  93.     _nop_();
  94.     _nop_();
  95.     if(sda==1)ack=0;     
  96.        else ack=1;        /*判斷是否接收到應答信號*/
  97.     scl=0;
  98.     _nop_();
  99.     _nop_();
  100. }

  101. /*******************************************************************
  102.                  字節數據接收函數               
  103. 函數原型: UCHAR  I2C_RcvByte();
  104. 功能:        用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
  105.           發完后請用應答函數應答從機。  
  106. ********************************************************************/   
  107. unsigned char   I2C_RcvByte()
  108. {
  109.   unsigned char  retc=0,i;
  110.   sda=1;                     /*置數據線為輸入方式*/
  111.   for(i=0;i<8;i++)
  112.       {
  113.         _nop_();           
  114.         scl=0;                  /*置時鐘線為低,準備接收數據位*/
  115.         _nop_();
  116.         _nop_();                 /*時鐘低電平周期大于4.7μs*/
  117.         _nop_();
  118.         _nop_();
  119.         _nop_();
  120.         scl=1;                  /*置時鐘線為高使數據線上數據有效*/
  121.         _nop_();
  122.         _nop_();
  123.         retc=retc<<1;
  124.         if(sda==1)retc=retc+1;  /*讀數據位,接收的數據位放入retc中 */
  125.         _nop_();
  126.         _nop_();
  127.       }
  128.   scl=0;   
  129.   _nop_();
  130.   _nop_();
  131.   return(retc);
  132. }

  133. /********************************************************************
  134.                      應答子函數
  135. 函數原型:  void Ack_I2c(bit a);
  136. 功能:      主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
  137. ********************************************************************/
  138. void Ack_I2c(bit a)
  139. {  
  140.   if(a==0)sda=0;              /*在此發出應答或非應答信號 */
  141.   else sda=1;                                  /*0為發出應答,1為非應答信號 */
  142.   _nop_();
  143.   _nop_();
  144.   _nop_();      
  145.   scl=1;
  146.   _nop_();
  147.   _nop_();                    /*時鐘低電平周期大于4μs*/
  148.   _nop_();
  149.   _nop_();
  150.   _nop_();  
  151.   scl=0;                     /*清時鐘線,住I2C總線以便繼續接收*/
  152.   _nop_();
  153.   _nop_();   
  154. }

  155. /************************************************************
  156. * 函數名        : Pcf8591_DaConversion
  157. * 函數功能      : PCF8591的輸出端輸出模擬量
  158. * 輸入          : addr(器件地址),channel(轉換通道),value(轉換的數值)
  159. * 輸出                 : 無
  160. ******************* *****************************************/
  161. bit Pcf8591_DaConversion(unsigned char addr,unsigned char channel,  unsigned char Val)
  162. {
  163.    Start_I2c();              //啟動總線
  164.    I2C_SendByte(addr);            //發送器件地址
  165.    if(ack==0)return(0);
  166.    I2C_SendByte(0x40|channel);              //發送控制字節
  167.    if(ack==0)return(0);
  168.    I2C_SendByte(Val);            //發送DAC的數值  
  169.    if(ack==0)return(0);
  170.    Stop_I2c();               //結束總線
  171.    return(1);
  172. }

  173. /************************************************************
  174. * 函數名        : Pcf8591_SendByte
  175. * 函數功能                : 寫入一個控制命令
  176. * 輸入          : addr(器件地址),channel(轉換通道)
  177. * 輸出                 : 無
  178. ************************************************************/
  179. bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
  180. {
  181.    Start_I2c();              //啟動總線
  182.    I2C_SendByte(addr);            //發送器件地址
  183.    if(ack==0)return(0);
  184.    I2C_SendByte(0x40|channel);              //發送控制字節
  185.    if(ack==0)return(0);
  186.    Stop_I2c();               //結束總線
  187.    return(1);
  188. }

  189. /************************************************************
  190. * 函數名               : PCF8591_RcvByte
  191. * 函數功能           : 讀取一個轉換值
  192. * 輸入          :
  193. * 輸出          : dat
  194. ************************************************************/
  195. unsigned char PCF8591_RcvByte(unsigned char addr)
  196. {  
  197.    unsigned char dat;

  198.    Start_I2c();          //啟動總線
  199.    I2C_SendByte(addr+1);      //發送器件地址
  200.    if(ack==0)return(0);
  201.    dat=I2C_RcvByte();          //讀取數據0

  202.    Ack_I2c(1);           //發送非應答信號
  203.    Stop_I2c();           //結束總線
  204.    return(dat);
  205. }
  206. /*------------------------------------------------
  207.                  串口初始化函數
  208. ------------------------------------------------*/
  209. void init_com(void)
  210. {
  211. EA=1;        //開總中斷
  212. ES=1;        //允許串口中斷
  213. ET1=1;
  214. TMOD=0x22;   //定時器T1,在方式2中斷產生波特率
  215. PCON=0x00;   //SMOD=0
  216. SCON=0x50;   // 方式1 由定時器控制
  217. TH1=0xfd;    //波特率設置為9600
  218. TL1=0xfd;
  219. TR1=1;       //開定時器T1運行控制位


  220. }
  221. /*------------------------------------------------
  222.                   延時函數
  223. ------------------------------------------------*/
  224. void delay(unsigned char i)
  225. {
  226.   unsigned char j,k;
  227.   for(j=i;j>0;j--)
  228.     for(k=125;k>0;k--);
  229. }
  230. /*------------------------------------------------
  231. 把讀取值轉換成一個一個的字符,給串口顯示
  232. ------------------------------------------------*/
  233. void To_ascii(unsigned char num)
  234. {        
  235.          SBUF=num/100+'0';                              
  236.          delay(200);                  
  237.          SBUF=num/10%10+'0';                           
  238.          delay(200);        
  239.          SBUF=num%10+'0';
  240.          delay(200);
  241. }
  242. /*------------------------------------------------
  243.                     主函數
  244. ------------------------------------------------*/
  245. int main()
  246. {  
  247.         while(1)
  248.         {
  249.                  PCF8591_SendByte(AddWr,0);         //啟動轉換
  250.                  getData=PCF8591_RcvByte(AddWr);  //讀轉換完的數字信號
  251.                  dis[1]=getData/51;   //整數位
  252.                 dis[2]=getData%51;   //dis[2]位中間暫存數據位
  253.                 dis[2]=dis[2]*10;   
  254.                 dis[0]=dis[2]/51;    //計算輸出電壓的小數值        
  255.         C1=1;                                                
  256.         Dp=0;                //打開小數點
  257.         P0=table[dis[0]];    //顯示整數部分及小數點
  258.                              
  259.         C1=0;
  260.         delay(10);   
  261.                         
  262.         C2=1;                //打開第二位數碼管
  263.         Dp=1;                //關閉小數點
  264.         P0=table[dis[1]];     //顯示小數部分
  265.         C2=0;        
  266.         }
  267. }
  268. ————————————————
  269. 版權聲明:本文為CSDN博主「俊俊~」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
  270. 原文鏈接:https://blog.csdn.net/qq_40602000/article/details/84102765
復制代碼


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

使用道具 舉報

沙發
ID:522731 發表于 2019-10-16 17:12 | 只看該作者
量程為多少
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产一区二区三区 | 亚洲一区成人 | 精品一二三区 | 爱爱视频在线观看 | 久热精品免费 | 亚洲色欧美另类 | 欧美日韩在线视频一区 | 亚洲一区视频在线 | 久久久久久久久99 | 国产精品久久久久久久久久免费看 | 色婷婷激情 | 91在线看片 | 夜夜骚视频 | 亚洲狠狠爱一区二区三区 | 成年人在线观看 | 色婷婷精品久久二区二区蜜臂av | 国产 日韩 欧美 在线 | 中文字幕一区二区三区精彩视频 | 日本久久网 | 中文字幕国产精品 | 国产日韩欧美一区二区 | 亚洲精品成人在线 | 国产伦精品一区二区三区视频金莲 | 天天操网| 亚洲欧美日韩中文字幕一区二区三区 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美freesex黑人又粗又大 | 超碰国产在线 | 国产欧美精品一区二区三区 | 成人福利网站 | 日韩一区中文字幕 | 精品国产高清一区二区三区 | 欧美一区二区三区国产精品 | 欧美激情一区二区三区 | 欧美精品片 | 国产亚洲欧美在线视频 | 特黄av| 一区二区三区av夏目彩春 | 日韩免费 | 欧美黄色大片在线观看 | 久久久国产精品 |