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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的PCF8591模數轉換protues仿真LCD顯示

[復制鏈接]
跳轉到指定樓層
樓主
基于51單片機的PCF8591模數轉換LCD顯示,自帶protues仿真.




單片機源程序如下:
  1. /****************************************************************
  2.               在1602液晶屏上顯示各通道的電壓值
  3. ******************************************************************/
  4. #include<reg52.h>    //包含單片機寄存器的頭文件
  5. #include <intrins.h>

  6. #define  AddWr 0x90    //PCF8591 地址
  7. #define Data  P0    //數據端口

  8. // 變量定義
  9. unsigned char AD_CHANNEL;
  10. sbit scl=P2^6;       //I2C  時鐘
  11. sbit sda=P2^7;       //I2C  數據
  12. bit ack;                 /*應答標志位*/

  13. sbit RS = P2^0;//Pin4
  14. sbit RW = P2^1; //Pin5
  15. sbit E  = P2^2;//Pin6



  16. unsigned char TempData[8];
  17. unsigned char  FirstLine[16]="Voltage:        ";
  18. unsigned char  SecondLine[16] ="Current:        ";
  19. /*******************************************************************
  20.                      起動總線函數               
  21. 函數原型: void  Start_I2c();  
  22. 功能:     啟動I2C總線,即發送I2C起始條件.  
  23. ********************************************************************/
  24. void Start_I2c()
  25. {
  26.   sda=1;         /*發送起始條件的數據信號*/
  27.   _nop_();
  28.   scl=1;
  29.   _nop_();        /*起始條件建立時間大于4.7us,延時*/
  30.   _nop_();
  31.   _nop_();
  32.   _nop_();
  33.   _nop_();   
  34.   sda=0;         /*發送起始信號*/
  35.   _nop_();        /* 起始條件鎖定時間大于4μs*/
  36.   _nop_();
  37.   _nop_();
  38.   _nop_();
  39.   _nop_();      
  40.   scl=0;       /*鉗住I2C總線,準備發送或接收數據 */
  41.   _nop_();
  42.   _nop_();
  43. }

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

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

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

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

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

  161.   }              /*在此發出應答或非應答信號 */
  162.   else
  163. {  sda=1;                                  /*0為發出應答,1為非應答信號 */
  164.   _nop_();
  165.   _nop_();
  166.   _nop_();      
  167.   scl=1;
  168.   _nop_();
  169.   _nop_();                    /*時鐘低電平周期大于4μs*/
  170.   _nop_();
  171.   _nop_();
  172.   _nop_();  
  173.   scl=0;                     /*清時鐘線,住I2C總線以便繼續接收*/
  174.   _nop_();
  175.   _nop_();
  176.   sda=0;
  177.       _nop_();
  178.   _nop_();   

  179.   }   
  180. }

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

  197. /************************************************************
  198. * 函數名               : PCF8591_RcvByte
  199. * 函數功能           : 讀取一個轉換值
  200. * 輸入          :
  201. * 輸出          : dat
  202. ************************************************************/
  203. unsigned char PCF8591_RcvByte(unsigned char addr)
  204. {  
  205.    unsigned char dat;

  206.    Start_I2c();          //啟動總線
  207.    I2C_SendByte(addr+1);      //發送器件地址
  208.    if(ack==0)return(0);
  209.    dat=I2C_RcvByte();          //讀取數據0

  210.    Ack_I2c(1);           //發送非應答信號
  211.    Stop_I2c();           //結束總線
  212.    return(dat);
  213. }

  214. /******************************************************************/
  215. /*                   1602液晶屏相關函數                                     */
  216. /******************************************************************/
  217. void DelayUs(unsigned char us)//delay us
  218. {
  219. unsigned char uscnt;
  220. uscnt=us>>1;/* Crystal frequency in 12MHz*/
  221. while(--uscnt);
  222. }
  223. /******************************************************************/
  224. void DelayMs(unsigned char ms)//delay Ms
  225. {
  226. while(--ms)
  227.    {
  228.      DelayUs(250);
  229.      DelayUs(250);
  230.          DelayUs(250);
  231.          DelayUs(250);
  232.    }
  233. }
  234. void WriteCommand(unsigned char c)
  235. {
  236. DelayMs(5);//short delay before operation
  237. E=0;
  238. RS=0;
  239. RW=0;
  240. _nop_();
  241. E=1;
  242. Data=c;
  243. E=0;
  244. }
  245. /****************************************************************/
  246. void WriteData(unsigned char c)
  247. {
  248. DelayMs(5);   //short delay before operation
  249. E=0;
  250. RS=1;
  251. RW=0;
  252. _nop_();
  253. E=1;
  254. Data=c;
  255. E=0;
  256. RS=0;
  257. }
  258. /*********************************************************************/
  259. void ShowChar(unsigned char pos,unsigned char c)
  260. {
  261. unsigned char p;
  262. if (pos>=0x10)
  263.     p=pos+0xb0; //是第二行則命令代碼高4位為0xc
  264. else
  265.     p=pos+0x80; //是第二行則命令代碼高4位為0x8
  266. WriteCommand (p);//write command
  267. WriteData (c);   //write data
  268. }
  269. /*************************************************************************/
  270. void ShowString (unsigned char line,char *ptr)
  271. {
  272. unsigned char l,i;
  273. l=line<<4;
  274. for (i=0;i<16;i++)
  275.   ShowChar (l++,*(ptr+i));//循環顯示16個字符
  276. }
  277. /*********************************************************************/
  278. void InitLcd()
  279. {
  280. DelayMs(15);
  281. WriteCommand(0x38); //display mode
  282. WriteCommand(0x38); //display mode
  283. WriteCommand(0x38); //display mode
  284. WriteCommand(0x06); //顯示光標移動位置
  285. WriteCommand(0x0c); //顯示開及光標設置
  286. WriteCommand(0x01); //顯示清屏

  287. }


  288. /////////////////////////////////////////////////////////////////
  289. void disp(void)

  290. {
  291.    unsigned char i=0;
  292.    while(FirstLine[i]!=' ')
  293.    {
  294.            ShowString(0,FirstLine);
  295.         i++;
  296.    }


  297. FirstLine[8]= '0'+TempData[0];
  298. FirstLine[9]= '0'+TempData[1];
  299. FirstLine[10]='.';
  300. FirstLine[11]='0'+TempData[2];
  301. FirstLine[12]='0'+TempData[3];
  302. FirstLine[14]='V';

  303. ShowString(0,FirstLine);

  304.      while(SecondLine[i]!=' ')
  305.    {
  306.            ShowString(1,SecondLine);
  307.         i++;
  308.    }

  309. SecondLine[8]='0'+TempData[4];
  310. SecondLine[11]='0'+TempData[6];
  311. SecondLine[10]='.';
  312. SecondLine[14]='V';



  313. ShowString(1,SecondLine);

  314. }
  315. /*------------------------------------------------
  316.                     延時程序
  317. ------------------------------------------------*/
  318. void mDelay(unsigned char j)
  319. {
  320.   unsigned int i;
  321. ……………………

  322. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
AD-PCF8591.zip (70.71 KB, 下載次數: 210)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:202719 發表于 2018-1-20 00:17 | 只看該作者
沒有仿真文件的?
回復

使用道具 舉報

板凳
ID:285352 發表于 2018-5-23 10:17 | 只看該作者
剛好在學習,收藏了
回復

使用道具 舉報

地板
ID:285352 發表于 2018-5-23 10:33 | 只看該作者
找不到仿真文件呀,只有代碼
回復

使用道具 舉報

5#
ID:362275 發表于 2018-7-1 15:31 | 只看該作者
沒有封裝嗎
回復

使用道具 舉報

6#
ID:389518 發表于 2018-8-30 09:40 | 只看該作者
仿真文件在哪?用樓主的仿真圖連接的電路根本無法實現
回復

使用道具 舉報

7#
ID:492564 發表于 2019-3-30 23:11 | 只看該作者
沒protues文件啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久吹潮 | 成人在线观看免费 | 成人a网 | 99re在线视频 | 国产精品欧美一区二区 | 久久在线精品 | 亚洲激精日韩激精欧美精品 | 国产精品爱久久久久久久 | 免费在线看黄 | 久久精品色欧美aⅴ一区二区 | 超碰伊人| 精品国产一级 | 国产成人福利视频 | 日韩国产精品一区二区三区 | 91在线精品秘密一区二区 | 国产精品视频免费观看 | 日日夜夜天天 | 丁香久久 | 欧美成年人网站 | 日韩欧美国产一区二区三区 | 麻豆久久久久久久 | 国产性色视频 | 国产精品美女久久久久aⅴ国产馆 | 97精品超碰一区二区三区 | 午夜在线影院 | 国产欧美日韩在线 | 国产视频一二三区 | 一区二区三区免费观看 | 亚洲综合大片69999 | 亚洲一区在线免费观看 | 福利视频网址 | 中文字幕一区二区三区四区五区 | 国产高清免费视频 | 毛片高清| 精品熟人一区二区三区四区 | 又爽又黄axxx片免费观看 | 久草在线视频中文 | 99热这里有精品 | 成人在线中文字幕 | 午夜影院在线观看免费 | 亚洲欧美激情视频 |