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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2666|回復(fù): 2
收起左側(cè)

簡單的發(fā)一個51單片機(jī)的LCD1602的AD轉(zhuǎn)換代碼(可以直接復(fù)制的)

[復(fù)制鏈接]
ID:586975 發(fā)表于 2019-7-19 16:41 | 顯示全部樓層 |閱讀模式
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. sbit SDA=P2^0;                   // 將p1.2口模擬數(shù)據(jù)口
  4. sbit SCL=P2^1;                   // 將p1.7口模擬時鐘口
  5. sbit DS1302 =P2^4;
  6. sbit DU = P2^0;
  7. sbit WE = P2^1;
  8. #define uchar unsigned char
  9. #define uint  unsigned int
  10. #define disdata  P0              //顯示數(shù)據(jù)碼輸出口
  11. sbit LCD_RS = P1^0;            
  12. sbit LCD_RW = P1^1;
  13. sbit LCD_EN = P2^5;
  14. uint data dis[4]={0x00,0x00,0x00,0x00};
  15.                           //定義3個顯示數(shù)據(jù)單元和1個數(shù)據(jù)存儲單元
  16. uchar code dis4[] = {"1- .  V  2- .  V"};
  17. uchar code dis5[] = {"3- .  V  4- .  V"};

  18. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  19.                   
  20. bit   bdata SystemError;                //從機(jī)錯誤標(biāo)志位
  21. /*********************** PCF8591專用變量定義 ***********************/
  22. #define PCF8591_WRITE 0x90
  23. #define PCF8591_READ  0x91
  24. #define  NUM  4              //接收和發(fā)送緩存區(qū)的深度
  25. uchar idata receivebuf[NUM];    //數(shù)據(jù)接收緩沖區(qū)
  26. void cmg88()//關(guān)數(shù)碼管,點陣函數(shù)
  27. {
  28. DU=1;  
  29. P0=0X00;
  30. DU=0;
  31. }
  32. /*******************************************************************/
  33. /*                                                                 */
  34. /*  延時函數(shù)                                                       */
  35. /*                                                                 */
  36. /*******************************************************************/
  37. void delay(int ms)
  38. {
  39.     while(ms--)
  40. {
  41.       uchar i;
  42.    for(i=0;i<250;i++)  
  43.     {
  44.      _nop_();      
  45.   _nop_();
  46.   _nop_();
  47.   _nop_();
  48.     }
  49. }
  50. }  
  51. /*******************************************************************/
  52. /*                                                                 */
  53. /*檢查LCD忙狀態(tài)                                                    */
  54. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。      */
  55. /*                                                                 */
  56. /*******************************************************************/
  57. bit lcd_busy()
  58. {                          
  59.     bit result;
  60.     LCD_RS = 0;
  61.     LCD_RW = 1;
  62.     LCD_EN = 1;
  63.     delayNOP();
  64.     result = (bit)(P0&0x80);
  65.     LCD_EN = 0;
  66.     return(result);
  67. }
  68. /*******************************************************************/
  69. /*                                                                 */
  70. /*寫指令數(shù)據(jù)到LCD                                                  */
  71. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  72. /*                                                                 */
  73. /*******************************************************************/
  74. void lcd_wcmd(uchar cmd)
  75. {                          
  76.    while(lcd_busy());
  77.     LCD_RS = 0;
  78.     LCD_RW = 0;
  79.     LCD_EN = 0;
  80.     _nop_();
  81.     _nop_();
  82.     P0 = cmd;
  83.     delayNOP();
  84.     LCD_EN = 1;
  85.     delayNOP();
  86.     LCD_EN = 0;  
  87. }
  88. /*******************************************************************/
  89. /*                                                                 */
  90. /*寫顯示數(shù)據(jù)到LCD                                                  */
  91. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  92. /*                                                                 */
  93. /*******************************************************************/
  94. void lcd_wdat(uchar dat)
  95. {                          
  96.    while(lcd_busy());
  97.     LCD_RS = 1;
  98.     LCD_RW = 0;
  99.     LCD_EN = 0;
  100.     P0 = dat;
  101.     delayNOP();
  102.     LCD_EN = 1;
  103.     delayNOP();
  104.     LCD_EN = 0;
  105. }
  106. /*******************************************************************/
  107. /*                                                                 */
  108. /*  LCD初始化設(shè)定                                                  */
  109. /*                                                                 */
  110. /*******************************************************************/
  111. void lcd_init()
  112. {
  113.     delay(15);                  
  114.     lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數(shù)據(jù)
  115.     delay(5);
  116.     lcd_wcmd(0x38);         
  117.     delay(5);
  118.     lcd_wcmd(0x38);         
  119.     delay(5);
  120.     lcd_wcmd(0x0c);      //顯示開,關(guān)光標(biāo)
  121.     delay(5);
  122.     lcd_wcmd(0x06);      //移動光標(biāo)
  123.     delay(5);
  124.     lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
  125.     delay(5);
  126. }
  127. /*******************************************************************/
  128. /*                                                                 */
  129. /*  設(shè)定顯示位置                                                   */
  130. /*                                                                 */
  131. /*******************************************************************/
  132. void lcd_pos(uchar pos)
  133. {                          
  134.   lcd_wcmd(pos | 0x80);  //數(shù)據(jù)指針=80+地址變量
  135. }
  136. /******************************************************************/
  137. /*                                                                */
  138. /* 數(shù)據(jù)處理與顯示                                                 */
  139. /* 將采集到的數(shù)據(jù)進(jìn)行16進(jìn)制轉(zhuǎn)換為ASCLL碼。                        */
  140. /*                                                                */
  141. /******************************************************************/
  142. show_value(uchar ad_data)
  143. {   
  144.     dis[2]=ad_data/51;   //AD值轉(zhuǎn)換為3為BCD碼,最大為5.00V。
  145.     dis[2]=dis[2]+0x30;  //轉(zhuǎn)換為ACSII碼
  146.     dis[3]=ad_data%51;   //余數(shù)暫存
  147.     dis[3]=dis[3]*10;    //計算小數(shù)第一位
  148.     dis[1]=dis[3]/51;
  149.     dis[1]=dis[1]+0x30;  //轉(zhuǎn)換為ACSII碼
  150.     dis[3]=dis[3]%51;
  151.     dis[3]=dis[3]*10;    //計算小數(shù)第二位
  152.     dis[0]=dis[3]/51;                                                                             //
  153.     dis[0]=dis[0]+0x30;  //轉(zhuǎn)換為ACSII碼           
  154. }
  155. //-------------------------------------------------------------------
  156. // 函數(shù)名稱: iic_start()
  157. // 函數(shù)功能: 啟動I2C總線子程序
  158. //-------------------------------------------------------------------
  159. void iic_start(void)
  160. { //時鐘保持高,數(shù)據(jù)線從高到低一次跳變,I2C通信開始
  161. SDA = 1;     
  162. SCL = 1;
  163. delayNOP();      // 延時5us
  164.     SDA = 0;
  165. delayNOP();
  166.     SCL = 0;
  167. }
  168. //-------------------------------------------------------------------
  169. // 函數(shù)名稱: iic_stop()
  170. // 函數(shù)功能: 停止I2C總線數(shù)據(jù)傳送子程序
  171. //-------------------------------------------------------------------
  172. void iic_stop(void)
  173. {   
  174. SDA = 0;       //時鐘保持高,數(shù)據(jù)線從低到高一次跳變,I2C通信停止
  175. SCL = 1;
  176. delayNOP();
  177. SDA = 1;
  178. delayNOP();
  179.     SCL = 0;
  180. }
  181. //------------------------------------------------------------------
  182. // 函數(shù)名稱: iicInit_()
  183. // 函數(shù)功能: 初始化I2C總線子程序
  184. //------------------------------------------------------------------
  185. void iicInit(void)
  186.    {
  187.    SCL = 0;
  188.    iic_stop();
  189.    }  
  190. //-------------------------------------------------------------------
  191. // 函數(shù)名稱: slave_ACK
  192. // 函數(shù)功能: 從機(jī)發(fā)送應(yīng)答位子程序
  193. //-------------------------------------------------------------------
  194. void slave_ACK(void)
  195. {
  196. SDA = 0;  
  197. SCL = 1;
  198. delayNOP();
  199. SCL = 0;
  200. }
  201. //-------------------------------------------------------------------
  202. // 函數(shù)名稱: slave_NOACK
  203. // 函數(shù)功能: 從機(jī)發(fā)送非應(yīng)答位子程序,迫使數(shù)據(jù)傳輸過程結(jié)束
  204. //-------------------------------------------------------------------
  205. void slave_NOACK(void)
  206. {
  207. SDA = 1;
  208. SCL = 1;
  209. delayNOP();
  210. SDA = 0;
  211.     SCL = 0;  
  212. }
  213. //-------------------------------------------------------------------
  214. // 函數(shù)名稱: check_ACK
  215. // 函數(shù)功能: 主機(jī)應(yīng)答位檢查子程序,迫使數(shù)據(jù)傳輸過程結(jié)束
  216. //-------------------------------------------------------------------
  217. void check_ACK(void)
  218. {      
  219.     SDA = 1;        // 將SDA設(shè)置成輸入,必須先向端口寫1
  220. SCL = 1;
  221. F0 = 0;
  222. delayNOP();   
  223. if(SDA == 1)    // 若SDA=1表明非應(yīng)答,置位非應(yīng)答標(biāo)志F0
  224.     F0 = 1;
  225.     SCL = 0;
  226. }
  227. //-------------------------------------------------------------------
  228. // 函數(shù)名稱: IICSendByte
  229. // 入口參數(shù): ch
  230. // 函數(shù)功能: 發(fā)送一個字節(jié)
  231. //-------------------------------------------------------------------
  232. void IICSendByte(uchar ch)

  233. {
  234.    unsigned char idata n=8;     // 向SDA上發(fā)送一位數(shù)據(jù)字節(jié),共八位
  235. while(n--)
  236. {
  237. if((ch&0x80) == 0x80)    // 若要發(fā)送的數(shù)據(jù)最高位為1則發(fā)送位1
  238.     {
  239.     SDA = 1;    // 傳送位1
  240.    SCL = 1;
  241.       delayNOP();
  242.   // SDA = 0;
  243.    SCL = 0;
  244.     }
  245.   else
  246.   {  
  247.    SDA = 0;    // 否則傳送位0
  248.    SCL = 1;
  249.    delayNOP();
  250.      SCL = 0;
  251.   }
  252.   ch = ch<<1;    // 數(shù)據(jù)左移一位
  253. }
  254. }
  255. //-------------------------------------------------------------------
  256. // 函數(shù)名稱: IICreceiveByte
  257. // 返回接收的數(shù)據(jù)
  258. // 函數(shù)功能: 接收一字節(jié)子程序
  259. //-------------------------------------------------------------------
  260. uchar IICreceiveByte(void)
  261. {
  262. uchar idata n=8;     // 從SDA線上讀取一上數(shù)據(jù)字節(jié),共八位
  263. uchar tdata=0;
  264. while(n--)
  265. {
  266.     SDA = 1;
  267.     SCL = 1;
  268.     tdata =tdata<<1;      //左移一位
  269.      if(SDA == 1)
  270.     tdata = tdata|0x01;   // 若接收到的位為1,則數(shù)據(jù)的最后一位置1
  271.   else
  272.     tdata = tdata&0xfe;   // 否則數(shù)據(jù)的最后一位置0
  273.     SCL = 0;
  274.   }
  275.   return(tdata);
  276. }
  277. //-------------------------------------------------------------------
  278. // 函數(shù)名稱: DAC_PCF8591
  279. // 入口參數(shù): slave_add從機(jī)地址,n要發(fā)送的數(shù)據(jù)個數(shù)
  280. // 函數(shù)功能: 發(fā)送n位數(shù)據(jù)子程序
  281. //-------------------------------------------------------------------
  282. void DAC_PCF8591(uchar controlbyte,uchar w_data)
  283. {   

  284. iic_start();                    // 啟動I2C
  285. delayNOP();
  286. IICSendByte(PCF8591_WRITE);     // 發(fā)送地址位
  287. check_ACK();                    // 檢查應(yīng)答位
  288.     if(F0 == 1)
  289.   {
  290.   SystemError = 1;
  291.   return;                     // 若非應(yīng)答,置錯誤標(biāo)志位
  292.      }
  293.     IICSendByte(controlbyte&0x77); //Control byte
  294. check_ACK();                    //檢查應(yīng)答位
  295.     if(F0 == 1)
  296.   {
  297.   SystemError = 1;
  298.   return;                    // 若非應(yīng)答,置錯誤標(biāo)志位
  299.   }
  300.     IICSendByte(w_data);        //data byte
  301. check_ACK();                  // 檢查應(yīng)答位
  302.     if(F0 == 1)
  303.   {
  304.   SystemError = 1;
  305.      return;   // 若非應(yīng)答表明器件錯誤或已壞,置錯誤標(biāo)志位SystemError
  306.   }
  307. iic_stop();         // 全部發(fā)完則停止
  308. delayNOP();
  309. delayNOP();
  310. delayNOP();
  311. delayNOP();
  312. }
  313. //-------------------------------------------------------------------
  314. // 函數(shù)名稱: ADC_PCF8591
  315. // 入口參數(shù): controlbyte控制字
  316. // 函數(shù)功能: 連續(xù)讀入4路通道的A/D轉(zhuǎn)換結(jié)果到receivebuf
  317. //-------------------------------------------------------------------
  318. void ADC_PCF8591(uchar controlbyte)
  319. {
  320.     uchar idata receive_da,i=0;
  321. iic_start();
  322. IICSendByte(PCF8591_WRITE); //控制字
  323. check_ACK();
  324. if(F0 == 1)
  325. {
  326.   SystemError = 1;
  327.   return;
  328. }
  329. IICSendByte(controlbyte); //控制字
  330. check_ACK();
  331. if(F0 == 1)
  332. {
  333.   SystemError = 1;
  334.   return;
  335. }
  336.     iic_start();                //重新發(fā)送開始命令
  337.     IICSendByte(PCF8591_READ); //控制字
  338. check_ACK();
  339. if(F0 == 1)
  340. {
  341.   SystemError = 1;
  342.   return;
  343. }
  344.   
  345.     IICreceiveByte();   //空讀一次,調(diào)整讀順序
  346.     slave_ACK();        //收到一個字節(jié)后發(fā)送一個應(yīng)答位
  347. while(i<4)
  348. {  
  349.    receive_da=IICreceiveByte();
  350.    receivebuf[i++]=receive_da;
  351.    slave_ACK();       //收到一個字節(jié)后發(fā)送一個應(yīng)答位
  352. }
  353. slave_NOACK();       //收到最后一個字節(jié)后發(fā)送一個非應(yīng)答位
  354. iic_stop();
  355. }
  356. //-------------------------------------------------------------------
  357. // 函數(shù)名稱: main
  358. // 函數(shù)功能: 主程序
  359. //-------------------------------------------------------------------
  360. main()
  361. {
  362.     uchar i,l;
  363.     delay(10);                 //延時
  364. cmg88();//關(guān)數(shù)碼管,點陣函數(shù)
  365. DS1302 =0;
  366.     lcd_init();                //初始化LCD            
  367.         
  368.     lcd_pos(0);                //設(shè)置顯示位置為第一行的第1個字符
  369.      i = 0;
  370.     while(dis4[i] != '\0')
  371.      {                         //顯示字符
  372.        lcd_wdat(dis4[i]);
  373.        i++;
  374.      }
  375.     lcd_pos(0x40);             //設(shè)置顯示位置為第二行第1個字符
  376.      i = 0;
  377.     while(dis5[i] != '\0')
  378.      {
  379.        lcd_wdat(dis5[i]);      //顯示字符
  380.        i++;
  381.      }

  382.   while(1)
  383.   {
  384. iicInit();               //I2C總線初始化
  385.     ADC_PCF8591(0x04);
  386. if(SystemError == 1)   //有錯誤,重新來
  387.    {
  388.     iicInit();      //I2C總線初始化
  389.      ADC_PCF8591(0x04);
  390.     }   

  391. for(l=0;l<4;l++)
  392.   {
  393.    show_value(receivebuf[0]); //顯示通道0      
  394.      lcd_pos(0x02);            
  395.         lcd_wdat(dis[2]);        //整數(shù)位顯示
  396.         lcd_pos(0x04);            
  397.         lcd_wdat(dis[1]);        //第一位小數(shù)顯示
  398.         lcd_pos(0x05);            
  399.         lcd_wdat(dis[0]);        //第二位小數(shù)顯示
  400.       show_value(receivebuf[1]); //顯示通道1  
  401.      lcd_pos(0x0b);            
  402.         lcd_wdat(dis[2]);        //整數(shù)位顯示
  403.         lcd_pos(0x0d);            
  404.         lcd_wdat(dis[1]);        //第一位小數(shù)顯示
  405.         lcd_pos(0x0e);            
  406.         lcd_wdat(dis[0]);        //第二位小數(shù)顯示
  407.    show_value(receivebuf[2]); //顯示通道2           
  408.      lcd_pos(0x42);            
  409.         lcd_wdat(dis[2]);        //整數(shù)位顯示
  410.         lcd_pos(0x44);            
  411.         lcd_wdat(dis[1]);        //第一位小數(shù)顯示
  412.         lcd_pos(0x45);            
  413.         lcd_wdat(dis[0]);        //第二位小數(shù)顯示
  414.       show_value(receivebuf[3]); //顯示通道3  
  415.      lcd_pos(0x4b);            
  416.         lcd_wdat(dis[2]);        //整數(shù)位顯示
  417.         lcd_pos(0x4d);              
  418.         lcd_wdat(dis[1]);        //第一位小數(shù)顯示
  419.         lcd_pos(0x4e);            
  420.         lcd_wdat(dis[0]);        //第二位小數(shù)顯示
  421.    iicInit();               //I2C總線初始化  
  422.       DAC_PCF8591(0x40,receivebuf[0]); //D/A輸出
  423.      if(SystemError == 1)   //有錯誤,重新來
  424.      {
  425.      iicInit();      //I2C總線初始化
  426.    DAC_PCF8591(0x40,receivebuf[0]); //D/A輸出
  427.      }         
  428.       //delay(50);                       //延時
  429.   }
  430.    }
  431. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:198286 發(fā)表于 2019-7-30 12:15 | 顯示全部樓層
我現(xiàn)在要做的是IIC接口的1602,不知道咋搞
回復(fù)

使用道具 舉報

ID:586975 發(fā)表于 2019-8-2 10:23 | 顯示全部樓層
zxy2266 發(fā)表于 2019-7-30 12:15
我現(xiàn)在要做的是IIC接口的1602,不知道咋搞

主要先了解一下IIc協(xié)議.我還有這方面的帖子還沒審核.審核完了你可以看一下.有幫助的話就好.本人也在做一些東西.現(xiàn)在空閑不多.抱歉
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人精品鲁一区一区二区 | 精品国产一级 | 午夜影视大全 | 欧美视频三区 | 一区二视频| 99伊人| 91免费在线看 | 户外露出一区二区三区 | 最新黄色毛片 | 国内精品伊人久久久久网站 | av男人天堂影院 | 视频一区二区在线观看 | 99re在线视频 | 中国一级大毛片 | 天天搞天天搞 | 亚州中文| 欧美一二三 | 欧美亚洲另类丝袜综合网动图 | 国产1区2区3区 | 高清黄色 | 视频国产一区 | 成人午夜免费网站 | 久久99精品久久久久久 | 99爱在线视频 | 日韩成人在线视频 | 婷婷福利视频导航 | 黄色网络在线观看 | 999久久久| 欧美男人亚洲天堂 | 免费看片国产 | 盗摄精品av一区二区三区 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 久久久www成人免费无遮挡大片 | 亚洲精品专区 | aaa在线 | 精品一区二区久久久久久久网精 | 日本视频在线播放 | 天堂在线www| 国产精品久久久久久久久动漫 | 亚洲精品久久久久久首妖 | 亚洲欧美日韩精品 |