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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

PCF8591數字電壓表試驗-Proteus仿真51單片機開發板平臺

[復制鏈接]
跳轉到指定樓層
樓主
ID:223055 發表于 2017-8-2 02:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己做的一個仿真的單片機開發板,有完整的試驗步驟和仿真工程文件提供.
板子上帶擴展ROM空間(i^2c 24c02)、adc(PCF8591芯片數字電壓表)、dac(信號發生器)、矩形按鍵(計算器),四個任務通過獨立按鍵進行切換

下面是數字電壓表部分的的單片機源程序
完整代碼和仿真工程文件請下載http://www.zg4o1577.cn/bbs/dpj-91558-1.html
單片機PCF8591驅動(1602液晶顯示)部分源程序預覽:
  1. #include<reg52.h>    //包含單片機寄存器的頭文件
  2. #include <intrins.h>
  3. #define ulong unsigned long
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define LCD1602_PORT P0                  //用LED1602_PORT表示P2總線接口
  7. #define  PCF8591 0x90    //PCF8591 地址
  8. #define  NOP()   _nop_()   /* 定義空指令 */
  9. #define  _Nop()  _nop_()   /*定義空指令*/

  10. // 位定義
  11. sbit SCL=P2^1;       //I2C  時鐘
  12. sbit SDA=P2^0;       //I2C  數據
  13. sbit LCD1602_RS = P2^6;          //定義1602液晶顯示屏的數據/命令選擇端,數據/命令(H/L)
  14. sbit LCD1602_RW = P2^5;          //定義1602液晶顯示屏的讀/寫選擇端,讀/寫(H/L)
  15. sbit LCD1602_EN = P2^7;          //定義1602液晶顯示屏的使能端
  16. bit ack;                 /*應答標志位*/
  17. sbit key=P3^3;

  18. // 變量定義
  19. uchar AD_CHANNEL;
  20. ulong xdata  LedOut[8];          //單片機內部存取器
  21. ulong  v,a,ss;
  22. uchar date;

  23. // 函數申明
  24. extern bit ack;                //起動總線函數
  25. extern void Start_I2c();        //結束總線函數  
  26. extern void Stop_I2c();                //應答子函數
  27. extern void Ack_I2c(bit a);                //字節數據發送函數
  28. extern void  SendByte(uchar  c);        //有子地址發送多字節數據函數               
  29. extern bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) ;        //無子地址發送多字節數據函數   
  30. extern bit ISendStrExt(uchar sla,uchar *s,uchar no);        //無子地址讀字節數據函數               
  31. extern uchar RcvByte();

  32. void LCD1602_delay_ms(uint n);
  33. void LCD1602_write_com(uchar com);
  34. void LCD1602_write_data(ulong dat);
  35. void LCD1602_write_word(uchar *s);
  36. void Init_LCD1602();

  37. bit ISendByte(uchar sla,uchar c);
  38. uchar IRcvByte(uchar sla);

  39. //MS延時函數(12M晶振下測試)
  40. void delay_ms(uint n)        
  41. {
  42.         unsigned int  i,j;
  43.         for(i=0;i<n;i++)
  44.                 for(j=0;j<123;j++);
  45. }

  46. //寫指令
  47. void LCD1602_write_com(uchar com)
  48. {
  49.         LCD1602_RS = 0;                 //1602液晶顯示屏的數據/命令選擇端置0,數據/命令(H/L),此時選擇寫命令操作
  50.         delay_ms(1);
  51.         LCD1602_EN = 1;                 //使能,也就是打開液晶接收數據命令的通道
  52.         LCD1602_PORT = com;         //把命令送給P2口
  53.         delay_ms(1);
  54.         LCD1602_EN = 0;
  55. }

  56. //寫數據
  57. void LCD1602_write_data(ulong dat)
  58. {
  59.         LCD1602_RS = 1;                 //1602液晶顯示屏的數據/命令選擇端置0,數據/命令(H/L),此時選擇寫數據操作
  60.         delay_ms(1);        
  61.         LCD1602_PORT = dat;         //把數據送給P2口
  62.         LCD1602_EN = 1;
  63.         delay_ms(1);
  64.         LCD1602_EN = 0;
  65. }

  66. //連續寫字符
  67. void LCD1602_write_word(uchar *s)
  68. {
  69.         while(*s>0)
  70.         {
  71.                 LCD1602_write_data(*s);
  72.                 s++;
  73.         }
  74. }

  75. //1602初始化函數
  76. void Init_LCD1602()                                       
  77. {
  78.         LCD1602_EN = 0;
  79.         LCD1602_RW = 0;                                                //設置為寫狀態
  80.         LCD1602_write_com(0x38);                        //顯示模式設定
  81.         LCD1602_write_com(0x0c);                        //開關顯示、光標有無設置、光標閃爍設置
  82.         LCD1602_write_com(0x06);                        //寫一個字符后指針加一
  83.         LCD1602_write_com(0x01);                        //清屏指令
  84. }
  85. /*******************************************************************
  86.                      起動總線函數               
  87. 函數原型: void  Start_I2c();  
  88. 功能:     啟動I2C總線,即發送I2C起始條件.  
  89. ********************************************************************/
  90. void Start_I2c()
  91. {
  92.   SDA=1;         /*發送起始條件的數據信號*/
  93.   _Nop();
  94.   SCL=1;
  95.   _Nop();        /*起始條件建立時間大于4.7us,延時*/
  96.   _Nop();
  97.   _Nop();
  98.   _Nop();
  99.   _Nop();   
  100.   SDA=0;         /*發送起始信號*/
  101.   _Nop();        /* 起始條件鎖定時間大于4μs*/
  102.   _Nop();
  103.   _Nop();
  104.   _Nop();
  105.   _Nop();      
  106.   SCL=0;       /*鉗住I2C總線,準備發送或接收數據 */
  107.   _Nop();
  108.   _Nop();
  109. }

  110. /*******************************************************************
  111.                       結束總線函數               
  112. 函數原型: void  Stop_I2c();  
  113. 功能:     結束I2C總線,即發送I2C結束條件.  
  114. ********************************************************************/
  115. void Stop_I2c()
  116. {
  117.   SDA=0;      /*發送結束條件的數據信號*/
  118.   _Nop();       /*發送結束條件的時鐘信號*/
  119.   SCL=1;      /*結束條件建立時間大于4μs*/
  120.   _Nop();
  121.   _Nop();
  122.   _Nop();
  123.   _Nop();
  124.   _Nop();
  125.   SDA=1;      /*發送I2C總線結束信號*/
  126.   _Nop();
  127.   _Nop();
  128.   _Nop();
  129.   _Nop();
  130. }

  131. /*******************************************************************
  132.                  字節數據發送函數               
  133. 函數原型: void  SendByte(UCHAR c);
  134. 功能:     將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
  135.           此狀態位進行操作.(不應答或非應答都使ack=0)     
  136.            發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
  137. ********************************************************************/
  138. void  SendByte(uchar  c)
  139. {
  140. uchar  BitCnt;

  141. for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數據長度為8位*/
  142.     {
  143.      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發送位*/
  144.        else  SDA=0;               
  145.      _Nop();
  146.      SCL=1;               /*置時鐘線為高,通知被控器開始接收數據位*/
  147.       _Nop();
  148.       _Nop();             /*保證時鐘高電平周期大于4μs*/
  149.       _Nop();
  150.       _Nop();
  151.       _Nop();         
  152.      SCL=0;
  153.     }
  154.    
  155.     _Nop();
  156.     _Nop();
  157.     SDA=1;                /*8位發送完后釋放數據線,準備接收應答位*/
  158.     _Nop();
  159.     _Nop();   
  160.     SCL=1;
  161.     _Nop();
  162.     _Nop();
  163.     _Nop();
  164.     if(SDA==1)ack=0;     
  165.        else ack=1;        /*判斷是否接收到應答信號*/
  166.     SCL=0;
  167.     _Nop();
  168.     _Nop();
  169. }

  170. /*******************************************************************
  171.                  字節數據接收函數               
  172. 函數原型: UCHAR  RcvByte();
  173. 功能:        用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
  174.           發完后請用應答函數應答從機。  
  175. ********************************************************************/   
  176. uchar   RcvByte()
  177. {
  178.   uchar  retc;
  179.   uchar  BitCnt;
  180.   
  181.   retc=0;
  182.   SDA=1;                     /*置數據線為輸入方式*/
  183.   for(BitCnt=0;BitCnt<8;BitCnt++)
  184.       {
  185.         _Nop();           
  186.         SCL=0;                  /*置時鐘線為低,準備接收數據位*/
  187.         _Nop();
  188.         _Nop();                 /*時鐘低電平周期大于4.7μs*/
  189.         _Nop();
  190.         _Nop();
  191.         _Nop();
  192.         SCL=1;                  /*置時鐘線為高使數據線上數據有效*/
  193.         _Nop();
  194.         _Nop();
  195.         retc=retc<<1;
  196.         if(SDA==1)retc=retc+1;  /*讀數據位,接收的數據位放入retc中 */
  197.         _Nop();
  198.         _Nop();
  199.       }
  200.   SCL=0;   
  201.   _Nop();
  202.   _Nop();
  203.   return(retc);
  204. }

  205. /********************************************************************
  206.                      應答子函數
  207. 函數原型:  void Ack_I2c(bit a);
  208. 功能:      主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
  209. ********************************************************************/
  210. void Ack_I2c(bit a)
  211. {
  212.   if(a==0)SDA=0;              /*在此發出應答或非應答信號 */
  213.   else SDA=1;
  214.   _Nop();
  215.   _Nop();
  216.   _Nop();      
  217.   SCL=1;
  218.   _Nop();
  219.   _Nop();                    /*時鐘低電平周期大于4μs*/
  220.   _Nop();
  221.   _Nop();
  222.   _Nop();  
  223.   SCL=0;                     /*清時鐘線,鉗住I2C總線以便繼續接收*/
  224.   _Nop();
  225.   _Nop();   
  226. }


  227. /*******************************************************************
  228. ADC發送字節[命令]數據函數               
  229. *******************************************************************/
  230. bit ISendByte(uchar sla,uchar c)
  231. {
  232.    Start_I2c();              //啟動總線
  233.    SendByte(sla);            //發送器件地址
  234.    if(ack==0)return(0);
  235.    SendByte(c);              //發送數據
  236.    if(ack==0)return(0);
  237.    Stop_I2c();               //結束總線
  238.    return(1);
  239. }

  240. /*******************************************************************
  241. ADC讀字節數據函數               
  242. *******************************************************************/
  243. uchar IRcvByte(uchar sla)
  244. {  
  245.    uchar c;
  246.    Start_I2c();          //啟動總線
  247.    SendByte(sla+1);      //發送器件地址
  248.    if(ack==0)return(0);
  249.    c=RcvByte();          //讀取數據0
  250.    Ack_I2c(1);           //發送非就答位
  251.    Stop_I2c();           //結束總線
  252.    return(c);
  253. }

  254. //        字符顯示函數
  255. void Display()
  256. {
  257.         LCD1602_write_com(0x80);                        //指針設置,指向1602液晶第一行第一列
  258.     LCD1602_write_word("Voltage: ");
  259.         LCD1602_write_com(0x80+0x0e);                        //指針設置,指向1602液晶第一行第一列
  260.     LCD1602_write_word(" V");
  261. }

  262. //實時電壓顯示函數
  263. void Display_Voltage()
  264. {
  265.         ss=(v*a);
  266. //        ss=((ss*6)/100);
  267.         ss=((ss*6)/239.6);
  268.         LCD1602_write_com(0x80+0x09);        //1602液晶屏命令操作,表示起始顯示位置為第二行第7列        
  269.         LCD1602_write_data(ss%10000000/1000000 + 0x30);
  270.         LCD1602_write_data(ss%1000000/100000 + 0x30);
  271.         LCD1602_write_data('.');
  272.         LCD1602_write_data(ss%100000/10000 + 0x30);
  273.         LCD1602_write_data(ss%10000/1000 + 0x30);
  274. //        LCD1602_write_data(ss%1000/100 + 0x30);
  275. //        LCD1602_write_data('.');
  276. //        LCD1602_write_data(ss%100/10 + 0x30);
  277. //        LCD1602_write_data(ss%10/1 + 0x30);
  278. }
  279. //******************************************************************/
  280. void dianyabiao()
  281. {  
  282.     Init_LCD1602(); //初始化LCD1602
  283.     Display();
  284.         a=50000000/255;
  285.                 while(key)
  286.         {
  287.                 ISendByte(PCF8591,0x41);
  288.                 v=IRcvByte(PCF8591);         
  289.                 Display_Voltage();                 
  290.         }         
  291. }


復制代碼



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

使用道具 舉報

沙發
ID:255077 發表于 2018-11-5 12:20 | 只看該作者
非常好的東西
回復

使用道具 舉報

板凳
ID:442274 發表于 2019-3-6 09:45 | 只看該作者
沒有提供下載啊
回復

使用道具 舉報

地板
ID:183056 發表于 2019-8-24 11:31 | 只看該作者
下載成功,測試通過。感謝樓主!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级黄色网 | 国产精品久久久久久久久久久新郎 | 久久久久精 | 日本久久网 | 在线观看成人小视频 | av男人的天堂av | 午夜一级大片 | 久久精品性视频 | 情侣av | 欧美视频在线播放 | 久久精品国产99国产精品 | av资源在线看 | 性一交一乱一透一a级 | 欧美一区二区三区 | 亚洲精品视频免费观看 | 一区二区三区久久久 | www视频在线观看 | 亚洲精品亚洲人成人网 | 一级毛片视频 | 日韩在线一区二区三区 | 亚洲毛片网站 | 久久精品国产99国产精品 | 亚洲免费网站 | 午夜无码国产理论在线 | 欧美一区二区大片 | 久久久久国产 | 欧美激情精品久久久久久 | 日本成人免费观看 | 免费在线观看一区二区三区 | 日韩电影免费观看中文字幕 | 毛片的网址 | 国产精久久久久久久妇剪断 | 国产精品免费一区二区 | 亚洲综合无码一区二区 | 亚洲成年人免费网站 | 国产免费播放视频 | 日本小视频网站 | 久久亚洲春色中文字幕久久久 | 亚洲精品成人av久久 | 天堂亚洲| 亚洲小视频在线观看 |