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

標(biāo)題: C51單片機(jī)數(shù)字電壓表設(shè)計 [打印本頁]

作者: Hellonmdkt    時間: 2019-10-11 16:57
標(biāo)題: C51單片機(jī)數(shù)字電壓表設(shè)計

  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  數(shù)據(jù)
  6. bit ack;             //應(yīng)答標(biāo)志位

  7. unsigned char date;
  8. sbit C1=P2^6;//數(shù)碼管1
  9. sbit C2=P2^7;//數(shù)碼管2
  10. sbit Dp=P2^5;//小數(shù)點(diǎn)
  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.                      起動總線函數(shù)               
  18. 函數(shù)原型: void  Start_I2c();  
  19. 功能:     啟動I2C總線,即發(fā)送I2C起始條件.  
  20. ********************************************************************/
  21. void Start_I2c()
  22. {
  23.   sda=1;         /*發(fā)送起始條件的數(shù)據(jù)信號*/
  24.   _nop_();
  25.   scl=1;
  26.   _nop_();        /*起始條件建立時間大于4.7us,延時*/
  27.   _nop_();
  28.   _nop_();
  29.   _nop_();
  30.   _nop_();   
  31.   sda=0;         /*發(fā)送起始信號*/
  32.   _nop_();        /* 起始條件鎖定時間大于4μs*/
  33.   _nop_();
  34.   _nop_();
  35.   _nop_();
  36.   _nop_();      
  37.   scl=0;       /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
  38.   _nop_();
  39.   _nop_();
  40. }

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

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

  72. for(i=0;i<8;i++)  /*要傳送的數(shù)據(jù)長度為8位*/
  73.     {
  74.      if((c<<i)&0x80)sda=1;   /*判斷發(fā)送位*/
  75.        else  sda=0;               
  76.      _nop_();
  77.      scl=1;               /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  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位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
  89.     _nop_();
  90.     _nop_();   
  91.     scl=1;
  92.     _nop_();
  93.     _nop_();
  94.     _nop_();
  95.     if(sda==1)ack=0;     
  96.        else ack=1;        /*判斷是否接收到應(yīng)答信號*/
  97.     scl=0;
  98.     _nop_();
  99.     _nop_();
  100. }

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

  133. /********************************************************************
  134.                      應(yīng)答子函數(shù)
  135. 函數(shù)原型:  void Ack_I2c(bit a);
  136. 功能:      主控器進(jìn)行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
  137. ********************************************************************/
  138. void Ack_I2c(bit a)
  139. {  
  140.   if(a==0)sda=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
  141.   else sda=1;                                  /*0為發(fā)出應(yīng)答,1為非應(yīng)答信號 */
  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總線以便繼續(xù)接收*/
  152.   _nop_();
  153.   _nop_();   
  154. }

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

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

  189. /************************************************************
  190. * 函數(shù)名               : PCF8591_RcvByte
  191. * 函數(shù)功能           : 讀取一個轉(zhuǎn)換值
  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);      //發(fā)送器件地址
  200.    if(ack==0)return(0);
  201.    dat=I2C_RcvByte();          //讀取數(shù)據(jù)0

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


  220. }
  221. /*------------------------------------------------
  222.                   延時函數(shù)
  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. 把讀取值轉(zhuǎn)換成一個一個的字符,給串口顯示
  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.                     主函數(shù)
  244. ------------------------------------------------*/
  245. int main()
  246. {  
  247.         while(1)
  248.         {
  249.                  PCF8591_SendByte(AddWr,0);         //啟動轉(zhuǎn)換
  250.                  getData=PCF8591_RcvByte(AddWr);  //讀轉(zhuǎn)換完的數(shù)字信號
  251.                  dis[1]=getData/51;   //整數(shù)位
  252.                 dis[2]=getData%51;   //dis[2]位中間暫存數(shù)據(jù)位
  253.                 dis[2]=dis[2]*10;   
  254.                 dis[0]=dis[2]/51;    //計算輸出電壓的小數(shù)值        
  255.         C1=1;                                                
  256.         Dp=0;                //打開小數(shù)點(diǎn)
  257.         P0=table[dis[0]];    //顯示整數(shù)部分及小數(shù)點(diǎn)
  258.                              
  259.         C1=0;
  260.         delay(10);   
  261.                         
  262.         C2=1;                //打開第二位數(shù)碼管
  263.         Dp=1;                //關(guān)閉小數(shù)點(diǎn)
  264.         P0=table[dis[1]];     //顯示小數(shù)部分
  265.         C2=0;        
  266.         }
  267. }
  268. ————————————————
  269. 版權(quán)聲明:本文為CSDN博主「俊俊~」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
  270. 原文鏈接:https://blog.csdn.net/qq_40602000/article/details/84102765
復(fù)制代碼



作者: huangjiawei123    時間: 2019-10-16 17:12
量程為多少




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品久久久久久 | 美女在线国产 | 91精品国产综合久久久久蜜臀 | 久久久久久久亚洲精品 | 精品国产不卡一区二区三区 | 国产免费一区 | 91视频播放 | 中文字幕一区在线观看视频 | 亚洲综合五月天婷婷 | 久久亚洲国产精品 | 国产免费麻豆视频 | 久久最新| 欧美一区二区三区四区视频 | 久久国产精品免费一区二区三区 | 成人免费黄色片 | 成人在线视频免费看 | 波多野结衣中文字幕一区二区三区 | 日日骚网 | 亚洲国产成人精品久久久国产成人一区 | 欧美视频在线播放 | 日韩和的一区二在线 | 欧美在线视频二区 | 国产精品一区在线观看 | 国产精品不卡一区 | 亚洲精品视频在线播放 | 中文字幕亚洲一区二区三区 | 亚洲三区在线播放 | 亚洲精品第一国产综合野 | 亚洲一区二区三区四区五区中文 | 国产精品永久免费 | 天天精品在线 | 国产精久久久久久久 | 日韩欧美在线观看视频 | 国产乱码精品一区二区三区中文 | 亚洲精品v日韩精品 | 国产精品国产三级国产aⅴ中文 | 羞羞色网站 | 在线看一区二区 | 亚洲www | 91视视频在线观看入口直接观看 | 精品国产免费人成在线观看 |