登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看3921|回2|收藏
楼主 ID:236695 只看他
2021-11-7 21:05
电路原理图如下:
截图格式 双击可以打开.png

制作出来的实物图如下:
照片 (2).JPG 照片 (1).JPG

元件型号    元件名称    元件标号
TL431    稳压    1
10uF    电解电容    C1
20pf    瓷片电容    C2, C3
220UF    电解电容    C5, C8
104    瓷片电容    C6, C9
发光二极管    发光二极管    D1
SMG04_1    数码管    DS1
ADJ    接线柱    J1
电源输入    电源    P1
9012    三极管    Q1, Q2, Q3, Q4
1K    电阻    R1, R2, R3, R4, R8, R10, R11, R12,R13
0.1    大电阻    R7
10K    电阻    R5,R9
103    可调电阻    RT1
SW-PB    按键    S1, S2, S3, S4, S5
电源开关    电源开关    SW1
STC89C52    单片机    U1
TLC5615    DA转换芯片     U2
9Z24N    场效应管    U3
LM358    运放芯片     U4
ADC0832    AD采集芯片     U5
7805    稳压芯片    VR1
12M    晶振     Y1

单片机源程序如下:

代码:

  1. #include "reg52.h"

  2. //宏定义
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. //按键定义
  6. sbit KEY1= P3^7;
  7. sbit KEY2= P3^6;
  8. sbit KEY3= P3^5;
  9. sbit KEY4= P3^4;

  10. //数码管定义
  11. sbit W1= P2^6;
  12. sbit W2= P2^4;
  13. sbit W3= P2^2;
  14. sbit W4= P2^0;

  15. //DAC定义
  16. sbit  CS_5615=P1^5;
  17. sbit CLK_5615=P1^6;
  18. sbit DAT_5615=P1^7;

  19. //ADC定义
  20. sbit  CS=P1^2;      
  21. sbit CLK=P1^1;      
  22. sbit DIO=P1^0;
  23.   
  24. uint  U;
  25. uchar GETU=0;
  26. bit flag=0;
  27. uint  a=0;

  28. uchar code table[]=
  29. {
  30.         0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7
  31. };        //共阳数码管段码表        没有小数点 0~9
  32. uchar code table1[]=
  33. {
  34.         0x7F,0x64,0xBD,0xF5,0xE6,0xF3,0xFB,0x67,0xFF,0xF7,0x5e
  35. };//带小数点的编码            0~9


  36. void delay_ms(uint z)                          //延时函数
  37. {
  38.   uint a,b;
  39.   for(a=z;a>0;a--)
  40.    for(b=5;b>0;b--);
  41. }

  42. void  shuma(uint buf)
  43. {
  44.         uchar a,b,c,d;
  45.         a=buf/1000;
  46.         b=buf%1000/100;
  47.         c=buf%100/10;
  48.         d=buf%10;

  49.         W1=0;W2=1;W3=1;W4=1;        
  50.         P0=~table[a];
  51.         delay_ms(60);

  52.         W1=1;W2=0;W3=1;W4=1;
  53.         P0=~table1[b];
  54.         delay_ms(60);

  55.         W1=1;W2=1;W3=0;W4=1;
  56.         P0=~table[c];
  57.         delay_ms(60);

  58.         W1=1;W2=1;W3=1;W4=0;
  59.         P0=~table1[10];
  60.         delay_ms(60);
  61. }

  62. void tlc_5615(uint buf)
  63. {
  64.         uint a,c;
  65.         c=buf;   
  66.     CS_5615=0;
  67.         for(a=16;a>0;a--)
  68.         {
  69.          DAT_5615=c>>15;      
  70.          c=c<<1;
  71.          CLK_5615=1;
  72.          CLK_5615=0;                 
  73.     }
  74.         CLK_5615=1;
  75.         CLK_5615=0;
  76.         CLK_5615=1;
  77.         CLK_5615=0;
  78.         CS_5615=1;
  79. }

  80. unsigned int  A_D()
  81. {
  82.         unsigned char i,dat;
  83.         CS=1;   //一个转换周期开始
  84.         CLK=0;  //为第一个脉冲作准备
  85.         CS=0;  //CS置0,片选有效
  86.         
  87.         DIO=1;    //DIO置1,规定的起始信号  
  88.         CLK=1;   //第一个脉冲
  89.         CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平
  90.         DIO=1;   //DIO置1, 通道选择信号  
  91.         CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
  92.         CLK=0;   //第二个脉冲下降沿
  93.         DIO=0;   //DI置0,选择通道0
  94.         CLK=1;    //第三个脉冲
  95.         CLK=0;    //第三个脉冲下降沿
  96.         DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1
  97.         CLK=1;    //第四个脉冲
  98.         for(i=0;i<8;i++)  //高位在前
  99.         {
  100.                 CLK=1;         //第四个脉冲
  101.                 CLK=0;
  102.                 dat<<=1;       //将下面储存的低位数据向右移
  103.                 dat|=(unsigned char)DIO;          //将输出数据DIO通过或运算储存在dat最低位
  104.         }                                 
  105.         CS=1;          //片选无效
  106.         return dat;         //将读出的数据返回     
  107. }


  108. //主函数
  109. void main(void)
  110. {
  111.         U=0;
  112.         while(1)
  113.         {
  114.                 tlc_5615(U);
  115.                 shuma(U/8*10);
  116.                 if(flag==0)
  117.                 {
  118.                         if(KEY1==0)
  119.                         {
  120.                                 shuma(U/8*10);
  121.                                 shuma(U/8*10);
  122.                                 shuma(U/8*10);
  123.                                 shuma(U/8*10);
  124.                                 shuma(U/8*10);
  125.                                 if(KEY1==0)
  126.                                 {
  127.                                         if(U<960)        //1V对应的是80  10位ad
  128.                                         U=U+8;
  129.                                 }        
  130.                         }
  131.                         if(KEY2==0)
  132.                         {
  133.                                 shuma(U/8*10);
  134.                                 shuma(U/8*10);
  135.                                 shuma(U/8*10);
  136.                                 shuma(U/8*10);
  137.                                 shuma(U/8*10);
  138.                                 if(KEY2==0)
  139.                                 {
  140.                                         if(U>=8)
  141.                                         U=U-8;
  142.                                 }        
  143.                         }                        
  144.                         if(KEY3==0)
  145.                         {
  146.                                 shuma(U/8*10);
  147.                                 shuma(U/8*10);
  148.                                 shuma(U/8*10);
  149.                                 shuma(U/8*10);
  150.                                 shuma(U/8*10);
  151.                                 if(KEY3==0)
  152.                                 {
  153.                                         U=400;        
  154.                                 }        
  155.                         }        
  156.                         if(KEY4==0)
  157.                         {
  158.                                 shuma(U/8*10);
  159.                                 shuma(U/8*10);
  160.                                 shuma(U/8*10);
  161.                                 shuma(U/8*10);
  162.                                 shuma(U/8*10);
  163.                                 if(KEY4==0)
  164.                                 {
  165.                                         U=0;
  166.                                 }        
  167.                         }
  168.                 }
  169.                 GETU=A_D();
  170.                 if(GETU>=12)   //0.0196V
  171.                 {
  172.                         U=0;
  173.                          a=0;
  174.                         flag=1;
  175.                 }                                
  176.         }
  177. }

单片机是通用的无论51还是52、无论stc还是at都一样,引脚功能都一样,原理图和程序也是一样的。
原理图中的. sch等格式是要用protel99se打开的,没有软件的不要紧,我已帮您转换成word格式和pdf格式的了。
程序中的.c文件可以用记事本打开,就是程序了。其他的是写程序是自动生成的,没什么用的。

程序原理图下载:
资料.7z (2.22 MB)
(下载次数: 90, 2021-11-13 04:37 上传)

下载积分: 黑币 -5


沙发 ID:987418 只看他
2021-12-16 17:39
这个输出的范围是多少啊
板凳 ID:994114 只看他
2021-12-19 20:27
这个输出范围是多少

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版