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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1991|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)PCF8591 AD模塊1602顯示應(yīng)用程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
自己在做1602實(shí)驗(yàn)的時(shí)候 仿真和實(shí)驗(yàn)程序。


單片機(jī)源程序如下:
  1. /*-----------------------------------------------
  2.   名稱(chēng):IIC協(xié)議 PCF8591ADDA轉(zhuǎn)換                  顯示有4個(gè),注意只有2個(gè)可以調(diào)節(jié)電壓的
  3.   內(nèi)容:此程序通過(guò)IIC協(xié)議對(duì)DAAD芯片操作,讀取電位器的電壓通過(guò)液晶顯示,并輸出模擬量,用LED亮度漸變指示
  4. ------------------------------------------------*/
  5. #include<reg52.h>    //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  6. #include <intrins.h> //包含NOP空指令函數(shù)_nop_();
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define Data  P0    //數(shù)據(jù)端口


  10. #define AddWr 0x90   //寫(xiě)數(shù)據(jù)地址
  11. #define AddRd 0x91   //讀數(shù)據(jù)地址

  12. sbit RST=P2^4;  //時(shí)鐘 加上后可以關(guān)掉DS1302芯片輸出

  13. sbit Sda=P2^0;       //定義總線連接端口
  14. sbit Scl=P2^1;

  15. sbit dula=P2^6;
  16. sbit wela=P2^7;

  17. sbit RS = P1^0;//Pin4
  18. sbit RW = P1^1; //Pin5
  19. sbit E  = P2^5;//Pin6

  20.          

  21. uchar TempData[8];
  22. uchar SecondLine[]="                ";  //1602的第二行顯示字符存儲(chǔ)變量
  23. uchar  FirstLine[] ="                ";        //1602的第一行顯示字符存儲(chǔ)變量


  24. /*------------------------------------------------
  25.                     延時(shí)程序
  26. ------------------------------------------------*/
  27. void delay_ms(uint j)
  28. {
  29.   uint i;
  30.   for(;j>0;j--)
  31.      {
  32.           for(i=0;i<113;i++)
  33.              {;}
  34.           }
  35.   }

  36. /*------------------------------------------------
  37.                     啟動(dòng)IIC總線
  38. ------------------------------------------------*/
  39.   void Start(void)
  40.   {
  41.    
  42.    Scl=1;
  43.    _nop_();
  44.    Sda=1;
  45.    _nop_();
  46.    Sda=0;
  47.    _nop_();
  48.    Scl=0;
  49.   }


  50. /*------------------------------------------------
  51.                     停止IIC總線
  52. ------------------------------------------------*/
  53.   void Stop(void)
  54.   {
  55.   
  56.    Scl=1;
  57.    _nop_();
  58.    Sda=0;
  59.    _nop_();
  60.    Sda=1;
  61.    _nop_();
  62.    Scl=0;
  63.    }


  64. /*------------------------------------------------
  65.                    應(yīng)答IIC總線
  66. ------------------------------------------------*/
  67.    void Ack(void)
  68.    {
  69.     Sda=0;
  70.         _nop_();
  71.         Scl=1;
  72.         _nop_();
  73.         Scl=0;
  74.         _nop_();
  75.         }


  76. /*------------------------------------------------
  77.                  非應(yīng)答IIC總線
  78. ------------------------------------------------*/
  79.         void NoAck(void)
  80.         {
  81.          Sda=1;
  82.          _nop_();
  83.          Scl=1;
  84.          _nop_();
  85.          Scl=0;
  86.          _nop_();
  87.          }


  88. /*------------------------------------------------
  89.               發(fā)送一個(gè)字節(jié)
  90. ------------------------------------------------*/
  91.          void Send(uchar Data)
  92.          {
  93.            uchar BitCounter=8;
  94.           uchar temp;

  95.           do
  96.             {
  97.                  temp=Data;
  98.                  Scl=0;
  99.                  _nop_();
  100.                  if((temp&0x80)==0x80)
  101.                     Sda=1;
  102.                  else
  103.                     Sda=0;

  104.                         Scl=1;
  105.                         temp=Data<<1;
  106.                         Data=temp;
  107.                         BitCounter--;
  108.                   }
  109.           while(BitCounter);
  110.               Scl=0;
  111.           }


  112. /*------------------------------------------------
  113.                讀入一個(gè)字節(jié)并返回
  114. ------------------------------------------------*/
  115.           uchar Read(void)
  116.           {
  117.            uchar temp=0;
  118.            uchar temp1=0;
  119.            uchar BitCounter=8;

  120.            Sda=1;
  121.            do
  122.              {
  123.                   Scl=0;
  124.           _nop_();
  125.                   Scl=1;
  126.                   _nop_();
  127.                   if(Sda)
  128.                      temp=temp|0x01;
  129.                   else
  130.                      temp=temp&0xfe;

  131.                   if(BitCounter-1)
  132.                      {
  133.                           temp1=temp<<1;
  134.                           temp=temp1;
  135.                           }
  136.                           BitCounter--;
  137.                          }
  138.                 while(BitCounter);
  139.                 Scl=0;
  140.                 return(temp);
  141.           }

  142. /*------------------------------------------------
  143.                     寫(xiě)入DA數(shù)模轉(zhuǎn)換值
  144. ------------------------------------------------*/
  145.           void DAC(uchar Data)
  146.           {
  147.                    Start();
  148.                    Send(AddWr); //寫(xiě)入芯片地址
  149.                    Ack();
  150.                    Send(0x40);  //寫(xiě)入控制位,使能DAC輸出
  151.                    Ack();
  152.                    Send(Data);  //寫(xiě)數(shù)據(jù)
  153.                    Ack();
  154.                    Stop();
  155.                  
  156.            }

  157. /*------------------------------------------------
  158.                  讀取AD模數(shù)轉(zhuǎn)換的值,有返回值
  159. ------------------------------------------------*/
  160.           uchar ReadADC(uchar Ch)
  161.           {
  162.        uchar Data;
  163.                    Start();
  164.                    _nop_();        //寫(xiě)入芯片地址
  165.                    Send(AddWr);
  166.                    _nop_();
  167.                    Ack();
  168.                    _nop_();
  169.                     Send(0x00|Ch);//寫(xiě)入選擇的通道,本程序只用單端輸入,差分部分需要自行添加                 
  170.                    _nop_();               //Ch的值分別為0、1、2、3,分別代表1-4通道
  171.                    Ack();
  172.                   
  173.                     

  174.                    Start();
  175.                    Send(AddRd);    //讀入地址
  176.                    Ack();
  177.                    Data=Read();    //讀數(shù)據(jù)
  178.                    Scl=0;
  179.                    NoAck();
  180.                    _nop_();
  181.                    Stop();
  182.                    _nop_();
  183.                    return Data;   //返回值
  184.           }

  185. void cmg(void)//數(shù)碼管鎖存函數(shù)                   關(guān)時(shí)鐘DS1302
  186. {
  187. dula=1;
  188. P0=0x00;
  189. dula=0;
  190. wela=1;
  191. P0=0x00;
  192. wela=0;
  193. RST=0;                //                關(guān)時(shí)鐘DS1302
  194. }


  195.   
  196.          void WriteCommand(uchar c)
  197. {
  198. delay_ms(5);//短暫延時(shí),就是避開(kāi)1602里面的忙碌,讓它有足夠的時(shí)間工作再執(zhí)行下面的語(yǔ)句。
  199. E=0;
  200. RS=0;
  201. RW=0;
  202. _nop_();
  203. E=1;
  204. Data=c;
  205. E=0;
  206. }
  207. /****************************************************************/
  208. void WriteData(uchar c)
  209. {
  210. delay_ms(5);   //短暫延時(shí),就是避開(kāi)1602里面的忙碌,讓它有足夠的時(shí)間工作再執(zhí)行下面的語(yǔ)句。
  211. E=0;
  212. RS=1;
  213. RW=0;
  214. _nop_();
  215. E=1;
  216. Data=c;
  217. E=0;
  218. RS=0;
  219. }
  220. /*********************************************************************/
  221. void ShowString (uchar line,char *ptr)
  222. {
  223. uchar p;
  224. if(line==0)
  225. p=0x80;
  226. else p=0xc0;

  227. WriteCommand(p);

  228. while(*ptr)
  229. {
  230. WriteData(*ptr);
  231. ptr++;
  232. }

  233. }
  234. /*********************************************************************/
  235. void InitLcd()
  236. {
  237. delay_ms(15);
  238. WriteCommand(0x38); //顯示模式設(shè)置
  239. WriteCommand(0x38); //display mode
  240. WriteCommand(0x38); //display mode
  241. WriteCommand(0x06); //顯示光標(biāo)移動(dòng)位置            
  242. WriteCommand(0x0c); //顯示開(kāi)及光標(biāo)設(shè)置           
  243. WriteCommand(0x01); //顯示清屏                        

  244. }


  245. /////////////////////////////////////////////////////////////////
  246. void disp(void)

  247. {
  248. FirstLine[0]='V';
  249. FirstLine[1]='1';
  250. FirstLine[3]='0'+TempData[0];
  251. FirstLine[4]='.';
  252. FirstLine[5]='0'+TempData[1];
  253. FirstLine[6]='V';

  254. FirstLine[9]='V';
  255. FirstLine[10]='2';
  256. FirstLine[12]='0'+TempData[2];
  257. FirstLine[13]='.';
  258. FirstLine[14]='0'+TempData[3];
  259. FirstLine[15]='V';

  260. SecondLine[0]='V';
  261. SecondLine[1]='3';
  262. SecondLine[3]='0'+TempData[4];
  263. SecondLine[4]='.';
  264. SecondLine[5]='0'+TempData[5];
  265. SecondLine[6]='V';

  266. SecondLine[9]='V';
  267. SecondLine[10]='4';
  268. SecondLine[12]='0'+TempData[6];
  269. SecondLine[13]='.';
  270. SecondLine[14]='0'+TempData[7];
  271. SecondLine[15]='V';

  272. ShowString(0,FirstLine);
  273. ShowString(1,SecondLine);



  274. }


  275. /*------------------------------------------------
  276.                    主程序
  277. ------------------------------------------------*/
  278.         void main()
  279.         {


  280.         
  281.         
  282.          InitLcd();
  283.      delay_ms(20);
  284.          cmg();                                //數(shù)碼管鎖存            
  285.          while(1)
  286.               {
  287.          

  288.                    ReadADC(0);
  289.                 TempData[0]=ReadADC(0)/50;//處理0通道電壓顯示
  290.                   TempData[1]=(ReadADC(0)%50)/10;
  291.          
  292.         ReadADC(1);
  293.                 TempData[2]=ReadADC(1)/50;//處理1通道電壓顯示
  294.                   TempData[3]=(ReadADC(1)%50)/10;
  295.                   
  296.         ReadADC(2);
  297.                 TempData[4]=ReadADC(2)/50;//處理2通道電壓顯示
  298.                   TempData[5]=(ReadADC(2)%50)/10;
  299.                   
  300.         ReadADC(3);
  301.                 TempData[6]=ReadADC(3)/50;//處理3通道電壓顯示
  302.                   TempData[7]=(ReadADC(3)%50)/10;

  303.         disp();

  304.                 delay_ms(200);
  305.                   
  306.            }
  307.         }
復(fù)制代碼

所有資料51hei提供下載:
14 AD模塊1602顯示應(yīng)用.zip (149.46 KB, 下載次數(shù): 40)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久免费看 | 婷婷福利视频导航 | 欧美美女二区 | 91精品国产综合久久福利软件 | 国产精品久久久久久久久久免费看 | 欧美精品一区三区 | 久久久精品一区二区 | 九九热在线观看 | 不卡一二三区 | 欧美一区二区三区在线看 | 日本精品一区二区三区视频 | 国产成人高清在线观看 | 国产一级在线 | 日韩欧美专区 | 国产精品久久久久久一区二区三区 | 九九热精品在线 | 午夜精品一区 | 国产精品久久久久久久久久久久 | 看av在线| 亚洲国产aⅴ精品一区二区 免费观看av | 国产jizz女人多喷水99 | 噜噜噜噜狠狠狠7777视频 | 91美女视频 | 亚洲精品一区二区三区 | gav成人免费播放视频 | 国产在线视频一区 | 欧美va大片 | 国产精品视频一二三 | 狠狠干影院 | 精品国产一区二区在线 | 国产精品国产三级国产aⅴ原创 | 不卡av电影在线播放 | 中文字幕久久精品 | av网站免费 | 免费一区二区三区 | 亚洲 中文 欧美 日韩 在线观看 | 午夜精品在线观看 | 成人av片在线观看 | 日韩色在线 | 97色在线视频 | 久久免费精彩视频 |