找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数控稳压电源的设计教程(详细讲解)

  [复制链接]
跳转到指定楼层
楼主
ID:248123 发表于 2017-11-20 20:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、系统综述:
该项设计的主要目的是设计一种数控稳压电源。它利用单片机STC89C51作为主控芯片,控制数字/模拟转换器(TLC5615)的输出电压的大小,经过运算放大器(OPA2107)与IRF9Z24N构成负反馈系统,从而输出恒定电压。最后通过电位器分压将输出信号反馈到运算放大器(OPA2107)上,使输出准确度可以调节。此设计通过键盘电路与单片机连接,读入控制数据,利用软件进行判断,从而起到控制电源输出的作用。通过LCD1602(或LED数码管)显示数控电源的输出电压,实现简单的人机对话。该项设计具有设计简单,控制灵活,调节方便,携带方便、成本低等优势,具有较强的实用性。
总体电路图(数码管版)
要求有短路保护的才有对应的电路,此图为完整版及带短路保护的。
总体电路图(液晶版)
要求有短路保护的才有对应的电路,此图为完整版及带短路保护的。
图中采用网络标号的方式,标号相同的代表有电气连接!
二、原理讲解:
供电部分:
P2为接线柱,是整个系统的输入电压端口,整个数控电源有此输入能量。D1、D2、D3、D4为四个二极管(in4007),起整流的作用,C6为滤波电容。整流滤波电路是使供电可以为交流,同时也可以用直流供电(交流供电不要超过20V,直流不要超过35V)。受电压限制的主要是后级运放耐压、TL431耐压以及7812的耐压值。7812主要为保护7805,7805稳出5V电压共单片机供电使用。但是7805耐压值是15V,所以前级要加7812保护7805。

晶振部分:
C2、C3、Y1(12MHZ)与单片机端口构成震荡电路,为51单片机提供时钟。
复位电路:
RST连接单片机复位管脚,此电路及有上电复位功能,又有手动复位功能。C1、R2构成上电复位电路,上电瞬间C1导通,则RST为高电平,单片机将复位,电压稳定后C1储存的电能通过R2对地释放掉,单片机将正常运行。同样K2按下时RST为高电平,单片机复位,弹起来时RST为低电平,单片机正常运行。

单片机部分:
单片机默认选用STC89C51,同时兼容STC89C52、AT89S52、AT89S51、AT89C51等51单片机。
按键部分:
按键选用独立按键,扫描时间短,使程序更简单且扫描时间更短,从而提高稳定性。按键弹起时P20、P21、P22、P23为弱上拉状态,所以为高电平。按键按下时对应的I/O口为低电平,可以被程序中的扫描函数检测到。(写文档时没什么写的,可以在此讲解自弹按键与自锁按键区别和原理,在此朱老师省略。)

数码管显示部分:
(写文档时,可以在此讲解共阳数码管与共阴数码管的区别和原理,在此朱老师省略。)
数码管显示采用四位一体共阳数码管,这样使电路更为简单,只需四个8550三极管就可以将其驱动。P24、P25、P26、P27分别作为数码管的位选端,控制是否选通哪一位数码管。采用PNP型三极管,低电平导通,高电平截止(写文档时可以在此处讲解8550三极管的参数等信息,朱老师在此省略)。R20、R30、R40、R50为三极管基极限流电阻,此电阻及能保护三极管又能保证三极管导通时处于完全导通状态。R51为限流电阻,此电阻的大小直接决定数码管的亮暗成都,在此选择220欧姆、1/4色环电阻。数码管的阴极端直接接单片机的P0口,而不需上拉电阻。STC89C51的单片机P0口为漏极开路,所以作为输出时必须接上拉电路,而作为输入时相当于数码管作为上拉,所以不再需要上拉电阻,及简化了电路又节省了成本。
数模转换部分:(此为数控电压数控调压关键所在)
(写文档时没什么写的,可以在此讲解TLC5615技术参数和原理,特别是转换公式和数据协议,在此朱老师简单介绍。)
数模转换采用德州仪器的TLC5615,此为一片10位串行单5V电源DAC,直接电压输出。单片机P33、P32、P34分别连接TLC5615的时钟端、片选端、数据端即可控制它输出想要的电压。此时TLC5615的6脚及参考电压输入端需接入2.5V的参考电压。根据公式可知,当参考电压为2.5V时,TLC5615将最大输出5V电压。
TL5615(DAC)电压计算公式

Vout为7脚输出电压,Vrefin为6脚参考电压输入端,N为单片机通过1、2、3管脚向TLC5615写入的数据,1024是根据这是一片10位数模转换而计算出来的(210=1024),最后乘以二是因为TLC5615内部有2倍的增益放大器。
TLC5615内部原理图:
                         TLC5615逻辑时序图:

在给TLC输入2.5V参考电压的时候,我们用了TL431芯片。TL431是可控精密稳压源。它的输出电压用两个电阻就可以任意的设置到从Verf(2.5V)到36V范围内的任何值。该器件的典型动态阻抗为0.2Ω,在很多应用中用它代替稳压二极管。
同时用OPA2107作为跟随器,减小2.5V基准电源的阻抗,再送入TLC5615 参考电压端。
(写文档时,可以在此讲解TL41技术参数OPA2107技术参数和原理和跟随器电路原理)

MOS放大部分:
将上述TLC5615输出的可调电压送到误差放大器(OPA2107)的反相端,通过PMOS管(F9Z24N)放大。同时在F9Z24N的输出端用RW1(10K)电位器分压,取一定比例的输出电压反馈到比较器正相端,构成一个负反馈系统(PMOS是反相放大,所以是负反馈)以保证输出电压的稳定。C5作为输出滤波电容,滤掉输出电压纹波。根据反馈系统的稳定原理计算出输出电压的公式,如下:
设:Vo为输出电压,Vin为OPA2107的2脚输入电压,RWH为电位器上部分电阻,RWL为电位器下部分电阻,RW为电位器阻值。
Vo=Vin×(RW/RWL);
(写文档时,可以在此讲解F9Z24N技术参数)
过流检测及短路保护:
P1为电源输出端,R11为电流检测电阻,此电阻将电流变换成电压。再通过U4A(OPA2107)反相放大一定的倍数。最后通过U4B与2.5V标准电平比较,若电压大于2.5V则输出低电平,送给单片机。单片机则认为过流就会控制TLC5615将输出将为0V。这样就起到了限流与短路保护的作用。
(写文档时,可以在此讲解反相比例运算电路的原理)
报警电路:
此电路可以由单片机控制三极管(8550)的通断来控制蜂鸣器的报警。当P36为高时,三极管不高通,为低时三极管导通蜂鸣器响。当过流或短路时,单片机切断输出,同时蜂鸣器报名。

单片机源程序如下:
  1. <font color="rgb(0, 0, 0)">#include<reg52.h>   
  2. #define uint unsigned int  
  3. #define uchar unsigned char  
  4. uchar a,miao,shi,fen,ri,yue,nian,week,key1n,key4n,key3n;alarmflag,temp;
  5. char amiao,afen,ashi;
  6. bit flag=0;
  7. #define yh 0x80
  8. #define er 0x80+0x40
  9. sbit rw=P3^6;
  10. sbit rs=P3^5;
  11. sbit en=P3^4;
  12. sbit IO=P1^1;
  13. sbit RST=P1^2;
  14. sbit SCLK=P1^0;
  15. sbit ACC0=ACC^0;
  16. sbit ACC7=ACC^7;
  17. //sbit key5=P1^3;
  18. sbit key1=P3^0;
  19. sbit key2=P3^1;
  20. sbit key3=P3^2;
  21. sbit key4=P3^3;
  22. sbit beep=P2^4;
  23. uchar code tab1[]={"20  -  -   "};
  24. uchar code tab2[]={"  :  :  "};
  25. uchar code tab3[]={" alarm setting: "};
  26. uchar code tab4[]={"Now is the time!"};
  27. uchar code tab5[]={"Get up quickly! "};
  28. uchar code tab6[]={"HAPPY EVERY DAY!"};
  29. uchar cnt;
  30. void delay(uint xms)
  31. {
  32. uint x,y;
  33. for(x=xms;x>0;x--)
  34. for(y=110;y>0;y--);
  35. }
  36. void write_1602com(uchar com)
  37. {
  38. rs=0;
  39. rw=0;
  40. P0=com;
  41. delay(1);
  42. en=1;
  43. delay(1);
  44. en=0;
  45. }
  46. void write_1602dat(uchar dat)
  47. {
  48. rs=1;
  49. rw=0;
  50. P0=dat;
  51. delay(1);
  52. en=1;
  53. delay(1);
  54. en=0;
  55. }
  56. void lcd_init()      
  57. {
  58.   write_1602com(0x38);
  59. write_1602com(0x08);  
  60. write_1602com(0x0c);  
  61. write_1602com(0x06);  
  62. write_1602com(0x01);
  63.      write_1602com(yh+1);
  64. for(a=0;a<14;a++)
  65. {
  66.     delay(5);
  67.      write_1602dat(tab1[a]);
  68. }
  69.   write_1602com(er+2);
  70.   for(a=0;a<8;a++)
  71. {
  72.   delay(5);
  73.   write_1602dat(tab2[a]);
  74. }
  75. }
  76. void write_byte(uchar dat)
  77. {
  78. ACC=dat;
  79. RST=1;
  80. for(a=8;a>0;a--)
  81. {
  82.   IO=ACC0;
  83.   SCLK=0;
  84.   SCLK=1;
  85.   ACC=ACC>>1;
  86. }
  87. }
  88. uchar read_byte()
  89. {
  90. RST=1;
  91. for(a=8;a>0;a--)
  92. {
  93.   ACC7=IO;
  94.   SCLK=1;
  95.   SCLK=0;
  96.   ACC=ACC>>1;
  97. }
  98. return(ACC);
  99. }
  100. void write_1302(uchar add,uchar dat)
  101. {
  102. RST=0;
  103. SCLK=0;
  104. RST=1;
  105. write_byte(add);
  106. write_byte(dat);
  107. SCLK=1;
  108. RST=0;
  109. }
  110. uchar read_1302(uchar add)
  111. {
  112. uchar temp;
  113. RST=0;
  114. SCLK=0;
  115. RST=1;
  116. write_byte(add);
  117. temp=read_byte();
  118. SCLK=1;
  119. RST=0;
  120. return(temp);
  121. }
  122. uchar BCD_Decimal(uchar bcd)
  123. {
  124. uchar Decimal;
  125. Decimal=bcd>>4;
  126. return(Decimal=Decimal*10+(bcd&=0x0f));
  127. }
  128. void ds1302_init()
  129. {
  130. RST=0;
  131. SCLK=0;
  132. write_1302(0x8e,0x00);
  133. write_1302(0x8e,0x80);
  134. }
  135. void write_sfm(uchar add,uchar dat)
  136. {
  137. uchar gw,sw;
  138. gw=dat%10;
  139. sw=dat/10;
  140. write_1602com(er+add);
  141. write_1602dat(0x30+sw);
  142. write_1602dat(0x30+gw);
  143. }
  144. void write_nyr(uchar add,uchar dat)
  145. {
  146.   uchar gw,sw;
  147.   gw=dat%10;
  148.   sw=dat/10;
  149.   write_1602com(yh+add);
  150.   write_1602dat(0x30+sw);
  151.   write_1602dat(0x30+gw);
  152. }
  153. void write_week(uchar week)
  154. {
  155. write_1602com(yh+0x0c);
  156. switch(week)
  157. {
  158.   case 1:write_1602dat('M');write_1602dat('O');write_1602dat('N');break;
  159.   case 2:write_1602dat('T');write_1602dat('U'); write_1602dat('E');break;
  160.   case 3:write_1602dat('W');write_1602dat('E');write_1602dat('D');break;
  161.   case 4:write_1602dat('T');write_1602dat('H');write_1602dat('U');break;
  162.   case 5:write_1602dat('F');write_1602dat('R');write_1602dat('T');break;
  163.   case 6:write_1602dat('S');write_1602dat('T');write_1602dat('A');break;
  164.   case 7:write_1602dat('S');write_1602dat('U');write_1602dat('N');break;
  165. }
  166. }
  167. void settime()
  168. {
  169. if(key4n==0)
  170. {
  171.   if(key1==0)
  172.     {
  173.    delay(9);
  174.    if(key1==0)
  175.    {
  176.        beep=0;//蜂鸣器短响一声
  177.              delay(50);
  178.              beep=1;
  179.     alarmflag=0;
  180.     key1n++;
  181.     while(!key1);
  182.     switch(key1n)
  183.     {
  184.      case 1:TR0=0;
  185.            write_1602com(er+0x09);
  186.         write_1602com(0x0f);
  187.         temp=(miao)/10*16+(miao)%10;
  188.         write_1302(0x8e,0x00);
  189.         write_1302(0x80,0x80|temp);//miao
  190.         write_1302(0x8e,0x80);
  191.         break;
  192.      case 2:write_1602com(er+6);
  193.            break;
  194.         case 3:write_1602com(er+3);
  195.            break;
  196.         case 4:write_1602com(yh+0x0e);
  197.            break;
  198.      case 5:write_1602com(yh+0x0a);
  199.            break;
  200.      case 6:write_1602com(yh+0x07);
  201.         break;
  202.      case 7:write_1602com(yh+0x04);
  203.            break;
  204.      case 8:key1n=0;
  205.            write_1602com(0x0c);
  206.            alarmflag=1;      
  207.            TR0=1;
  208.         temp=(miao)/10*16+(miao)%10;
  209.         write_1302(0x8e,0x00);
  210.         write_1302(0x80,0x00|temp);
  211.         write_1302(0x8e,0x80);
  212.         break;
  213.    }
  214.   }
  215.   
  216. }
  217. if(key1n!=0)
  218. {
  219.   if(key2==0)
  220.   {
  221.    delay(10);
  222.    if(key2==0)
  223.    {
  224.     beep=0;//蜂鸣器短响一声
  225.                 delay(50);
  226.                 beep=1;
  227.     while(!key2);
  228.     switch(key1n)
  229.     {
  230.      case 1:miao++;
  231.      if(miao==60)
  232.          miao=0;
  233.         write_sfm(0x08,miao);
  234.         temp=(miao)/10*16+(miao)%10;
  235.         write_1302(0x8e,0x00);
  236.         write_1302(0x80,temp);
  237.         write_1302(0x8e,0x80);
  238.         write_1602com(er+0x09);
  239.         break;
  240.      case 2:fen++;
  241.      if(fen==60)
  242.          fen=0;
  243.         write_sfm(0x05,fen);
  244.         temp=(fen)/10*16+(fen)%10;
  245.         write_1302(0x8e,0x00);
  246.         write_1302(0x82,temp);
  247.         write_1302(0x8e,0x80);
  248.         write_1602com(er+6);
  249.         break;
  250.      case 3:shi++;
  251.      if(shi==24)
  252.          shi=0;
  253.         write_sfm(2,shi);
  254.         temp=(shi)/10*16+(shi)%10;
  255.         write_1302(0x8e,0x00);
  256.         write_1302(0x84,temp);
  257.         write_1302(0x8e,0x80);
  258.         write_1602com(er+3);
  259.         break;
  260.      case 4:week++;
  261.      if(week==8)
  262.          week=1;
  263.         write_1602com(yh+0x0e);
  264.         write_week(week);
  265.         temp=(week)/10*16+(week)%10;
  266.         write_1302(0x8e,0x00);
  267.         write_1302(0x8a,temp);
  268.         write_1302(0x8e,0x80);
  269.         write_1602com(yh+0x0e);
  270.         break;
  271.      case 5:ri++;
  272.      if(ri==32)
  273.          ri=1;
  274.         write_nyr(9,ri);
  275.         temp=(ri)/10*16+(ri)%10;
  276.         write_1302(0x8e,0x00);
  277.         write_1302(0x86,temp);
  278.         write_1302(0x8e,0x80);
  279.         write_1602com(yh+10);
  280.         break;
  281.      case 6:yue++;
  282.      if(yue==13)
  283.          yue=1;
  284.         write_nyr(6,yue);
  285.         temp=(yue)/10*16+(yue)%10;
  286.         write_1302(0x8e,0x00);
  287.         write_1302(0x88,temp);
  288.         write_1302(0x8e,0x80);
  289.         write_1602com(yh+7);
  290.         break;
  291.      case 7:nian++;
  292.      if(nian==100)
  293.          nian=0;
  294.         write_nyr(3,nian);
  295.         temp=(nian)/10*16+(nian)%10;
  296.         write_1302(0x8e,0x00);
  297.         write_1302(0x8c,temp);
  298.         write_1302(0x8e,0x80);
  299.         write_1602com(yh+4);
  300.         break;
  301.     }
  302.    }
  303.   }
  304.   if(key3==0)
  305.   {
  306.    delay(10);
  307.    if(key3==0)
  308.    {
  309.     beep=0;//蜂鸣器短响一声
  310.                 delay(50);
  311.        beep=1;
  312.     while(!key3);
  313.     switch(key1n)
  314.     {
  315.      case 1:miao--;
  316.      if(miao==-1)
  317.          miao=59;
  318.         write_sfm(0x08,miao);
  319.         temp=(miao)/10*16+(miao)%10;
  320.         write_1302(0x8e,0x00);
  321.         write_1302(0x80,temp);
  322.         write_1302(0x8e,0x80);
  323.         write_1602com(er+0x09);
  324.         break;
  325.      case 2:fen--;
  326.      if(fen==-1)
  327.          fen=59;
  328.         write_sfm(5,fen);
  329.         temp=(fen)/10*16+(fen)%10;
  330.         write_1302(0x8e,0x00);
  331.         write_1302(0x82,temp);
  332.         write_1302(0x8e,0x80);
  333.         write_1602com(er+6);
  334.         break;
  335.      case 3:shi--;
  336.      if(shi==-1)
  337.          shi=23;
  338.         write_sfm(2,shi);
  339.         temp=(shi)/10*16+(shi)%10;
  340.         write_1302(0x8e,0x00);
  341.         write_1302(0x84,temp);
  342.         write_1302(0x8e,0x80);
  343.         write_1602com(er+3);
  344.         break;
  345.      case 4:week--;
  346.      if(week==-0)
  347.          week=7;
  348.         write_1602com(yh+0x0c);
  349.         write_week(week);
  350.         temp=(week)/10*16+(week)%10;
  351.         write_1302(0x8e,0x00);
  352.         write_1302(0x8a,temp);
  353.         write_1302(0x8e,0x80);
  354.         write_1602com(yh+0x0e);
  355.         break;
  356.      case 5:ri--;
  357.      if(ri==0)
  358.          ri=31;
  359.         write_nyr(9,ri);
  360.         temp=(ri)/10*16+(ri)%10;
  361.         write_1302(0x8e,0x00);
  362.         write_1302(0x86,temp);
  363.         write_1302(0x8e,0x80);
  364.         write_1602com(yh+10);
  365.         break;
  366.      case 6:yue--;
  367.      if(yue==0)
  368.          yue=12;
  369.         write_nyr(6,yue);
  370.         temp=(yue)/10*16+(yue)%10;
  371.         write_1302(0x8e,0x00);
  372.         write_1302(0x88,temp);
  373.         write_1302(0x8e,0x80);
  374.         write_1602com(yh+7);
  375.         break;
  376.      case 7:nian--;
  377.      if(nian==-1)
  378.          nian=99;
  379.         write_nyr(3,nian);
  380.         temp=(nian)/10*16+(nian)%10;
  381.         write_1302(0x8e,0x00);
  382.         write_1302(0x8c,temp);
  383.         write_1302(0x8e,0x80);
  384.         write_1602com(yh+4);
  385.         break;
  386.     }
  387.    }
  388.   }
  389.    
  390. }  
  391.   }  
  392. }
  393. void setalarm()
  394. { if(flag==0)
  395.   {if(key1n==0)
  396.    
  397.    {if(key4==0)
  398.   {
  399.    delay(10);
  400.    if(key4==0)
  401.     {  
  402.      beep=0;
  403.      delay(50);
  404.      beep=1;
  405.      while(!key4);
  406.         write_1602com(0x80);
  407.      for(a=0;a<16;a++)
  408.      {
  409.       write_1602dat(tab3[a]);
  410.      }
  411.    if(key4n==0)
  412.    {
  413.     write_1602com(er+0x09);write_sfm(8,amiao);
  414.     write_1602com(er+6);write_sfm(5,afen);
  415.     write_1602com(er+3);write_sfm(2,ashi);
  416.    }
  417.     beep=0;key4n++;
  418.    switch(key4n)
  419.    {
  420.     case 1:
  421.            write_1602com(er+0x06);
  422.         write_1602com(0x0f);
  423.         temp=(fen)/10*16+(fen)%10;
  424.         write_1302(0x8e,0x00);
  425.         write_1302(0x82,0x82|temp);//miao
  426.         write_1302(0x8e,0x80);
  427.         break;
  428.     case 2:write_1602com(er+3);
  429.            break;
  430.     case 3: key4n=0;
  431.       write_1602com(0x0c);
  432.            alarmflag=1;      
  433.             lcd_init();
  434.         temp=(fen)/10*16+(fen)%10;
  435.         write_1302(0x8e,0x00);
  436.         write_1302(0x82,0x00|temp);
  437.         write_1302(0x8e,0x80);
  438.         break;
  439.    }
  440.   }
  441.   
  442. }
  443. if(key4n!=0)
  444. {
  445.   if(key2==0)
  446.   {
  447.    delay(10);
  448.    if(key2==0)
  449.    {
  450.     beep=0;//蜂鸣器短响一声
  451.                 delay(50);
  452.                 beep=1;
  453.     while(!key2);
  454.     switch(key4n)
  455.     {
  456.      case 1:afen++;
  457.      if(afen==60)
  458.          afen=0;
  459.         write_sfm(0x05,afen);
  460.         temp=(fen)/10*16+(fen)%10;
  461.         write_1302(0x8e,0x00);
  462.         write_1302(0x82,temp);
  463.         write_1302(0x8e,0x80);
  464.         write_1602com(er+6);
  465.         break;
  466.      case 2:ashi++;
  467.      if(ashi==24)
  468.          ashi=0;
  469.         write_sfm(2,ashi);
  470.         temp=(shi)/10*16+(shi)%10;
  471.         write_1302(0x8e,0x00);
  472.         write_1302(0x84,temp);
  473.         write_1302(0x8e,0x80);
  474.         write_1602com(er+3);
  475.         break;
  476.   }
  477. }
  478.   }
  479.   if(key3==0)
  480.   {
  481.    delay(10);
  482.    if(key3==0)
  483.    {
  484.     beep=0;//蜂鸣器短响一声
  485.                 delay(50);
  486.        beep=1;
  487.     while(!key3);
  488.     switch(key4n)
  489.     {
  490.      
  491.      case 1:afen--;
  492.      if(afen==-1)
  493.          afen=59;
  494.         write_sfm(5,afen);
  495.         temp=(fen)/10*16+(fen)%10;
  496.         write_1302(0x8e,0x00);
  497.         write_1302(0x82,temp);
  498.         write_1302(0x8e,0x80);
  499.         write_1602com(er+6);
  500.         break;
  501.      case 2:ashi--;
  502.      if(ashi==-1)
  503.          ashi=23;
  504.         write_sfm(2,ashi);
  505.         temp=(shi)/10*16+(shi)%10;
  506.         write_1302(0x8e,0x00);
  507.         write_1302(0x84,temp);
  508.         write_1302(0x8e,0x80);
  509.         write_1602com(er+3);
  510.         break;
  511.    }
  512.   }
  513.    
  514. }  
  515.   }
  516. }   
  517. }
  518.   }
  519. void timealarm()
  520. {
  521. if(shi>7)//大于7点才启动报时
  522. {
  523.    if(alarmflag==1)//不按下设置按键时才有效
  524.    {
  525.   if(fen==0 && miao<2)
  526.   {
  527.    beep=0;//启动蜂鸣器
  528.   }
  529.   else if(fen==30 && miao==5)
  530.   {
  531.      beep=0;
  532.   }
  533.   else beep=1;
  534.    }
  535. }
  536. }
  537. void init()
  538. {

  539. TMOD=0X01;
  540. EA=1;
  541. TH0=(65536-60000)/256;
  542. TL0=(65536-60000)%256;
  543. ET0=1;
  544. TR0=1;
  545. }
  546. void nz()
  547. {
  548. beep=0;
  549. delay(500);
  550. }
  551. void alarmoff()//按任意键关闭闹铃函数
  552. {
  553. if(flag==1)
  554. {

  555. if(key1==0||key2==0||key3==0||key4==0)
  556. {
  557. delay(10);
  558. if(key1==0||key2==0||key3==0||key4==0)
  559. {
  560. while(key1==0||key2==0||key3==0||key4==0)
  561. flag=0;
  562. lcd_init();
  563. }
  564. }
  565. }
  566. }
  567. void main()
  568. { beep=1;
  569. alarmflag=1;
  570. lcd_init();
  571. flag=0;
  572. ds1302_init();
  573. init();
  574.      
  575. delay(10);     
  576. while(1)
  577. {
  578.   timealarm();        
  579.   settime();  
  580.      if(flag==1)
  581.   {
  582.        write_1602com(yh);
  583.     for(a=0;a<16;a++)
  584.    {
  585.       delay(5);
  586.        write_1602dat(tab4[a]);
  587.    }
  588.     write_1602com(er);
  589.     for(a=0;a<16;a++)
  590.    {
  591.     delay(5);
  592.     write_1602dat(tab5[a]);
  593.    }
  594.   }  
  595.   else if(flag==0&&key1n==0&&key4n==0)      
  596.   {  
  597.        miao=BCD_Decimal(read_1302(0x81));  
  598.     fen=BCD_Decimal(read_1302(0x83));
  599.     shi=BCD_Decimal(read_1302(0x85));     
  600.     ri=BCD_Decimal(read_1302(0x87));
  601.     yue=BCD_Decimal(read_1302(0x89));   
  602.     week=BCD_Decimal(read_1302(0x8b));
  603.     nian=BCD_Decimal(read_1302(0x8d));   
  604.     write_sfm(8,miao);
  605.     write_sfm(5,fen);
  606.     write_sfm(2,shi);
  607.     write_nyr(9,ri);
  608.     write_nyr(6,yue);
  609.     write_nyr(3,nian);
  610.     write_week(week);
  611.   }
  612.   if((shi==ashi)&&(fen==afen))
  613.   {
  614.    if(0<miao&&miao<2)  
  615.       { nz();
  616.     flag=1;
  617.    }
  618.    
  619.   }  else  flag=0;beep=1;
  620.   setalarm();
  621.   alarmoff();
  622. }
  623.   }
复制代码

仅供参考

评分

参与人数 5黑币 +31 收起 理由
2712798427 + 5 绝世好帖!非常详细,谢谢老师分享!
fengwq + 5 回帖助人的奖励!
哎呀哎呀 + 1
aifengdian + 5 很给力!
GUOXUAN + 15 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:249545 发表于 2017-11-23 15:30 | 只看该作者
设计教程非常好!
感谢老师不舍昼夜写文分享.
回复

使用道具 举报

板凳
ID:287040 发表于 2018-3-2 20:02 来自手机 | 只看该作者
正要学习,感兴分享
回复

使用道具 举报

地板
ID:299955 发表于 2018-4-2 21:54 来自手机 | 只看该作者
请教 这个最开始的输入是多少伏
回复

使用道具 举报

5#
ID:291837 发表于 2018-4-3 14:35 | 只看该作者
谢谢分享!PMOS管脚反了。
回复

使用道具 举报

6#
ID:248123 发表于 2018-4-4 15:41 | 只看该作者
1076986846 发表于 2018-4-2 21:54
请教 这个最开始的输入是多少伏

你可以看下桥式电路整流的分析  V输入*0.9=V输出
回复

使用道具 举报

7#
ID:248123 发表于 2018-4-4 15:41 | 只看该作者
aifengdian 发表于 2018-4-3 14:35
谢谢分享!PMOS管脚反了。

哪个地方
回复

使用道具 举报

8#
ID:302511 发表于 2018-4-5 20:10 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
ID:169431 发表于 2018-5-2 23:22 | 只看该作者
请问楼主源程序对于液晶显示和数码管都一样么?
回复

使用道具 举报

10#
ID:169431 发表于 2018-5-3 15:18 | 只看该作者
请问蜂鸣器用的是有源的吧?
回复

使用道具 举报

11#
ID:320408 发表于 2018-5-16 13:10 | 只看该作者
您好,程序里引脚设置不对吧?  我下载程序就蜂鸣器报警
回复

使用道具 举报

12#
ID:323092 发表于 2018-5-16 15:28 | 只看该作者
程序不对吧,做的是可调直流稳压电源,怎么程序里全都是年月日时分秒这些跟闹钟有关的
回复

使用道具 举报

13#
ID:280753 发表于 2018-6-30 11:30 | 只看该作者
不错,作为入门学习资料比较实用
回复

使用道具 举报

14#
ID:83761 发表于 2018-12-21 13:43 | 只看该作者
谢谢分享
回复

使用道具 举报

15#
ID:86577 发表于 2019-1-21 15:14 | 只看该作者
应该不错,下载看看
回复

使用道具 举报

16#
ID:471573 发表于 2019-1-23 15:50 | 只看该作者
这个很强大!!!
回复

使用道具 举报

17#
ID:3358 发表于 2019-1-24 18:05 | 只看该作者
学习学习
回复

使用道具 举报

18#
ID:275723 发表于 2019-2-21 23:33 | 只看该作者
感谢分享,我学到了很多
回复

使用道具 举报

19#
ID:125158 发表于 2019-3-23 12:33 | 只看该作者
aifengdian 发表于 2018-4-3 14:35
谢谢分享!PMOS管脚反了。

不是管脚反了,是选择 N 型号的畅销应管了, 电路有  2处严重错误!
回复

使用道具 举报

20#
ID:125158 发表于 2019-3-23 12:34 | 只看该作者
电路中是选择 N 型号的畅销应管了, 应该是 P 型,电路有  2处严重错误!希望作者改进过来!
回复

使用道具 举报

21#
ID:502198 发表于 2019-4-16 10:08 | 只看该作者
仿真图画不出来枯了有没有大神救救我
回复

使用道具 举报

22#
ID:513629 发表于 2019-4-17 14:35 | 只看该作者
真的谢谢老师·
回复

使用道具 举报

23#
ID:513629 发表于 2019-4-17 14:37 | 只看该作者
@单片机。。。 发表于 2018-4-4 15:41
你可以看下桥式电路整流的分析  V输入*0.9=V输出

对d的
回复

使用道具 举报

24#
ID:513629 发表于 2019-4-17 14:38 | 只看该作者
真的很好,谢谢老师。he很实用
回复

使用道具 举报

25#
ID:420665 发表于 2019-4-21 00:20 | 只看该作者
谢谢楼主
回复

使用道具 举报

26#
ID:520110 发表于 2019-4-24 01:32 | 只看该作者
请问是用什么软件仿真的?
回复

使用道具 举报

27#
ID:518484 发表于 2019-4-28 17:32 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

28#
ID:467558 发表于 2019-5-20 19:27 | 只看该作者
yhs598 发表于 2019-3-23 12:33
不是管脚反了,是选择 N 型号的畅销应管了, 电路有  2处严重错误!

您好,能说明一下哪里有错误么??
回复

使用道具 举报

29#
ID:502482 发表于 2019-5-24 10:14 | 只看该作者
这个负反馈的部分在元器件库找不到F9Z24N 可以用别的代替吗
回复

使用道具 举报

30#
ID:502482 发表于 2019-5-24 10:17 | 只看该作者
这个负反馈的部分F9Z24N这个型号的元器件找不到,可以用什么代替吗
回复

使用道具 举报

31#
ID:548651 发表于 2019-5-27 18:49 | 只看该作者
根据反馈系统的稳定原理计算出输出电压的公式,如下:Vo=Vin×(RW/RWL)。我想问一下,这个公式您是如何推导出来的?
回复

使用道具 举报

32#
ID:491340 发表于 2019-5-29 08:23 | 只看该作者
很详细的讲解 正好研究一下 谢谢了
回复

使用道具 举报

33#
ID:442397 发表于 2019-6-3 14:05 | 只看该作者
这是哪来的程序啊,,是电源的吗?
回复

使用道具 举报

34#
ID:591254 发表于 2019-8-1 11:12 | 只看该作者
感谢分享很好用
回复

使用道具 举报

35#
ID:60026 发表于 2019-8-2 09:34 | 只看该作者
先记号一下!慢慢学习!谢谢分享!
回复

使用道具 举报

36#
ID:272625 发表于 2019-8-13 21:47 | 只看该作者

如图Q1接反,2脚和3脚掉换过来接就对了!

00.jpg (14.77 KB, 下载次数: 116)

00.jpg
回复

使用道具 举报

37#
ID:584661 发表于 2019-8-14 15:32 | 只看该作者
教材很好             值得学习
回复

使用道具 举报

38#
ID:198286 发表于 2019-8-14 21:09 | 只看该作者
讲的很详细,学习了
回复

使用道具 举报

39#
ID:166138 发表于 2019-8-20 17:17 | 只看该作者
程序是闹钟,和电源没关系吧?检查下是否对应的上?
回复

使用道具 举报

40#
ID:605388 发表于 2019-9-4 11:05 | 只看该作者
很详细,学习了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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