找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3493|回复: 2
收起左侧

单片机键盘控制PCF8591 DA转换器来控制流水灯的亮度 带仿真原理图

[复制链接]
ID:424132 发表于 2018-11-10 16:17 | 显示全部楼层 |阅读模式
新人帖子,利用PCF8591DA转换功能来控制LED流水灯亮度。压缩包内有Proteus 仿真和程序

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include"i2c.h"
  4. #include"lcd.h"

  5. #define  WRITEADDR 0x90
  6. #define  READADDR  0x91
  7. unsigned char Time;

  8. #define GPIO_LED P1

  9. sbit K1=P3^2;
  10. sbit K2=P3^3;

  11. long int vol=180;

  12. void Pcf8591DaConversion(unsigned char value);

  13. void Delay10ms(unsigned int c)   //误差 0us
  14. {
  15.     unsigned char a,b;
  16.     for(;c>0;c--)
  17.         for(b=38;b>0;b--)
  18.             for(a=130;a>0;a--);
  19. }

  20. /*******************************************************************************
  21. * 函数名         : main
  22. * 函数功能                   : 主函数
  23. * 输入           : 无
  24. * 输出                  : 无
  25. *******************************************************************************/

  26. void main()
  27. {
  28.         GPIO_LED=0XFE;        
  29.         LcdInit();
  30.     LcdWriteCom(0x80+4);
  31.     LcdWriteData('D');
  32.     LcdWriteData('a');
  33.     LcdWriteData('n');
  34.     LcdWriteData(' ');
  35.     LcdWriteData('Y');
  36.     LcdWriteData('a');
  37.     LcdWriteData(':');
  38.         TMOD = 0x01; //选择工作方式1
  39.     TH0 = 0x3C;         //设置初始值,定时50MS
  40.     TL0 = 0xB0;
  41.     EA = 1;                         //打开总中断
  42.     ET0 = 1;TR0 = 1;                 //打开定时器0中断//启动定时器0            
  43.         while(1)
  44.         {        
  45.                 LcdWriteCom(0xc0+6);
  46.                 LcdWriteData('0'+vol*5/255%10);
  47.                 LcdWriteData('.');
  48.         LcdWriteData('0'+vol*50/255%10);
  49.         LcdWriteData('0'+vol*500/255%10);
  50.                 LcdWriteData('V');

  51.         Pcf8591DaConversion(vol); //DAC          数模转换

  52.         if(K1==0)
  53.         {
  54.             Delay10ms(1);
  55.             if(K1==0)
  56.             {
  57.                 vol=vol+10;
  58.                 if(vol>255)
  59.                 vol=255;
  60.                 while(K1==0);
  61.             }
  62.         }
  63.         if(K2==0)
  64.         {
  65.             Delay10ms(1);
  66.             if(K2==0)
  67.             {
  68.                 vol=vol-10;
  69.                 if(vol<0)
  70.                 vol=0;
  71.                 while(K2==0);
  72.             }
  73.         }
  74.                                                                                 
  75.         }
  76.                                  
  77. }

  78. void Pcf8591DaConversion(unsigned char value)
  79. {
  80.         I2cStart();
  81.         I2cSendByte(WRITEADDR);//发送写器件地址
  82.         I2cSendByte(0x40);//开启DA写到控制寄存器
  83.         I2cSendByte(value);//发送转换数值
  84.         I2cStop();        
  85. }

  86. void Timer0() interrupt 1
  87. {
  88.         TH0 = 0x3C;         //设置初始值
  89.     TL0 = 0xB0;
  90.         Time++;

  91.         if(Time>=10)
  92.         {
  93.                 GPIO_LED=_crol_(GPIO_LED,1);
  94.                 Time=0;
  95.         }
  96. }
复制代码

所有资料51hei提供下载:
程序仿真.rar (103.09 KB, 下载次数: 60)
回复

使用道具 举报

ID:559866 发表于 2019-6-11 21:35 | 显示全部楼层
i2c.h找不到怎么班
回复

使用道具 举报

ID:560917 发表于 2019-6-12 14:59 | 显示全部楼层
谢谢你的分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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