找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2018|回复: 0
打印 上一主题 下一主题
收起左侧

单片机PCF8591 AD模块1602显示应用程序

[复制链接]
跳转到指定楼层
楼主
自己在做1602实验的时候 仿真和实验程序。


单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:IIC协议 PCF8591ADDA转换                  显示有4个,注意只有2个可以调节电压的
  3.   内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压通过液晶显示,并输出模拟量,用LED亮度渐变指示
  4. ------------------------------------------------*/
  5. #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  6. #include <intrins.h> //包含NOP空指令函数_nop_();
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define Data  P0    //数据端口


  10. #define AddWr 0x90   //写数据地址
  11. #define AddRd 0x91   //读数据地址

  12. sbit RST=P2^4;  //时钟 加上后可以关掉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的第二行显示字符存储变量
  23. uchar  FirstLine[] ="                ";        //1602的第一行显示字符存储变量


  24. /*------------------------------------------------
  25.                     延时程序
  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.                     启动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.                    应答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.                  非应答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.               发送一个字节
  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.                读入一个字节并返回
  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.                     写入DA数模转换值
  144. ------------------------------------------------*/
  145.           void DAC(uchar Data)
  146.           {
  147.                    Start();
  148.                    Send(AddWr); //写入芯片地址
  149.                    Ack();
  150.                    Send(0x40);  //写入控制位,使能DAC输出
  151.                    Ack();
  152.                    Send(Data);  //写数据
  153.                    Ack();
  154.                    Stop();
  155.                  
  156.            }

  157. /*------------------------------------------------
  158.                  读取AD模数转换的值,有返回值
  159. ------------------------------------------------*/
  160.           uchar ReadADC(uchar Ch)
  161.           {
  162.        uchar Data;
  163.                    Start();
  164.                    _nop_();        //写入芯片地址
  165.                    Send(AddWr);
  166.                    _nop_();
  167.                    Ack();
  168.                    _nop_();
  169.                     Send(0x00|Ch);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加                 
  170.                    _nop_();               //Ch的值分别为0、1、2、3,分别代表1-4通道
  171.                    Ack();
  172.                   
  173.                     

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

  185. void cmg(void)//数码管锁存函数                   关时钟DS1302
  186. {
  187. dula=1;
  188. P0=0x00;
  189. dula=0;
  190. wela=1;
  191. P0=0x00;
  192. wela=0;
  193. RST=0;                //                关时钟DS1302
  194. }


  195.   
  196.          void WriteCommand(uchar c)
  197. {
  198. delay_ms(5);//短暂延时,就是避开1602里面的忙碌,让它有足够的时间工作再执行下面的语句。
  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);   //短暂延时,就是避开1602里面的忙碌,让它有足够的时间工作再执行下面的语句。
  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); //显示模式设置
  239. WriteCommand(0x38); //display mode
  240. WriteCommand(0x38); //display mode
  241. WriteCommand(0x06); //显示光标移动位置            
  242. WriteCommand(0x0c); //显示开及光标设置           
  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();                                //数码管锁存            
  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.         }
复制代码

所有资料51hei提供下载:
14 AD模块1602显示应用.zip (149.46 KB, 下载次数: 40)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表