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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3332|回復: 1
打印 上一主題 下一主題
收起左側

可調單片機DAC0832電壓源Proteus仿真圖與源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:321563 發(fā)表于 2021-12-24 17:46 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
仿真原理圖如下(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位數(shù)據(jù)端口

  6. sbit gLcd1602_E         = P3^2;                // LCD1602控制總線的使能信號
  7. sbit gLcd1602_RW = P3^1;                // LCD1602控制總線的讀寫選擇信號
  8. sbit gLcd1602_RS = P3^0;                // LCD1602控制總線的數(shù)據(jù)/命令選擇信號

  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)  //忙檢測函數(shù),判斷bit7是0,允許執(zhí)行;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處于不忙狀態(tài)

  35.         gLcd1602_E = 0;                     // 禁止LCD
  36.         gLcd1602_RS = 0;                           // 選擇發(fā)送命令模式
  37.         gLcd1602_RW = 0;                           // 選擇寫入模式        
  38.         LCD1602_DATA_PORT = cmd;    // 將1字節(jié)命令字放入8位并行數(shù)據(jù)端口
  39.         gLcd1602_E = 1;                          // 使能LED
  40.         gLcd1602_E = 0;                                // 禁止LCD
  41. }

  42. void Lcd1602WriteData(unsigned char dat)                        
  43. {
  44.         Lcd1602WaitNoBusy();                // 先等待LCD1602處于不忙狀態(tài)

  45.         gLcd1602_E = 0;                     // 禁止LCD
  46.         gLcd1602_RS = 1;                           // 選擇發(fā)送數(shù)據(jù)模式
  47.         gLcd1602_RW = 0;                           // 選擇寫入模式        
  48.         LCD1602_DATA_PORT = dat;    // 將1字節(jié)命令字放入8位并行數(shù)據(jù)端口
  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);          // 按照數(shù)據(jù)手冊的初始化時序,先發(fā)送38H
  77.         delay10ms();                                        // 延時10ms
  78.         Lcd1602WriteCmd(0x38);          // 按照數(shù)據(jù)手冊的初始化時序,先發(fā)送38H
  79.         delay10ms();                                        // 延時10ms
  80.         Lcd1602WriteCmd(0x38);          // 按照數(shù)據(jù)手冊的初始化時序,先發(fā)送38H
  81.         delay10ms();                                        // 延時10ms
  82.         Lcd1602WriteCmd(0x38);                // 顯示模式設置
  83.         Lcd1602WriteCmd(0x08);                // 關閉顯示
  84.         Lcd1602WriteCmd(0x01);                // 清屏(同時清數(shù)據(jù)指針)
  85.         Lcd1602WriteCmd(0x06);                // 讀寫后指針自動加1,寫1個字符后整屏顯示不移動
  86.         Lcd1602WriteCmd(0x0c);                // 開顯示,不顯示光標
  87.         
  88.         Lcd1602ShowStr(0,0,"OutputVolt:    V");        
  89. }

  90. /*************** 顯示函數(shù) *************************************************/
  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, 下載次數(shù): 104)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1062077 發(fā)表于 2023-3-15 20:58 | 只看該作者
很好的貼子頂一下,不過這個顯示用LCD浪費了,數(shù)碼管足矣
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久亚洲调教 | 天天曰夜夜操 | 国产精品免费一区二区三区四区 | 狠狠爱一区二区三区 | 91视视频在线观看入口直接观看 | yiren22综合网成人 | 日韩精品一区二区三区在线播放 | 亚洲一区中文字幕 | 一级片成人 | av日韩在线播放 | 风间由美一区二区三区在线观看 | 亚洲一区二区三区在线 | 精品不卡| 欧美一区二区三区在线播放 | 久久爱一区 | 欧美成人免费在线 | 中文精品视频 | 国产乱码精品一区二区三区五月婷 | 精品一区二区久久久久久久网精 | 日韩一级欧美一级 | 北条麻妃99精品青青久久 | av网站在线播放 | xx性欧美肥妇精品久久久久久 | 亚洲激情专区 | 久久精品久久精品久久精品 | 大乳boobs巨大吃奶挤奶 | 欧美性受xxxx白人性爽 | 日韩av在线一区二区 | 日韩精品 电影一区 亚洲 | 欧美在线观看一区 | 亚洲视频免费在线观看 | 天堂综合网久久 | 成人精品国产免费网站 | 操操操日日日 | 人干人人 | 青青草国产在线观看 | 狠狠亚洲 | 国产日韩一区 | 久久久久国产 | 日韩国产中文字幕 | 欧美日韩在线不卡 |