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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機可控電源Proteus仿真程序 電路涉及到A/D、D/A轉換

[復制鏈接]
跳轉到指定樓層
樓主
可控電源,電壓可在1.25伏到9伏之間設定,電路涉及到A/D、D/A轉換、矩陣鍵盤和LED顯示。PROTEUS仿真圖和代碼見附件。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg51.h>
  2. //#include<DAC0832.c>
  3. //#include<ADC0832.c>
  4. //#include <absacc.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. //#define DAC0832 XBYTE[0xfffe]          
  8. /************I/O口定義*********/
  9. sbit CS=P2^3;         //ADC0832的片選端
  10. sbit CLK=P2^2;         //時鐘端
  11. sbit DIO=P2^1;         //數據輸入輸出端
  12. sbit  up=P2^7;
  13. sbit down=P3^0;
  14. sbit L1=P2^4;
  15. sbit L2=P2^5;
  16. sbit L3=P2^6;
  17. sbit WR2=P2^0;
  18. sbit LED1=P2^7;
  19. sbit LED2=P3^7;
  20. uint cdi=0,dy=0;
  21. uchar key=12,flag=0,h=0,m=0,l=0;
  22. uint ge,dian,xiao1,xiao2;
  23. uchar code table[]={        //共陽數碼管顯示定義
  24. 0x03,0x9f,0x25,0x0d,
  25. 0x99,0x49,0x41,0x1f,
  26. 0x01,0x09};
  27. void delay();
  28. uint A_D();
  29. void display();
  30. void DAC();
  31. void key_test();

  32. void delay(uchar i)   //i=1延遲1ms
  33. {
  34.     uchar a,b,c;
  35.     for(c=i;c>0;c--)
  36.         for(b=142;b>0;b--)
  37.             for(a=2;a>0;a--);
  38. }

  39. void vol_up()
  40. {
  41.          cdi+=1;
  42.          DAC();
  43.             delay(1);
  44.          dy=A_D()*9/5;
  45.          ge=dy/51;                // 計算整數部分
  46.          dian=(dy%51)*100/51;        //計算小數部分
  47.          xiao1=dian/10;          //取小數點后第一位
  48.          xiao2=dian%10;           //去小數點后第二位
  49. }

  50. void vol_down()
  51. {
  52.          cdi-=1;
  53.          DAC();
  54.             delay(1);
  55.          dy=A_D()*9/5;
  56.          ge=dy/51;                // 計算整數部分
  57.          dian=(dy%51)*100/51;        //計算小數部分
  58.          xiao1=dian/10;          //取小數點后第一位
  59.          xiao2=dian%10;           //去小數點后第二位
  60. }
  61. /*****  
  62. *函數名稱:   void dispaly1()                     
  63. *輸入參數:  共0個參數;  
  64. *輸出參數:  共0個參數;  
  65. *返回值:    無;  
  66. *需儲存的參數: 共0個參數;      
  67. *功能介紹:         顯示電壓值                     
  68. *****/
  69. void display()
  70. {   
  71.         if(flag==0)
  72.         {
  73.         P1=table[ge]&0xfe;         
  74.         P1=table[ge]&0xfe;                  //顯示整數位,與0x01是為了顯示小數點       
  75.         L1=1;                
  76.         delay(1);
  77.         L1=0;
  78.         P1=table[xiao1];                 //顯示小數點后第一位
  79.         L2=1;
  80.         delay(1);
  81.         L2=0;
  82.         P1=table[xiao2];          //顯示小數點后第二位,
  83.         L3=1;
  84.         delay(1);
  85.         L3=0;
  86.         }
  87.         else
  88.         {
  89.         P1=table[h]&0xfe;         
  90.         P1=table[h]&0xfe;                  //顯示整數位,與0x01是為了顯示小數點       
  91.         L1=1;                
  92.         delay(1);
  93.         L1=0;
  94.         P1=table[m];                 //顯示小數點后第一位
  95.         L2=1;
  96.         delay(1);
  97.         L2=0;
  98.         P1=table[l];          //顯示小數點后第二位,
  99.         L3=1;
  100.         delay(1);
  101.         L3=0;
  102.         }
  103. }


  104. /*****  
  105. *函數名稱:   uchar A_D()                     
  106. *輸入參數:  共0個參數;  
  107. *輸出參數:  共0個參數;  
  108. *返回值:    有;  
  109. *需儲存的參數: 共0個參數;      
  110. *功能介紹:         采集電壓                    
  111. *****/
  112. uint A_D()
  113. {
  114.         uint dat;
  115.         uchar i;
  116.         CS=1;        //一個轉換周期開始
  117.         CLK=0;        //為第一個脈沖準備
  118.         CS=0;        //CS置0,片選有效
  119.         DIO=1;        //DIO置1,規定起始信號
  120.         CLK=1;        //第一個脈沖
  121.         CLK=0;        //第一個脈沖的下降沿,此前DIO必須是高電平
  122.         DIO=1;        //DIO置1,通道選擇信號
  123.         CLK=1;        //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入
  124.                         //兩位數據用于選擇通道,這里選通道CH1
  125.         CLK=0;        //第二個脈沖下降沿
  126.         DIO=1;//DI置1,選擇通道1
  127.         CLK=1;//第三個脈沖
  128.         CLK=0;//第三個脈沖下降沿
  129.         DIO=1;//第三個脈沖下沉沿之后,輸入端DIO失去作用,應置1
  130.         CLK=1;//第四個脈沖
  131.         for(i=0;i<8;i++)          //高位在前,循環8次讀出8位數據
  132.         {
  133.                 CLK=1;                   //第四個脈沖
  134.                 CLK=0;
  135.                 dat<<=1;                  //將下面存儲的低位數據右移
  136.                 dat|=(uchar)DIO; //將輸出數據DIO通過或運算存儲在dat最低位
  137.         }
  138.         CS=1;//片選無效
  139.         return dat;
  140. }

  141. void DAC()
  142. {       
  143.         P0 = cdi;
  144.         WR2=0;
  145.         WR2=1;
  146. }

  147. /*****  
  148. *函數名稱:   void key_test()                     
  149. *輸入參數:  共0個參數;  
  150. *輸出參數:  共0個參數;  
  151. *返回值:    無;  
  152. *需儲存的參數: 共0個參數;      
  153. *功能介紹:         鍵盤掃描程序,采用行反轉法對鍵盤進行掃描,確定鍵值                        
  154. *****/
  155. void key_test()
  156. {         
  157.         uchar temp=0;       
  158.                 delay(10);        //去抖
  159.                 if((P3&0x0f)!=0x0f)
  160.                 {
  161.                         temp=P3;
  162.                         P3=0x70;
  163.                         temp=temp|P3; //將行列值或即可得到每個鍵的編碼
  164.                         switch(temp)
  165.                         {
  166.                         case 0x3e:key=1;break; //1
  167.                         case 0x5e:key=2;break; //2
  168.                         case 0x6e:key=3;break; //3
  169.                         case 0x3d:key=4;break; //4
  170.                         case 0x5d:key=5;break; //5
  171.                         case 0x6d:key=6;break; //6
  172.                         case 0x3b:key=7;break; //7
  173.                         case 0x5b:key=8;break; //8
  174.                         case 0x6b:key=9;break; //9
  175.                         case 0x37:key=10;break;        //*
  176.                         case 0x57:key=0;break;        //0
  177.                         case 0x67:key=11;break;        //#
  178.                         default:key=12;
  179.                         }
  180.                         while((P3&0x70)!=0x70);        //判斷松手檢測
  181.                 }
  182. }
  183. void main()
  184. {
  185.         uint i=0;
  186.         uchar set_ok=0;
  187.         LED1=0;
  188.         DAC();
  189.         delay(1);
  190.         dy=A_D()*9/5;
  191.         ge=dy/51;                // 計算整數部分
  192.         dian=(dy%51)*100/51;        //計算小數部分
  193.         xiao1=dian/10;          //取小數點后第一位
  194.         xiao2=dian%10;           //去小數點后第二位
  195.         display();
  196.         while(1)
  197.         {               
  198.                          P3=0x0f;
  199.                  if((P3&0x0f)!=0x0f)
  200.                           { key_test();
  201.                                 if(key==10)                                   //設置鍵
  202.                                     {        LED1=1;
  203.                                             flag=1;
  204.                                             key=12;
  205.                                      }
  206.                                 else if(key==11)                   //確定鍵
  207.                                     {
  208.                                             flag=0;
  209.                                             LED1=0;
  210.                                             key=12;
  211.                                                   set_ok=1;
  212.                                      }
  213.                                                                                          
  214.                                 else if(key!=12)                         //其他數字鍵
  215.                                         {       
  216.                                            if(flag==1)
  217.                                            {
  218.                                               h=m;
  219.                                                   m=l;
  220.                                                   l=key;
  221.                                                   key=12;
  222.                                                 }
  223.                                          }                                               
  224.                             }

  225.                         if(set_ok==1)
  226.                         {
  227.                            set_ok=0;
  228.                            if(h>ge)
  229.                            {
  230.                               do
  231.                                   {vol_up();}
  232.                                   while(h>ge);
  233.                                 }
  234.                                 else if(h<ge)
  235.                                 {
  236.                                   do
  237.                                   {vol_down();}
  238.                                   while(h<ge);
  239.                                 }

  240.                                 if(m>xiao1)
  241.                            {
  242.                               do
  243.                                   {vol_up();}
  244.                                   while(m>xiao1);
  245.                                 }
  246.                                 else if(m<xiao1)
  247.                                 {
  248.                                   do
  249.                                   {vol_down();}
  250.                                   while(m<xiao1);
  251.                                 }
  252.                         }       
  253.                                                                
  254.                         display();
  255.                 }
  256. }
復制代碼

所有資料51hei提供下載:
可控電源.zip (62.27 KB, 下載次數: 59)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美 日韩 中文 | 国产精品久久久久久久久图文区 | 亚洲三区在线播放 | 日韩成人久久 | 99精品一区二区 | 国产91丝袜在线播放 | 亚洲一区二区在线 | 精品久久国产视频 | 国产精品成人免费 | 成人午夜精品 | 亚洲高清视频一区二区 | 亚洲福利在线观看 | www.夜夜骑 | 欧美国产激情二区三区 | 国产精品国产三级国产aⅴ中文 | 福利视频一区二区 | 国产精品久久久亚洲 | 中文字幕在线观看 | 欧美日韩福利 | 中文在线播放 | 亚洲黄色一级 | 91精品国产高清一区二区三区 | 亚洲精品乱码 | 欧美日韩在线观看一区 | 国产超碰人人爽人人做人人爱 | 二区在线视频 | 精品国产91 | 欧美一级二级三级 | 日韩在线观看中文字幕 | 国产亚洲网站 | a黄在线观看 | 中文字幕日韩一区二区 | 国产一级特黄视频 | 亚洲一区二区三区四区五区中文 | 久久久在线视频 | 91精品国产91久久久久久最新 | 国产精品久久久久久久久 | 久草久| 欧美一级免费看 | 一区二区久久 | 日韩一级欧美一级 |