找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11178|回复: 20
收起左侧

DIY带电压电流表的多功能STC免冷启动自动下载器原理图+PCB+源程序

  [复制链接]
ID:73957 发表于 2018-1-25 17:30 | 显示全部楼层 |阅读模式
{感谢原作者提供}
//STC多用下载器
//单片机用STC15W208AS,频率为22.1M,注意单片机只有时钟0及2
//功能有串口自动断电下载,4路输入电压检测(最大值25V),输
//出5v及3.3V的检测,输出电流检测,外接输入电压检测,及单片机的电压检测。
//串口监控下载,如连续为0X7F的值,就说明要断电重启下载数据,
//串口断电控制方式,每0.1s变一次波特率,如收到是7F的值,
//就停止变波特率,判断是否是连接7F,如是就断电重启。
//4输入的最大值为25v,电流最大值为2a
//开关的作用,短按为换页,长按为输出电源控制开关。
22.png 11.png


5.jpg 6.jpg 7.jpg 8.jpg 3.jpg 4.jpg 1.jpg 2.jpg 9.jpg 10.jpg 11.jpg 33.jpg


单片机源程序如下:
  1. #include <STC15W408AS.h>
  2. #include <intrins.h>
  3. #include <oled.h>
  4. unsigned char oldkey,keyval,jisu,rxdatvol,RSjisu,onjisu,RETjisu,kkkkjisu;
  5. unsigned int keyjixu;
  6. bit readtimekong,disppagebit,powonkong,time02s,RSPOWonkong,kkkk,time01kong;
  7. unsigned char  STCADbit[9];
  8. unsigned int STCADvol[9],voldat[9];
  9. unsigned char tetete;
  10. sbit KEY1=P5^5;
  11. sbit LEDout=P5^4;
  12. sbit POWkong=P3^7;
  13. void delay(unsigned int t) //长延时程序,延时t毫秒,STC 1T单片机11.0592M晶振I值为648,22.1I值为1298,12MI值为705。
  14. {
  15.          unsigned int i;
  16.          while(t--)
  17.            {
  18.                 for(i=705;i>0;i--);
  19.            }
  20. }

  21. void delay1() //
  22. {
  23.          unsigned int i;
  24.                 for(i=340;i>0;i--);
  25.           
  26. }

  27. //以下为AD检测
  28. void ADCINT()
  29. {
  30.         P1M1=0xff;//AD高阻
  31.    P1ASF=0xff;//设置 P1为AD口,根据实际设置。
  32.    ADC_RES=0;//ad清0
  33.   // AUXR1=0x04;//设置数据方式,低8位+高2位方式,易于运算。
  34.   CLK_DIV=0X20;//由于408AS与204E不同,需写成这。
  35. }
  36. unsigned int ADCwrite(unsigned char ch)
  37. { //由于所检测的电压不用快,所以采用查询或延时法,没用中断法。 ch值从0-7,对应为P10-P17
  38.         unsigned int x;
  39.         ADC_CONTR=0x88+ch;//设置启动 ,用慢速采集
  40.         //查询法。查询是否完成AD,由于是单片机内的,如出错单片机也出错,所以没做跳开处理。
  41.         while ( !(ADC_CONTR & 0x10) );//等待A/D转换结束(ADC_FLAG==0)
  42.         ADC_CONTR &= 0xE7;             //11100111,置ADC_FLAG=0清除结束标记, 置ADC_START=0关闭A/D 转换       
  43.         //delay(1);//延时法。由于设置及晶振的原因,大约为20US完成过程。这里延时1MS
  44.           x=ADC_RES*256+ADC_RESL;

  45.   return x;
  46. }

  47. void nowtempAD()
  48. {//采用采集10次取平均值,整个采集时间在20MS,防止交流干扰。 每0.2S运行一次
  49.         //0为3.3V,1为输入1,2为输入2,3为输入3,4为输入4,5为+5V,6为外接IN,7为电流,8为计算出来的单片机电压CPU。
  50.   unsigned char x,xx;
  51.         unsigned int k=0;
  52.         unsigned long y;
  53.         bit ll=0;
  54.         for(x=0;x<9;x++)
  55.         {
  56.                 STCADvol[x]=0;
  57.         }

  58.        
  59.   for(x=0;x<10;x++)//采集10次。
  60.   {
  61.     P1ASF=0x00;
  62.                 STCADvol[0]=ADCwrite(0)+STCADvol[0];//1.25V基准       
  63.                 delay1();
  64.                 P1ASF=0xff;
  65.                 for(xx=0;xx<8;xx++)
  66.           {
  67.                 STCADvol[xx+1]=ADCwrite(xx)+STCADvol[xx+1];
  68.           }
  69.         }
  70. //以下为计算       
  71. for(x=0;x<9;x++)
  72.         {
  73.                 STCADvol[x]=STCADvol[x]/10;

  74.                 if(STCADvol[x]>1000)
  75.                 {
  76.                         STCADbit[x]=1;
  77.                 }
  78.                 else
  79.                 {
  80.                         STCADbit[x]=0;
  81.                 }
  82.         }
  83. //0为3.3V,1为输入1,2为输入2,3为输入3,4为输入4,5为+5V,6为外接IN,7为电流,8为计算出来的单片机电压CPU。
  84. //以下的125等值是用于修改的。如电压与实测不同,需修改这个值。       
  85.         y=(long)1024*125/STCADvol[0];//STCADvol[0]为基准
  86.         voldat[8]=y;//8为计算出来的单片机电压CPU。
  87.         y=(long)STCADvol[1]*124/STCADvol[0];
  88.         voldat[0]=y;////0为3.3V,
  89.         y=(long)STCADvol[2]*685/STCADvol[0];
  90.         voldat[1]=y;//1为输入1,
  91.         y=(long)STCADvol[3]*703/STCADvol[0];
  92.         voldat[2]=y;//2为输入2,
  93.         y=(long)STCADvol[4]*706/STCADvol[0];
  94.         voldat[3]=y;//3为输入3,
  95.         y=(long)STCADvol[5]*702.5/STCADvol[0];
  96.         voldat[4]=y;//4为输入4,
  97.         y=(long)STCADvol[6]*248/STCADvol[0];
  98.         voldat[5]=y;//5为+5V,
  99.         y=(long)STCADvol[7]*53/STCADvol[0];
  100.         voldat[6]=y;//6为外接IN,
  101.         y=(long)STCADvol[8]*59/STCADvol[0];
  102.         voldat[7]=y;//7为电流,

  103. }
  104. void disp0(bit all)
  105. {
  106.         if(all==1)
  107.         {
  108.         OLED_Clear();
  109.        
  110.         OLED_ShowCHinese(4,0,0);
  111.         OLED_ShowCHinese(20,0,1);
  112.         OLED_ShowCHinese(36,0,2);
  113.         OLED_ShowChar(52,0,13);
  114.         OLED_ShowChar(60,0,14);
  115.         OLED_ShowChar(68,0,15);
  116.         OLED_ShowCHinese(76,0,3);
  117.         OLED_ShowCHinese(92,0,4);
  118.         OLED_ShowCHinese(108,0,5);
  119.        
  120.         //+5V:5.05V
  121.         OLED_ShowChar(0,2,18);
  122.         OLED_ShowChar(12,2,5);
  123.         OLED_ShowChar(24,2,19);
  124.         OLED_ShowChar(32,2,10);
  125.         OLED_ShowChar(72,2,19);
  126.         //3.3V:3.30V
  127.         OLED_ShowChar(0,4,3);
  128.         OLED_ShowChar(8,4,20);
  129.         OLED_ShowChar(16,4,3);
  130.         OLED_ShowChar(24,4,19);
  131.         OLED_ShowChar(32,4,10);               
  132.         OLED_ShowChar(72,4,19);       
  133.         //电流:0.50A
  134.         OLED_ShowCHinese(0,6,6);
  135.         OLED_ShowCHinese(16,6,8);
  136.         OLED_ShowChar(32,6,10);       
  137.         OLED_ShowChar(72,6,21);
  138.                 //IN:12.5V
  139.         OLED_ShowChar8x6(98,2,17);
  140.         OLED_ShowChar8x6(104,2,18);
  141.         OLED_ShowChar8x6(110,2,16);
  142.         OLED_ShowChar(119,3,19);
  143.         //CPU:5.05V
  144.         OLED_ShowChar8x6(95,5,19);
  145.         OLED_ShowChar8x6(101,5,20);
  146.         OLED_ShowChar8x6(107,5,21);
  147.         OLED_ShowChar8x6(113,5,16);
  148.         OLED_ShowChar(119,6,19);

  149.                 }
  150.                 //0为3.3V,1为输入1,2为输入2,3为输入3,4为输入4,5为+5V,6为外接IN,7为电流,8为计算出来的单片机电压CPU。
  151.         //+5V值
  152.                 if(STCADbit[6]==1)
  153.                 {//OL
  154.                         OLED_ShowChar(40,2,22);
  155.                         OLED_ShowChar(48,2,23);
  156.                         OLED_ShowChar(56,2,11);
  157.                         OLED_ShowChar(64,2,11);

  158.                 }
  159.                 else
  160.                 {
  161.                         OLED_ShowChar(40,2,voldat[5]/100);
  162.                         OLED_ShowChar(48,2,20);
  163.                         OLED_ShowChar(56,2,voldat[5]%100/10);
  164.                         OLED_ShowChar(64,2,voldat[5]%10);
  165.                 }
  166.         //3.3V值
  167.         if(STCADbit[1]==1)
  168.         {
  169.                 OLED_ShowChar(40,4,22);
  170.                 OLED_ShowChar(48,4,23);
  171.                 OLED_ShowChar(56,4,11);
  172.                 OLED_ShowChar(64,4,11);

  173.         }
  174.         else
  175.         {
  176.                 OLED_ShowChar(40,4,voldat[0]/100);
  177.                 OLED_ShowChar(48,4,20);
  178.                 OLED_ShowChar(56,4,voldat[0]%100/10);
  179.                 OLED_ShowChar(64,4,voldat[0]%10);
  180.         }
  181.         //电流值
  182.         if(STCADbit[8]==1)
  183.         {
  184.                 OLED_ShowChar(40,6,22);
  185.                 OLED_ShowChar(48,6,23);       
  186.                 OLED_ShowChar(56,6,11);
  187.                 OLED_ShowChar(64,6,11);

  188.         }
  189.         else
  190.         {
  191.                 OLED_ShowChar(40,6,voldat[7]/100);
  192.                 OLED_ShowChar(48,6,20);       
  193.                 OLED_ShowChar(56,6,voldat[7]%100/10);
  194.                 OLED_ShowChar(64,6,voldat[7]%10);
  195.         }
  196.   //IN值
  197.         if(STCADbit[7]==1)
  198.         {
  199.                 OLED_ShowChar(88,3,22);
  200.                 OLED_ShowChar(96,3,23);
  201.                 OLED_ShowChar(104,3,11);
  202.                 OLED_ShowChar(111,3,11);
  203.         }
  204.         else
  205.         {
  206.                 OLED_ShowChar(88,3,voldat[6]/100);
  207.                 OLED_ShowChar(96,3,voldat[6]%100/10);
  208.                 OLED_ShowChar(104,3,20);
  209.                 OLED_ShowChar(111,3,voldat[5]%10);
  210.         }
  211.         //CPU值
  212.         OLED_ShowChar(88,6,voldat[8]/100);
  213.   OLED_ShowChar(96,6,20);       
  214.         OLED_ShowChar(103,6,voldat[8]%100/10);
  215.         OLED_ShowChar(111,6,voldat[8]%10);
  216.        
  217.        
  218. }
  219. void disp1(bit all)
  220. {
  221.         if(all==1)
  222.         {
  223.         OLED_Clear();
  224.        
  225.         //电压1:12.55V
  226.        
  227.         OLED_ShowCHinese(0,0,6);
  228.         OLED_ShowCHinese(16,0,7);
  229.         OLED_ShowChar(32,0,1);
  230.         OLED_ShowChar(40,0,10);
  231.         OLED_ShowChar(68,0,20);
  232.         OLED_ShowChar(92,0,19);
  233.         //电压2:12.55V
  234.         OLED_ShowCHinese(0,2,6);
  235.         OLED_ShowCHinese(16,2,7);
  236.         OLED_ShowChar(32,2,2);
  237.         OLED_ShowChar(40,2,10);
  238.         OLED_ShowChar(68,2,20);
  239.         OLED_ShowChar(92,2,19);
  240.         //电压3:12.55V
  241.         OLED_ShowCHinese(0,4,6);
  242.         OLED_ShowCHinese(16,4,7);
  243.         OLED_ShowChar(32,4,3);
  244.         OLED_ShowChar(40,4,10);
  245.         OLED_ShowChar(68,4,20);
  246.         OLED_ShowChar(92,4,19);
  247.         //电压4:12.55V
  248.         OLED_ShowCHinese(0,6,6);
  249.         OLED_ShowCHinese(16,6,7);
  250.         OLED_ShowChar(32,6,4);
  251.         OLED_ShowChar(40,6,10);
  252.         OLED_ShowChar(68,6,20);
  253.         OLED_ShowChar(92,6,19);
  254.         }
  255.         //0为3.3V,1为输入1,2为输入2,3为输入3,4为输入4,5为+5V,6为外接IN,7为电流,8为计算出来的单片机电压CPU。
  256.         //电压1值
  257.         if(STCADbit[2]==1)
  258.         {
  259.                 OLED_ShowChar(52,0,22);
  260.                 OLED_ShowChar(60,0,23);
  261.                 OLED_ShowChar(76,0,11);
  262.                 OLED_ShowChar(84,0,11);
  263.         }
  264.         else
  265.         {               
  266.                 OLED_ShowChar(52,0,voldat[1]/1000);
  267.                 OLED_ShowChar(60,0,voldat[1]%1000/100);
  268.                 OLED_ShowChar(76,0,voldat[1]%100/10);
  269.                 OLED_ShowChar(84,0,voldat[1]%10);
  270.   }       
  271.         //电压2值
  272.         if(STCADbit[3]==1)
  273.         {
  274.                 OLED_ShowChar(52,2,22);
  275.                 OLED_ShowChar(60,2,23);
  276.                 OLED_ShowChar(76,2,11);
  277.                 OLED_ShowChar(84,2,11);
  278.         }
  279.         else
  280.         {               
  281.         OLED_ShowChar(52,2,voldat[2]/1000);
  282.         OLED_ShowChar(60,2,voldat[2]%1000/100);       
  283.         OLED_ShowChar(76,2,voldat[2]%100/10);
  284.         OLED_ShowChar(84,2,voldat[2]%10);       
  285.         }
  286.         //电压3值
  287.                 if(STCADbit[4]==1)
  288.         {
  289.                 OLED_ShowChar(52,4,22);
  290.                 OLED_ShowChar(60,4,23);
  291.                 OLED_ShowChar(76,4,11);
  292.                 OLED_ShowChar(84,4,11);
  293.         }
  294.         else
  295.         {               
  296.         OLED_ShowChar(52,4,voldat[3]/1000);
  297.         OLED_ShowChar(60,4,voldat[3]%1000/100);
  298.         OLED_ShowChar(76,4,voldat[3]%100/10);
  299.         OLED_ShowChar(84,4,voldat[3]%10);
  300.         }
  301.         //电压4值
  302.                 if(STCADbit[5]==1)
  303.         {
  304.                 OLED_ShowChar(52,6,22);
  305.                 OLED_ShowChar(60,6,23);
  306.                 OLED_ShowChar(76,6,11);
  307.                 OLED_ShowChar(84,6,11);
  308.         }
  309.         else
  310.         {               
  311.         OLED_ShowChar(52,6,voldat[4]/1000);
  312.         OLED_ShowChar(60,6,voldat[4]%1000/100);       
  313.         OLED_ShowChar(76,6,voldat[4]%100/10);
  314.         OLED_ShowChar(84,6,voldat[4]%10);
  315.         }
  316. }
  317. //***********************键盘扫描子程序。******************
  318. //*********************************************************
  319. unsigned char keyboard()//键盘扫描
  320. {
  321.       unsigned char keyboardj;
  322.      keyboardj=0;
  323.     if(KEY1==0)
  324.           {
  325.         delay(10);
  326.                   if(KEY1==0)
  327.                   {
  328.                           keyboardj=1;
  329.                   }
  330.       }
  331.          
  332.    return  keyboardj;
  333. }
  334. //************键盘控制子程序***************
  335. //
  336. //
  337. //******************************************
  338. void keykong()//主要功能是
  339. {
  340.    unsigned char keyyy;
  341.    keyyy=keyboard();
  342.        
  343. if (keyyy!=oldkey)
  344.         {
  345.                 if(keyyy==0)//
  346.       {       
  347.                                 if(keyjixu>0)
  348.                                 {
  349.                                         if(keyjixu<80)
  350.                                         {
  351.                                                 if(oldkey==1)
  352.                                                 {
  353.                                                         keyval=1;
  354.                                                 }
  355.                                         }
  356.                                         else
  357.                                         {
  358.                                                 //keyval=11;
  359.                                                 keyjixu=0;
  360.                                         }
  361.                                 }
  362.                                 else
  363.                                 {
  364.                                         keyval=0;
  365.                                   keyjixu=0;
  366.                                 }
  367.                         }
  368.          
  369.         }
  370.   oldkey=keyyy;       
  371.         if(keyyy==1)//
  372.                 {
  373.                         keyjixu++;
  374.                         if(keyjixu==80)keyval=11;
  375.                 }
  376.          //键盘处理完成。
  377. //以下为功能子程序               
  378.          if(keyval==1)
  379.                 {
  380.                  keyval=0;//这步必须的,清键值。
  381.                         keyjixu=0;//清计数值,这两步是必要的。
  382.                         //短按翻页
  383.                         if(disppagebit==1)
  384.                         {
  385.                                 disppagebit=0;
  386.                                 disp0(1);
  387.                         }
  388.                         else
  389.                         {
  390.                                 disppagebit=1;
  391.                                 disp1(1);
  392.                         }
  393.                
  394.                
  395.                 }                               
  396.                 if(keyval==11)
  397.                 {//
  398.                  keyval=0;//这步必须的,清键值。
  399.                         //keyjixu=0;//清计数值,这两步是必要的。
  400.                 //长按开关电源
  401.                         if(powonkong==0)
  402.                         {
  403.                         powonkong=1;//开总电源
  404.             POWkong=0;//电源控制
  405.                         }
  406.                         else
  407.                         {
  408.                                 powonkong=0;//开总电源
  409.             POWkong=1;//电源控制
  410.                         }
  411.                 }
  412. }


  413. void Timer0Init(void)                //2毫秒@22.1184MHz
  414. {
  415.         AUXR |= 0x80;                //定时器时钟1T模式
  416.         TMOD &= 0xF0;                //设置定时器模式
  417.         TMOD |= 0x01;                //设置定时器模式
  418.         TL0 = 0x33;                //设置定时初值
  419.         TH0 = 0x53;                //设置定时初值
  420.         TF0 = 0;                //清除TF0标志
  421.         TR0 = 1;                //定时器0开始计时

  422.         ET0=1; //启动T定中断
  423.        
  424.         //IT1=1;//置中断1为脉冲低电平触发。
  425.   //EX1=1;//开中断1
  426.        
  427.   EA=1; //启动总中断
  428. }
  429. /*void rs1_232tx(unsigned char txdata)
  430. {
  431.          SBUF=txdata;//把数据传给串口寄存器SBUF。
  432.          while(!TI);//检测是否发完。
  433.          TI=0;//重置初值。
  434. }*/
  435. void UartInit(void)                //19200bps@22.1184MHz
  436. {
  437.         SCON = 0x50;                //8位数据,可变波特率
  438.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  439.         AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
  440.         T2L = 0xE0;                //设定定时初值
  441.         T2H = 0xFE;                //设定定时初值
  442.         AUXR |= 0x10;                //启动定时器2
  443.        
  444.         ES=1;//开中断
  445. }
  446. void UartInit1()//这个是变化的串口参数
  447. {
  448.         ES=0;//关串口中断
  449.         RETjisu=0;
  450.         onjisu=0;
  451.         rxdatvol=0;
  452.         //OLED_ShowChar(0,0,RSjisu);
  453.         //rs1_232tx(RSjisu);
  454.         switch(RSjisu)
  455.         {
  456.                 case 0:
  457.             T2L = 0x00;                //设定定时初值//1200bps@22.1184MHz
  458.             T2H = 0xEE;                //设定定时初值
  459.            break;
  460.                 case 1:
  461.                         T2L = 0x00;                //设定定时初值//2400bps@22.1184MHz
  462.                         T2H = 0xF7;                //设定定时初值
  463.                  break;
  464.                 case 2:       
  465.                         T2L = 0x80;                //设定定时初值//4800bps@22.1184MHz
  466.                         T2H = 0xFB;                //设定定时初值
  467.                  break;
  468.                 case 3:       
  469.                         T2L = 0xC0;                //设定定时初值//9600bps@22.1184MHz
  470.                         T2H = 0xFD;                //设定定时初值
  471.                  break;       
  472.                 case 4:
  473.                   T2L = 0x80;                //设定定时初值//14400bps@22.1184MHz
  474.             T2H = 0xFE;                //设定定时初值
  475.                   break;
  476.     case 5:
  477.                         T2L = 0xE0;                //设定定时初值//19200bps@22.1184MHz
  478.                         T2H = 0xFE;                //设定定时初值
  479.                  break;
  480.                 case 6:       
  481.                   T2L = 0x40;                //设定定时初值//28800bps@22.1184MHz
  482.             T2H = 0xFF;                //设定定时初值
  483.                   break;
  484.                 case 7:       
  485.                         T2L = 0x70;                //设定定时初值//38400bps@22.1184MHz
  486.                         T2H = 0xFF;                //设定定时初值
  487.                  break;
  488.                 case 8:       
  489.                         T2L = 0xA0;                //设定定时初值//57600bps@22.1184MHz
  490.                         T2H = 0xFF;                //设定定时初值
  491.                  break;
  492.                 case 9:       
  493.                         T2L = 0xD0;                //设定定时初值//115200bps@22.1184MHz
  494.                         T2H = 0xFF;                //设定定时初值
  495.                 break;
  496. }
  497. RSjisu++;
  498. if(RSjisu>9)RSjisu=0;
  499. delay(20);
  500. ES=1;//开中断
  501. }
  502. void main()
  503. {
  504.         P5M0=0x10;//P54推换
  505.         Timer0Init();
  506.         UartInit();
  507.         OLED_Init();
  508.         ADCINT();
  509.         WDT_CONTR=0X3d;//开看门狗,由于是长时间工作,防止死机。2S内喂狗一次。
  510.   AUXR1=0x40;//串口转P3637
  511. disp0(1);
  512.         disppagebit=0;
  513.         powonkong=1;//开总电源
  514.         POWkong=0;//电源控制
  515.         while(1)
  516.         {
  517.                 WDT_CONTR=0X3d;//开看门狗,由于是长时间工作,防止死机。2S内喂狗一次。
  518.                 keykong();
  519.                 if(readtimekong==1)
  520.                 {
  521.                         nowtempAD();
  522.                         if(disppagebit==0)
  523.                         {
  524.                                 disp0(0);//刷新
  525.                                
  526.                         }
  527.                         else
  528.                         {
  529.                                 disp1(0);
  530.                         }
  531.                         //if(powonkong==1)
  532.                         //{//当总控为开,LED亮,如串口收到0x7f,就闪
  533.                                 if(time02s==1&&rxdatvol==0x7f)//当收到7F时,表示下载,闪,
  534.                                 {
  535.                                         LEDout=0;
  536.                                 }
  537.                                 else
  538.                                 {
  539.                                 LEDout=1;
  540.                                 }
  541.                 //        }
  542.                         //else
  543.                         //{
  544.                         //        LEDout=0;
  545.                 //        }
  546.                        
  547.                         if(RSPOWonkong==1)
  548.                         {//当收到重启控制时,判断当前是不是处于总电源开,如是开就启动重启
  549.                                 if(powonkong==1)
  550.                                 {//整个过程大约需1.5s
  551.                                         RETjisu++;
  552.                                         if(RETjisu==2)POWkong=1;//关电源控制
  553.                                         if(RETjisu==4)POWkong=0;//开电源控制
  554.                                         if(RETjisu==8)
  555.                                         {
  556.                                                 RSPOWonkong=0;//清控制值
  557.                                                 RETjisu=0;
  558.                   onjisu=0;
  559.                                         }
  560.                                 }
  561.                                
  562.                                
  563.                         }
  564.                        
  565.                
  566.                         readtimekong=0;
  567.           }       
  568.                 if(time01kong==1)       
  569.                 {
  570.       if(kkkk==1)
  571.                         {
  572.                                 kkkkjisu++;
  573.                                 if(kkkkjisu>3)
  574.                                 {
  575.                                 kkkk=0;
  576.                                         kkkkjisu=0;
  577.                                 }
  578.                         }
  579.                         else
  580.                         {
  581.                                 UartInit1();
  582.                         }
  583.                         time01kong=0;
  584.                 }
  585.                
  586.   }
  587. }

  588. void tt0(void) interrupt 1
  589. {//2毫秒@22.1184MHz
  590. //200MS数据,
  591.        
  592.         TL0 = 0x33;                //设置定时初值
  593.         TH0 = 0x53;                //设置定时初值

  594.          jisu++;
  595.         if(jisu==50)time01kong=1;
  596.          if(jisu>=100)  //0.2S
  597.          {
  598.                  jisu=0;
  599.                  readtimekong=1;
  600.                  time01kong=1;
  601.                  time02s=~time02s;
  602.          }
  603. }

  604. void comm1(void) interrupt 4
  605. { //串口1中断  控接收协议:2B引导码FF FE,开关值及左右转值(加1为0x01,减10x02,短按0x04,长按0x08)。
  606. //注意清空RSzhuantai值,防止接收到非法数据不返回。
  607.   if(RI)
  608.     {
  609.                
  610.           RI=0;        //rs1_232tx(SBUF);
  611.           rxdatvol=SBUF;
  612.                 if(rxdatvol==0x7f)
  613.                         {
  614.                                 kkkk=1;
  615.                                 onjisu++;
  616.                                 if(onjisu>20)
  617.                                 {
  618.                                         RSPOWonkong=1;//连接接收20次就重启
  619. ……………………

  620. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载(原理图+pcb+源码):
DIY带电压电流表的多功能STC免冷启动自动下载器.zip (593.47 KB, 下载次数: 280)

评分

参与人数 3黑币 +110 收起 理由
brave_ruan + 5 赞一个!
旧城以西的故事 + 5 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:79034 发表于 2018-1-26 22:30 | 显示全部楼层
这个怎么没人顶?我来顶一下,楼主肯分享自己的成果,必须顶一下。
回复

使用道具 举报

ID:65956 发表于 2018-3-5 10:09 | 显示全部楼层
功能这么多是好,但是在下载时,要这些又有什么用呢?如果带脱机功能那这个就有意义
回复

使用道具 举报

ID:200521 发表于 2018-4-11 21:13 | 显示全部楼层
感谢分享,学习了,
回复

使用道具 举报

ID:303099 发表于 2018-4-24 16:17 | 显示全部楼层
值得学习,下载了~~~~~~~~~~~~~~~
回复

使用道具 举报

ID:306962 发表于 2018-4-25 12:53 来自手机 | 显示全部楼层
学习adc呢。谢谢
回复

使用道具 举报

ID:152434 发表于 2018-4-28 10:50 | 显示全部楼层
给你点个赞,相见恨晚啊
回复

使用道具 举报

ID:243748 发表于 2018-4-29 22:34 来自手机 | 显示全部楼层
有空也想做一个玩下
回复

使用道具 举报

ID:265684 发表于 2018-5-16 16:36 来自手机 | 显示全部楼层
弱弱的想问一下,这些功能对实际下载的时候有什么用
回复

使用道具 举报

ID:286606 发表于 2018-5-18 17:17 | 显示全部楼层
可以脱机吗
回复

使用道具 举报

ID:233015 发表于 2018-5-20 16:18 | 显示全部楼层
很给力
回复

使用道具 举报

ID:138918 发表于 2018-6-29 18:37 | 显示全部楼层
看起来不错的样子 收藏学习
回复

使用道具 举报

ID:111376 发表于 2020-1-12 21:41 | 显示全部楼层
感谢分享,收藏学习
回复

使用道具 举报

ID:140183 发表于 2020-1-19 07:18 | 显示全部楼层
很好的学习资料.谢谢分享!
回复

使用道具 举报

ID:656801 发表于 2020-6-10 13:39 | 显示全部楼层

很好的学习资料.谢谢分享!
回复

使用道具 举报

ID:136337 发表于 2020-7-24 19:02 | 显示全部楼层
很好的学习资料,谢谢分享
回复

使用道具 举报

ID:620287 发表于 2020-7-26 19:42 来自手机 | 显示全部楼层
只是把ch340下载器和电压检测模块加在一起罢了
回复

使用道具 举报

ID:138956 发表于 2020-10-22 11:17 | 显示全部楼层
有空也做一个玩
回复

使用道具 举报

ID:507641 发表于 2021-12-8 01:50 | 显示全部楼层
请问OLED 是什么型号?
回复

使用道具 举报

ID:960333 发表于 2022-2-23 16:15 | 显示全部楼层
这个给力,我改这个免冷启动CH340的也算很完美,经济实惠,这个换个小点的屏估计很多人喜欢
回复

使用道具 举报

ID:960333 发表于 2022-2-23 16:16 | 显示全部楼层
这个给力,我改CH340的也算很完美经济实惠型的,这个换个小点的屏估计很多人都喜欢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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