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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5321|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

用STC單片機(jī)做的7KW電動(dòng)車充電樁源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:878048 發(fā)表于 2021-1-16 09:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用是STCD 15W404AS 做主控,片內(nèi)資源用到了,可調(diào)PWM,ADC , 串口(用來(lái)讀取計(jì)量模塊的數(shù)據(jù)),具體功能,可按鍵調(diào)充電功率,1602顯示實(shí)時(shí)電壓,電流,功率,電能累計(jì),
設(shè)計(jì)有1602顯示,但是不知道時(shí)序?qū)懙倪有些問(wèn)題還是干擾問(wèn)題,充電的時(shí)候就白屏了或者亂碼了,,不充電有時(shí)候有時(shí)候是正常的,這里還需要調(diào)試,目前已經(jīng)正常充電,電流30A

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include "intrins.h"
  3. sfr AUXR        =   0x8E;   //0000,0000 輔助寄存器
  4. sfr T2H         =   0xD6;   //0000,0000 T2高字節(jié)
  5. sfr T2L         =   0xD7;   //0000,0000 T2低字節(jié)

  6. sfr P0M1 = 0x93;
  7. sfr P0M0 = 0x94;
  8. sfr P1M1 = 0x91;
  9. sfr P1M0 = 0x92;
  10. sfr P2M1 = 0x95;
  11. sfr P2M0 = 0x96;
  12. sfr P3M1 = 0xb1;
  13. sfr P3M0 = 0xb2;
  14. sfr P4M1 = 0xb3;
  15. sfr P4M0 = 0xb4;
  16. sfr P5M1 = 0xC9;
  17. sfr P5M0 = 0xCA;
  18. sfr P6M1 = 0xCB;
  19. sfr P6M0 = 0xCC;
  20. sfr P7M1 = 0xE1;
  21. sfr P7M0 = 0xE2;
  22. /////////////////////////////////////////////////////////////////////////////////////////////
  23. //PWM模塊寄存器定義
  24. sfr P_SW1  = 0xA2;             //外設(shè)功能切換寄存器1   針腳選擇功能寄存器

  25. #define CCP_S0 0x10                 //P_SW1.4         選擇針腳功能
  26. #define CCP_S1 0x20                 //P_SW1.5         選擇針腳功能
  27. #define S1_S1 0x80                 //P_SW3.6         選擇針腳功能
  28. #define S1_S0 0x40                 //P_SW3.7         選擇針腳功能
  29. sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
  30. sfr ADC_RES     =   0xBD;           //ADC高8位結(jié)果
  31. sfr ADC_LOW2    =   0xBE;           //ADC低2位結(jié)果
  32. sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

  33. #define ADC_POWER   0x80            //ADC電源控制位
  34. #define ADC_FLAG    0x10            //ADC完成標(biāo)志
  35. #define ADC_START   0x08            //ADC起始控制位
  36. #define ADC_SPEEDLL 0x00            //540個(gè)時(shí)鐘
  37. #define ADC_SPEEDL  0x20            //360個(gè)時(shí)鐘
  38. #define ADC_SPEEDH  0x40            //180個(gè)時(shí)鐘
  39. #define ADC_SPEEDHH 0x60            //90個(gè)時(shí)鐘
  40.                                                                                                                                                                                                                                                                             
  41. sfr CCON        =   0xD8;           //PCA控制寄存器
  42. sbit CCF0       =   CCON^0;         //PCA模塊0中斷標(biāo)志
  43. sbit CCF1       =   CCON^1;         //PCA模塊1中斷標(biāo)志
  44. sbit CR         =   CCON^6;         //PCA定時(shí)器運(yùn)行控制位
  45. sbit CF         =   CCON^7;         //PCA定時(shí)器溢出標(biāo)志
  46. sfr CMOD        =   0xD9;           //PCA模式寄存器
  47. sfr CL          =   0xE9;           //PCA定時(shí)器低字節(jié)
  48. sfr CH          =   0xF9;           //PCA定時(shí)器高字節(jié)
  49. sfr CCAPM0      =   0xDA;           //PCA模塊0模式寄存器  
  50. sfr CCAP0L      =   0xEA;           //PCA模塊0捕獲寄存器 LOW
  51. sfr CCAP0H      =   0xFA;           //PCA模塊0捕獲寄存器 HIGH
  52. sfr CCAPM1      =   0xDB;           //PCA模塊1模式寄存器
  53. sfr CCAP1L      =   0xEB;           //PCA模塊1捕獲寄存器 LOW
  54. sfr CCAP1H      =   0xFB;           //PCA模塊1捕獲寄存器 HIGH
  55. sfr CCAPM2      =   0xDC;           //PCA模塊2模式寄存器
  56. sfr CCAP2L      =   0xEC;           //PCA模塊2捕獲寄存器 LOW
  57. sfr CCAP2H      =   0xFC;           //PCA模塊2捕獲寄存器 HIGH
  58. sfr PCA_PWM0    =   0xf2;           //PCA模塊0的PWM寄存器
  59. sfr PCA_PWM1    =   0xf3;           //PCA模塊1的PWM寄存器
  60. sfr PCA_PWM2    =   0xf4;           //PCA模塊2的PWM寄存器
  61. ///////////////////////////////////////////////////////////函數(shù)列表、、、、、、、、、、、、、、、、、、、、、、、、、、、
  62. void UartInit();   //初始化串口
  63. void Timer0Init(); //初始化T0
  64. void UartWxd();         //發(fā)送數(shù)據(jù)查詢實(shí)時(shí)信息
  65. void jiexibuf();         //解析接受到的數(shù)據(jù)
  66. void pwm();         //解析接受到的數(shù)據(jù)
  67. void InitADC(); //初始化ADC
  68. void GetADCResult();   //讀取ADC的值存儲(chǔ)在變量adc里面
  69. void Delay(unsigned int n);           //軟件延時(shí) 1.6毫秒左右
  70. void chongdian();                        //          充電流程
  71. void  diannengjisuan();//J計(jì)算初始電能并計(jì)算已用電能
  72. void dianliuxuanze(); //按鈕選項(xiàng)電流
  73. ///////////////////////////////////////////////////////////定義的一些變量、、、、、、、、、、、、、、、、、、、、、、、、、、、
  74. bit flagTxd = 0; //單字節(jié)發(fā)送完成標(biāo)志,用來(lái)替代 TXD 中斷標(biāo)志位
  75. sbit s1 = P3^3;         //切換繼電器
  76. sbit km = P3^2;         //功率繼電器接觸器
  77. sbit pwmdip = P1^1;
  78. sbit k1 = P3^0;                //按鈕
  79. //sbit LED = P1^2;
  80. unsigned char cntRxd = 0; //接收字節(jié)計(jì)數(shù)器
  81. unsigned char pdata bufRxd[30]; //接收字節(jié)緩沖區(qū)
  82. unsigned char code bufWxd[8] ={0x01,0x03,0x00,0x48,0x00,0x0A,0x45,0xDB,};//發(fā)送的數(shù)據(jù)        增加了code關(guān)鍵字,此數(shù)組寫在程序區(qū)減少使用內(nèi)部?jī)?nèi)存128K
  83. unsigned long pdata cnt = 0; //毫秒計(jì)數(shù)
  84. unsigned long pdata sec; //秒計(jì)數(shù)
  85. //unsigned cha *but;// 發(fā)送指針
  86. unsigned int pdata vcc; // 電壓
  87. unsigned int pdata vci; // 電流
  88. unsigned int pdata power; // 功率
  89. unsigned long pdata kwh=0; // 電能
  90. unsigned long pdata kwh1; // 初始電能
  91. unsigned char pw;         //設(shè)定的空占比%
  92. unsigned char cp; //充電樁PWM波形 cp電壓采集信號(hào)        120
  93. ////            關(guān)于LCD 1602        /////////////////LCD的一些定義
  94. sfr P5   = 0xC8;
  95. unsigned char pdata lcd1[16];         //LCD第一行
  96. unsigned char pdata lcd2[16];         //LCD第二行
  97. sbit LCD1602_RS = P5^5;         //命令、數(shù)據(jù)選擇 H\L
  98. sbit LCD1602_E = P5^4;         //使能
  99. unsigned char pdata ki;        //電流顯示1表示16A   2表示32A

  100. #define LCD1602_DATAPINS P1    //定義P1口為數(shù)據(jù)端
  101. void LcdWriteCom(unsigned char com); /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/       
  102. void LcdWriteData(unsigned char dat);        /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/
  103. void LcdInit();                        /*LCD1602初始化子程序*/       
  104. void lcd1602();         //1602顯示刷新
  105. void Lcd1602_Delay5ms();
  106. void Lcd1602_Delay1ms();

  107. void main(){
  108.     P0M0 = 0x00;
  109.     P0M1 = 0x00;
  110.     P1M0 = 0x00;
  111.     P1M1 = 0x00;
  112.     P2M0 = 0x00;
  113.     P2M1 = 0x00;
  114.     P3M0 = 0x00;
  115.     P3M1 = 0x00;
  116.     P4M0 = 0x00;
  117.     P4M1 = 0x00;
  118.     P5M0 = 0x00;
  119.     P5M1 = 0x00;
  120.     P6M0 = 0x00;
  121.     P6M1 = 0x00;
  122.     P7M0 = 0x00;
  123.     P7M1 = 0x00;
  124.         P_SW1=P_SW1|S1_S0;
  125.     EA = 1; //使能總中斷
  126.         ES = 1;    //使能串口1中斷
  127.            UartInit();         //初始化串口
  128.             pwm();         //初始化pwm模塊設(shè)置
  129.         InitADC(); //初始化ADC
  130.        
  131.         Timer0Init(); //初始化T0
  132.                 LcdInit();//初始化lcd
  133.                   
  134.     while (1){
  135.         chongdian();  //充電流程
  136.         dianliuxuanze(); //電流選擇函數(shù)
  137.        
  138.         if(TF0==1){                                   //t0溢出的次數(shù)
  139.                 cnt++;}
  140.       if(pwmdip==1){           //檢測(cè)                  
  141.           GetADCResult(); //讀取刷新ADC的值         cp就是讀取的8位電壓信號(hào)
  142.             
  143.            }
  144.         if(cnt>=20000){                  //大概1秒鐘,還可以調(diào)整
  145.                         
  146.              cnt=0;
  147.                  sec++;
  148.                                                    
  149.                  UartWxd();          //發(fā)送電能模塊讀取命令                 
  150.                  jiexibuf();  //解析接受到的數(shù)據(jù)
  151.                  diannengjisuan(); //電能計(jì)算函數(shù)
  152.                  lcd1602();          //lcd顯示          
  153.                           }

  154.           

  155.                                          }  }
  156.   void chongdian(){          //、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、充電流程

  157.            if(cp>111){      //當(dāng)cp電壓大于11.1時(shí)                          狀態(tài)1
  158.                  s1=1;                        //小接觸器不吸合 常閉點(diǎn)12V  s1
  159.                  km=1;
  160.                          }           //主接觸器不吸合   
  161.            if(98>cp && cp>81){           //當(dāng)cp電壓大于8.1V小于9.8時(shí)          狀態(tài)2                 與車輛已連接
  162.                  s1=0;                        //小接觸器吸合         切換至PWM
  163.                  km=1;                        }           //主接觸器不吸合
  164.            if(66>cp && cp>51){                  //當(dāng)cp電壓大于5.1小于6.6時(shí)          狀態(tài)3         充電中
  165.                  s1=0;                   //小接觸器吸合         切換至PWM
  166.                  km=0;                                    //主接觸器吸合  開(kāi)始充電
  167.                
  168.                          }
  169.                         }

  170.   void dianliuxuanze(){                         //電流選擇初始值16A
  171.                  bit i=0;                //電流選擇初始值16A
  172.                  if (i==1){            //不切換電流16A
  173.                            pw=33;
  174.                                    ki=1;}
  175.                   else{pw=60;
  176.                   ki=2;}         // 切換電流32A

  177.        if(k1==0)
  178.         {  Lcd1602_Delay5ms();
  179.                    Lcd1602_Delay5ms();
  180.                    if(k1==0){
  181.               i=!i;//k1按下置反i
  182.                              }
  183.       

  184. }
  185.         }

  186.   void pwm(){  //PWM程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

  187.    
  188.     ACC = P_SW1;                                        //累加器 等于外設(shè)寄存器
  189.     ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
  190.     P_SW1 = ACC;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)         讀取累加器的值寫進(jìn)外設(shè)寄存器
  191.     CCON = 0;                       //初始化PCA控制寄存器
  192.                                     //PCA定時(shí)器停止
  193.                                     //清除CF標(biāo)志
  194.                                     //清除模塊中斷標(biāo)志
  195.     CL = 0;                         //復(fù)位PCA寄存器
  196.     CH = 0;
  197.         CMOD = 0x04;
  198.    // CMOD = 0x04;                    //設(shè)置PCA時(shí)鐘源        t0定時(shí)器
  199.                                     //禁止PCA定時(shí)器溢出中斷
  200.     PCA_PWM0 = 0x00;                //PCA模塊0工作于8位PWM
  201.     CCAP0H = CCAP0L =255-255*60/100;         //PWM0的占空比為87.5% ((100H-20H)/100H)         255-255*設(shè)定空占比        /100
  202.     CCAPM0 = 0x42;                  //00101010  PCA模塊0允許比較功能        使用CCP0腳為可調(diào)脈沖輸出         P1.1

  203.                                  }
  204. void Timer0Init()                //T0作為PWM頻率基準(zhǔn)發(fā)生
  205. {
  206.        
  207.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  208.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  209.         TL0 = 0xd5;        //設(shè)置定時(shí)初值                計(jì)算方法,65536-晶振/(256*需要頻率)   
  210.         TH0 = 0xFf;                //設(shè)置定時(shí)初值       
  211.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  212.           ET0 =0;                        // 禁止T0中斷
  213.         TF0 = 0;                //清除TF0標(biāo)志
  214. //        EA  =0;                        關(guān)閉總總中斷
  215.     CR = 1; }                        //PCA定時(shí)器開(kāi)始工作

  216. ///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  217. //        AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  218. //        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  219. //        TL0 = 0xff;                //設(shè)置定時(shí)初值
  220. //        TH0 = 0xf6;                //設(shè)置定時(shí)初值
  221. //        TF0 = 0;                //清除TF0標(biāo)志
  222. //        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  223. /*----------------------------
  224. 初始化ADC
  225. ----------------------------*/
  226. void InitADC() //初始化ADC
  227. {
  228.     P1ASF = 0x01;                   //設(shè)置P1.0口為AD口
  229.     ADC_RES = 0;                    //清除結(jié)果寄存器
  230.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  231.     Delay(2);                       //ADC上電并延時(shí)
  232. }
  233. /*----------------------------
  234. 讀取ADC結(jié)果
  235. ----------------------------*/
  236. void GetADCResult()
  237. {        unsigned long y;
  238.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | 0 | ADC_START;         //ADC電源    540個(gè)時(shí)鐘ADC_SPEEDHH    ADC_SPEEDLL  通道號(hào)           啟動(dòng)
  239.     _nop_();                        //等待4個(gè)NOP
  240.     _nop_();
  241.     _nop_();
  242.     _nop_();
  243.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
  244.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC
  245.          
  246.          //實(shí)際濾波測(cè)得4.6V一下不予處理
  247.          if(ADC_RES>0x64){
  248.             y=12000000/256*(ADC_RES+1);                                                  //ADC結(jié)果轉(zhuǎn)換 單位是最大12000毫伏          
  249.            cp=y/100000;                                                        //結(jié)果轉(zhuǎn)換120v  放大10倍最大電壓
  250.                                         }
  251. }

  252.    void jiexibuf()                 //解析接受到的數(shù)據(jù)
  253. {        unsigned long h;
  254.         unsigned long j;
  255.         unsigned long l;
  256.         unsigned long o;
  257.         vcc    = (bufRxd[3]<<8)| bufRxd[4];        //電壓          int16位
  258.         vci    = (bufRxd[5]<<8)| bufRxd[6];        //電流          int16位
  259.         power  = (bufRxd[7]<<8)| bufRxd[8];        //功率          int16位
  260.          h     = (bufRxd[9]<<8)| bufRxd[10];//電能 32位數(shù)據(jù)高16位
  261.          j           = (bufRxd[11]<<8)|bufRxd[12];//電能 32位數(shù)據(jù)低16位
  262.          l     = h<<16;
  263.          o     = (l|j)*100;
  264.         kwh   =  o/3200;             
  265.                                 }
  266. void  diannengjisuan()        //計(jì)算電能顯示函數(shù)
  267. {         unsigned long x;
  268.           static bit p=1;
  269.        
  270.          if(p==1){        //開(kāi)始初始電能記錄
  271.                      if(s1==0){  //刷新是否有電能數(shù)據(jù)
  272.                                     x=kwh1;                // 初始電能傳給x
  273.                                     p=0;                //退出初始電能記錄
  274.                                                           }       
  275.                        }
  276.      // kwh=kwh1-x;
  277.              }

  278. void UartInit()                //4800bps@11.0592MHz

  279. {
  280. //        P_SW1=P_SW1|S1_S0;
  281.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  282.         AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
  283.         AUXR |= 0x04;                //定時(shí)器2時(shí)鐘為Fosc,即1T
  284.         T2L = 0xC0;                //設(shè)定定時(shí)初值
  285.         T2H = 0xFD;                //設(shè)定定時(shí)初值
  286.         AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
  287. }
  288. void UartWxd(){       
  289.         unsigned char u; //數(shù)據(jù)位置         bufWxd[u]  
  290.          for(u=0;u<=7;u++)
  291.          {       
  292.         flagTxd=0;
  293.                 SBUF=bufWxd[u];                //          SBUF=bufWxd[u];
  294.                 while(!flagTxd);
  295.                                                
  296.         }
  297.                                         }

  298. /*----------------------------
  299. 軟件延時(shí)
  300. ----------------------------*/
  301. void Delay(unsigned int n)
  302. {
  303.     unsigned int x;

  304.     while (n--)
  305.     {
  306.         x = 5000;
  307.         while (x--);
  308.     }
  309. }



  310. void InterruptUART() interrupt 4{
  311.     if (RI){ //接收到字節(jié)
  312.         RI = 0; //手動(dòng)清零接收中斷標(biāo)志位
  313.         bufRxd[cntRxd++] = SBUF; //接收的數(shù)據(jù)存到接收緩沖區(qū),數(shù)組
  314.            if(cntRxd==25){                  //接收24幀數(shù)據(jù),然后復(fù)位接收計(jì)數(shù)器,下次從0開(kāi)始接收
  315.                  cntRxd=0;
  316.                               }
  317.     }
  318.     if (TI){ //字節(jié)發(fā)送完畢
  319.        TI = 0; //手動(dòng)清零發(fā)送中斷標(biāo)志位
  320.            flagTxd = 1; //設(shè)置字節(jié)發(fā)送完成標(biāo)志
  321.     }
  322.         }
  323. //清中斷標(biāo)志/清中斷標(biāo)志
  324. //void PCA_isr() interrupt 7
  325. //{
  326. //    CCF0 = 0;                       //清中斷標(biāo)志
  327. //    CCAP0L = value;
  328. //    CCAP0H = value >> 8;            //更新比較值
  329. //    value += T100Hz;
  330. //    if (cnt-- == 0)
  331. //    {
  332. //        cnt = 100;                  //記數(shù)100次
  333. //       PCA_LED = !PCA_LED;         //每秒閃爍一次
  334. //    }
  335. //}
  336. ////            關(guān)于LCD 1602 LCD 1602 LCD 1602 LCD 1602 LCD 1602 LCD 1602 LCD 1602                            /////////////////LCD的一些定義

  337. void LcdWriteCom(unsigned char com)          //寫入命令
  338. {
  339.         LCD1602_E = 0;         //使能清零
  340.         LCD1602_RS = 0;         //選擇寫入命令

  341.         LCD1602_DATAPINS = com >>2;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  342.         Lcd1602_Delay1ms();

  343.         LCD1602_E = 1;         //寫入時(shí)序
  344.         Lcd1602_Delay5ms();
  345.         LCD1602_E = 0;

  346.         LCD1602_DATAPINS = com << 2; //發(fā)送低四位       
  347.         Lcd1602_Delay1ms();

  348.         LCD1602_E = 1;         //寫入時(shí)序
  349.         Lcd1602_Delay5ms();
  350.         LCD1602_E = 0;
  351.                                 }
  352. void LcdWriteData(unsigned char dat)                        //寫入數(shù)據(jù)
  353. {
  354.         LCD1602_E = 0;          //使能清零
  355.         LCD1602_RS = 1;          //選擇寫入數(shù)據(jù)
  356. //        LCD1602_RW = 0;          //選擇寫入
  357.           
  358.              
  359.         LCD1602_DATAPINS = dat >>2;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  360.         Lcd1602_Delay1ms();

  361.         LCD1602_E = 1;          //寫入時(shí)序
  362.         Lcd1602_Delay5ms();
  363.         LCD1602_E = 0;

  364.         LCD1602_DATAPINS = dat << 2; //寫入低四位
  365.         Lcd1602_Delay1ms();

  366.         LCD1602_E = 1;          //寫入時(shí)序
  367.         Lcd1602_Delay5ms();
  368.         LCD1602_E = 0;
  369. }
  370. void LcdInit()                                                  //LCD初始化子程序
  371. {       
  372.         Delay(20);
  373.         LcdWriteCom(0x32);         //將8位總線轉(zhuǎn)為4位總線
  374.         LcdWriteCom(0x28);         //在四位線下的初始化
  375.         LcdWriteCom(0x0c);  //開(kāi)顯示不顯示光標(biāo)
  376.         LcdWriteCom(0x06);  //寫一個(gè)指針加1
  377.         LcdWriteCom(0x01);  //清屏
  378.         //LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
  379. }
  380. void lcd1602()
  381. {        LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
  382.         LcdWriteData('V');
  383.         LcdWriteData(':');
  384.         LcdWriteData('0'+vcc/10000%10);
  385.         LcdWriteData('0'+vcc/1000%10);
  386.         LcdWriteData('0'+vcc/100%10);
  387.         LcdWriteData('.');
  388.         LcdWriteData('0'+vcc/10%10);
  389.         LcdWriteData('0'+vcc%10);
  390.         LcdWriteData(' ');
  391. ……………………

  392. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


所有程序51hei提供下載:
485 - 通訊程序加顯示.zip (53.37 KB, 下載次數(shù): 131)

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:864602 發(fā)表于 2021-1-20 21:15 | 只看該作者
學(xué)習(xí)利器,謝謝
回復(fù)

使用道具 舉報(bào)

板凳
ID:507641 發(fā)表于 2022-9-22 10:14 | 只看該作者
原理圖都沒(méi)有,怎么分析??/
回復(fù)

使用道具 舉報(bào)

地板
ID:507641 發(fā)表于 2022-9-22 10:25 | 只看該作者
原理圖與 pcb都可能,結(jié)合程序分析才能分析.下載看你的還要幣???怎么的會(huì)有人幫分析老大???
回復(fù)

使用道具 舉報(bào)

5#
ID:1046301 發(fā)表于 2022-9-30 08:34 | 只看該作者
從事電源類開(kāi)發(fā)的。加個(gè)好友一起學(xué)習(xí)一下。
回復(fù)

使用道具 舉報(bào)

6#
ID:899981 發(fā)表于 2024-6-21 18:31 | 只看該作者
AD能接LCD1602?
回復(fù)

使用道具 舉報(bào)

7#
ID:899981 發(fā)表于 2024-7-6 11:14 | 只看該作者
我換了STC154K32S4,PWM無(wú)輸出,也是這個(gè)程序:#include <reg52.h>
#include "intrins.h"
sfr AUXR        =   0x8E;   //0000,0000 輔助寄存器
sfr T2H         =   0xD6;   //0000,0000 T2高字節(jié)
sfr T2L         =   0xD7;   //0000,0000 T2低字節(jié)

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;


sfr        P7     = 0xF8;

//PWM模塊寄存器定義
sfr P_SW1  = 0xA2;             //外設(shè)功能切換寄存器1   針腳選擇功能寄存器

#define CCP_S0 0x10                 //P_SW1.4         選擇針腳功能
#define CCP_S1 0x20                 //P_SW1.5         選擇針腳功能
#define S1_S1 0x80                 //P_SW3.6         選擇針腳功能
#define S1_S0 0x40                 //P_SW3.7         選擇針腳功能
sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
sfr ADC_RES     =   0xBD;           //ADC高8位結(jié)果
sfr ADC_LOW2    =   0xBE;           //ADC低2位結(jié)果
sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標(biāo)志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540個(gè)時(shí)鐘
#define ADC_SPEEDL  0x20            //360個(gè)時(shí)鐘
#define ADC_SPEEDH  0x40            //180個(gè)時(shí)鐘
#define ADC_SPEEDHH 0x60            //90個(gè)時(shí)鐘
                                                                                                                                                                                                                                                                            
sfr CCON        =   0xD8;           //PCA控制寄存器
sbit CCF0       =   CCON^0;         //PCA模塊0中斷標(biāo)志
sbit CCF1       =   CCON^1;         //PCA模塊1中斷標(biāo)志
sbit CR         =   CCON^6;         //PCA定時(shí)器運(yùn)行控制位
sbit CF         =   CCON^7;         //PCA定時(shí)器溢出標(biāo)志
sfr CMOD        =   0xD9;           //PCA模式寄存器
sfr CL          =   0xE9;           //PCA定時(shí)器低字節(jié)
sfr CH          =   0xF9;           //PCA定時(shí)器高字節(jié)
sfr CCAPM0      =   0xDA;           //PCA模塊0模式寄存器  
sfr CCAP0L      =   0xEA;           //PCA模塊0捕獲寄存器 LOW
sfr CCAP0H      =   0xFA;           //PCA模塊0捕獲寄存器 HIGH
sfr CCAPM1      =   0xDB;           //PCA模塊1模式寄存器
sfr CCAP1L      =   0xEB;           //PCA模塊1捕獲寄存器 LOW
sfr CCAP1H      =   0xFB;           //PCA模塊1捕獲寄存器 HIGH
sfr CCAPM2      =   0xDC;           //PCA模塊2模式寄存器
sfr CCAP2L      =   0xEC;           //PCA模塊2捕獲寄存器 LOW
sfr CCAP2H      =   0xFC;           //PCA模塊2捕獲寄存器 HIGH
sfr PCA_PWM0    =   0xf2;           //PCA模塊0的PWM寄存器
sfr PCA_PWM1    =   0xf3;           //PCA模塊1的PWM寄存器
sfr PCA_PWM2    =   0xf4;           //PCA模塊2的PWM寄存器
///////////////////////////////////////////////////////////函數(shù)列表、、、、、、、、、、、、、、、、、、、、、、、、、、、

void Timer0Init(); //初始化T0


void pwm();         //解析接受到的數(shù)據(jù)


void Delay(unsigned int n);           //軟件延時(shí) 1.6毫秒左右

///////////////////////////////////////////////////////////定義的一些變量、、、、、、、、、、、、、、、、、、、、、、、、、、、
bit flagTxd = 0; //單字節(jié)發(fā)送完成標(biāo)志,用來(lái)替代 TXD 中斷標(biāo)志位
sbit s1 = P3^3;         //切換繼電器
sbit km = P3^2;         //功率繼電器接觸器
sbit pwmdip = P1^1;
sbit k1 = P3^0;                //按鈕
sbit PCA_LED = P1^2;

unsigned char cntRxd = 0; //接收字節(jié)計(jì)數(shù)器
unsigned char pdata bufRxd[30]; //接收字節(jié)緩沖區(qū)
unsigned char code bufWxd[8] ={0x01,0x03,0x00,0x48,0x00,0x0A,0x45,0xDB,};//發(fā)送的數(shù)據(jù)        增加了code關(guān)鍵字,此數(shù)組寫在程序區(qū)減少使用內(nèi)部?jī)?nèi)存128K
unsigned long pdata cnt = 0; //毫秒計(jì)數(shù)
//unsigned long pdata sec; //秒計(jì)數(shù)
//unsigned cha *but;// 發(fā)送指針
unsigned int pdata vcc; // 電壓
unsigned int pdata vci; // 電流
unsigned int pdata power; // 功率
unsigned long pdata kwh=0; // 電能
unsigned long pdata kwh1; // 初始電能
unsigned char pw;         //設(shè)定的空占比%
unsigned int value; // 電壓
unsigned char cp; //充電樁PWM波形 cp電壓采集信號(hào)        120
////            關(guān)于LCD 1602        /////////////////LCD的一些定義
sfr P5   = 0xC8;
unsigned char pdata lcd1[16];         //LCD第一行
unsigned char pdata lcd2[16];         //LCD第二行
sbit LCD1602_RS = P5^5;         //命令、數(shù)據(jù)選擇 H\L
sbit LCD1602_E = P5^4;         //使能
unsigned char pdata ki;        //電流顯示1表示16A   2表示32A

#define LEDDATA P7   //定義P1口為數(shù)據(jù)端
#define T100Hz 256
void LcdWriteCom(unsigned char com); /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/       
void LcdWriteData(unsigned char dat);        /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/
void LcdInit();                        /*LCD1602初始化子程序*/       
void lcd1602();         //1602顯示刷新
void Lcd1602_Delay5ms();
void Lcd1602_Delay1ms();




                        

void main(){
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

        P_SW1=P_SW1|S1_S0;
    EA = 1; //使能總中斷

   
            pwm();         //初始化pwm模塊設(shè)置

       
        Timer0Init(); //初始化T0



    while (1){

                                         }
}
  
       



  void pwm(){  //PWM程序、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

   
    ACC = P_SW1;                                        //累加器 等于外設(shè)寄存器
    ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
    P_SW1 = ACC;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)         讀取累加器的值寫進(jìn)外設(shè)寄存器
    CCON = 0;                       //初始化PCA控制寄存器
                                    //PCA定時(shí)器停止
                                    //清除CF標(biāo)志
                                    //清除模塊中斷標(biāo)志
    CL = 0;                         //復(fù)位PCA寄存器
    CH = 0;
        CMOD = 0x04;

       
    PCA_PWM0 = 0x00;                //PCA模塊0工作于8位PWM
    CCAP0H = CCAP0L =255-255*60/100;         //PWM0的占空比為87.5% ((100H-20H)/100H)         255-255*設(shè)定空占比        /100
    CCAPM0 = 0x42;                  //00101010  PCA模塊0允許比較功能        使用CCP0腳為可調(diào)脈沖輸出         P1.1

                                 }
void Timer0Init()                //T0作為PWM頻率基準(zhǔn)發(fā)生
{
       
        AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xd5;        //設(shè)置定時(shí)初值                計(jì)算方法,65536-晶振/(256*需要頻率)   
        TH0 = 0xFf;                //設(shè)置定時(shí)初值       
        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
          ET0 =0;                        // 禁止T0中斷
        TF0 = 0;                //清除TF0標(biāo)志
//        EA  =0;                        關(guān)閉總總中斷
    CR = 1;
        }                        //PCA定時(shí)器開(kāi)始工作





回復(fù)

使用道具 舉報(bào)

8#
ID:899981 發(fā)表于 2024-7-6 11:15 | 只看該作者
485 - 通訊程序加顯示.7z (946.05 KB, 下載次數(shù): 2)
這是源碼帶PWM仿真,沒(méi)有PWM輸出。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲影视在线 | 日韩欧美在线观看 | 久久精品久久精品 | 在线观看免费av网站 | www.蜜桃av| 国产成人精品一区二区三区 | 欧美日韩精品一区 | 福利视频一区二区 | 国产婷婷精品av在线 | 国产视频久久 | 中文字幕一区二区三区不卡在线 | 国产精品久久久久久238 | 国产精品一区二区久久久久 | 中文字幕亚洲视频 | 欧美成年人视频在线观看 | 91精品国产综合久久婷婷香蕉 | 亚洲一区二区不卡在线观看 | 国产色| 亚洲福利网| 鲁大师一区影视 | 高清一区二区视频 | 国产精品免费一区二区三区 | 黄网站色大毛片 | 精品一级 | 日本精品视频一区二区三区四区 | 色啪网 | 午夜影院在线免费观看视频 | 久草在线在线精品观看 | 日韩中文字幕在线不卡 | 久久国产欧美日韩精品 | 91精品国产综合久久久亚洲 | 九九热这里只有精品在线观看 | 人人看人人射 | 亚洲第一av网站 | 国产成人在线视频 | 激情婷婷 | 久久国产区| 欧美无乱码久久久免费午夜一区 | 好好的日在线视频 | 成人免费视频在线观看 | 羞羞网站免费观看 |