找回密码
 立即注册

QQ登录

只需一步,快速开始

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

可调单片机DAC0832电压源Proteus仿真图与源程序

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include<string.h>

  3. typedef unsigned char u8;                 // 重命名类型u8简化代码编写
  4. typedef unsigned int u16;

  5. #define LCD1602_DATA_PORT         P2                // LCD1602的8位数据端口

  6. sbit gLcd1602_E         = P3^2;                // LCD1602控制总线的使能信号
  7. sbit gLcd1602_RW = P3^1;                // LCD1602控制总线的读写选择信号
  8. sbit gLcd1602_RS = P3^0;                // LCD1602控制总线的数据/命令选择信号

  9. sbit Key1 = P3^5;
  10. sbit Key2 = P3^7;

  11. float Output_DA = 200;

  12. void delay10ms(void)   
  13. {
  14.     unsigned char a,b,c;
  15.     for(c=1;c>0;c--)
  16.         for(b=38;b>0;b--)
  17.             for(a=130;a>0;a--);
  18. }

  19. void Lcd1602WaitNoBusy(void)  //忙检测函数,判断bit7是0,允许执行;1禁止
  20. {
  21.     unsigned char sta = 0;      //

  22.     LCD1602_DATA_PORT = 0xff;
  23.     gLcd1602_RS = 0;
  24.     gLcd1602_RW = 1;
  25.     do
  26.     {
  27.         gLcd1602_E = 1;
  28.         sta = LCD1602_DATA_PORT;
  29.         gLcd1602_E = 0;    //使能,用完就拉低,释放总线
  30.     }while(sta & 0x80);
  31. }

  32. void Lcd1602WriteCmd(unsigned char cmd)         
  33. {
  34.         Lcd1602WaitNoBusy();                // 先等待LCD1602处于不忙状态

  35.         gLcd1602_E = 0;                     // 禁止LCD
  36.         gLcd1602_RS = 0;                           // 选择发送命令模式
  37.         gLcd1602_RW = 0;                           // 选择写入模式        
  38.         LCD1602_DATA_PORT = cmd;    // 将1字节命令字放入8位并行数据端口
  39.         gLcd1602_E = 1;                          // 使能LED
  40.         gLcd1602_E = 0;                                // 禁止LCD
  41. }

  42. void Lcd1602WriteData(unsigned char dat)                        
  43. {
  44.         Lcd1602WaitNoBusy();                // 先等待LCD1602处于不忙状态

  45.         gLcd1602_E = 0;                     // 禁止LCD
  46.         gLcd1602_RS = 1;                           // 选择发送数据模式
  47.         gLcd1602_RW = 0;                           // 选择写入模式        
  48.         LCD1602_DATA_PORT = dat;    // 将1字节命令字放入8位并行数据端口
  49.         gLcd1602_E = 1;                          // 使能LED
  50.         gLcd1602_E = 0;                                // 禁止LCD
  51. }

  52. void Lcd1602SetCursor(unsigned char x,unsigned char y)          // 坐标显示
  53. {
  54.     unsigned char addr = 0;

  55.            switch (y)
  56.         {
  57.                 case 0:                                                 // 上面一行
  58.                         addr = 0x00 + x;                break;        
  59.                 case 1:                                                // 下面一行
  60.                         addr = 0x40 + x;                 break;
  61.                 default:
  62.                                                                         break;
  63.         }
  64.     Lcd1602WriteCmd(addr | 0x80);
  65. }

  66. void Lcd1602ShowStr(unsigned char x, unsigned char y, unsigned char *pStr)     //显示字符串
  67. {
  68.     Lcd1602SetCursor(x, y);      //当前字符的坐标
  69.     while (*pStr != '\0')
  70.     {
  71.         Lcd1602WriteData(*pStr++);
  72.     }
  73. }

  74. void Lcd1602Init(void)                                                
  75. {
  76.          Lcd1602WriteCmd(0x38);          // 按照数据手册的初始化时序,先发送38H
  77.         delay10ms();                                        // 延时10ms
  78.         Lcd1602WriteCmd(0x38);          // 按照数据手册的初始化时序,先发送38H
  79.         delay10ms();                                        // 延时10ms
  80.         Lcd1602WriteCmd(0x38);          // 按照数据手册的初始化时序,先发送38H
  81.         delay10ms();                                        // 延时10ms
  82.         Lcd1602WriteCmd(0x38);                // 显示模式设置
  83.         Lcd1602WriteCmd(0x08);                // 关闭显示
  84.         Lcd1602WriteCmd(0x01);                // 清屏(同时清数据指针)
  85.         Lcd1602WriteCmd(0x06);                // 读写后指针自动加1,写1个字符后整屏显示不移动
  86.         Lcd1602WriteCmd(0x0c);                // 开显示,不显示光标
  87.         
  88.         Lcd1602ShowStr(0,0,"OutputVolt:    V");        
  89. }

  90. /*************** 显示函数 *************************************************/
  91. void Write_Volt(unsigned char hang,unsigned char add,unsigned int date)           //用于显示
  92. {
  93.         if(hang==1)   
  94.                 Lcd1602WriteCmd(0x80+add);
  95.         else
  96.                 Lcd1602WriteCmd(0x80+0x40+add);
  97.         Lcd1602WriteData(0x30+date%1000/100);         //显示百位
  98.         Lcd1602WriteData(0x30+date%100/10);                 //显示十位
  99.         Lcd1602WriteData('.');                                         //显示.
  100.         Lcd1602WriteData(0x30+date%10);                         //显示个位
  101.         Lcd1602WriteData('V');                                         //显示字母V
  102. }

  103. void Out_Volt(unsigned char Volt)
  104. {                 
  105.         P0=Volt;
  106. }

  107. void main()
  108. {
  109.         Lcd1602Init();
  110.         while (1)
  111.         {
  112.                 Out_Volt(Output_DA);
  113.                
  114.                 if (Key1 == 0)        
  115.                 {
  116.                         delay10ms();               
  117.                         if (Key1 == 0)                        
  118.                         {
  119.                                 if(Output_DA < 200) Output_DA += 2;
  120.                         }               
  121.                         while(!Key1);
  122.                 }
  123.                 if (Key2 == 0)        
  124.                 {
  125.                         delay10ms();               
  126.                         if (Key2 == 0)                        
  127.                         {
  128.                                 if(Output_DA >= 2) Output_DA -= 2;
  129.                         }                        
  130.                         while(!Key2);
  131.                 }
  132.                
  133.                 Write_Volt(1,11,Output_DA/2.0);
  134.         }         
  135. }
复制代码

Keil代码与Proteus仿真下载:
电压源DAC0832-1602-LM317.zip (144.66 KB, 下载次数: 96)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1062077 发表于 2023-3-15 20:58 | 只看该作者
很好的贴子顶一下,不过这个显示用LCD浪费了,数码管足矣
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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