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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

用STC單片機做的7KW電動車充電樁源程序

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

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

  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;             //外設功能切換寄存器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位結果
  31. sfr ADC_LOW2    =   0xBE;           //ADC低2位結果
  32. sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

  33. #define ADC_POWER   0x80            //ADC電源控制位
  34. #define ADC_FLAG    0x10            //ADC完成標志
  35. #define ADC_START   0x08            //ADC起始控制位
  36. #define ADC_SPEEDLL 0x00            //540個時鐘
  37. #define ADC_SPEEDL  0x20            //360個時鐘
  38. #define ADC_SPEEDH  0x40            //180個時鐘
  39. #define ADC_SPEEDHH 0x60            //90個時鐘
  40.                                                                                                                                                                                                                                                                             
  41. sfr CCON        =   0xD8;           //PCA控制寄存器
  42. sbit CCF0       =   CCON^0;         //PCA模塊0中斷標志
  43. sbit CCF1       =   CCON^1;         //PCA模塊1中斷標志
  44. sbit CR         =   CCON^6;         //PCA定時器運行控制位
  45. sbit CF         =   CCON^7;         //PCA定時器溢出標志
  46. sfr CMOD        =   0xD9;           //PCA模式寄存器
  47. sfr CL          =   0xE9;           //PCA定時器低字節
  48. sfr CH          =   0xF9;           //PCA定時器高字節
  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. ///////////////////////////////////////////////////////////函數列表、、、、、、、、、、、、、、、、、、、、、、、、、、、
  62. void UartInit();   //初始化串口
  63. void Timer0Init(); //初始化T0
  64. void UartWxd();         //發送數據查詢實時信息
  65. void jiexibuf();         //解析接受到的數據
  66. void pwm();         //解析接受到的數據
  67. void InitADC(); //初始化ADC
  68. void GetADCResult();   //讀取ADC的值存儲在變量adc里面
  69. void Delay(unsigned int n);           //軟件延時 1.6毫秒左右
  70. void chongdian();                        //          充電流程
  71. void  diannengjisuan();//J計算初始電能并計算已用電能
  72. void dianliuxuanze(); //按鈕選項電流
  73. ///////////////////////////////////////////////////////////定義的一些變量、、、、、、、、、、、、、、、、、、、、、、、、、、、
  74. bit flagTxd = 0; //單字節發送完成標志,用來替代 TXD 中斷標志位
  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; //接收字節計數器
  81. unsigned char pdata bufRxd[30]; //接收字節緩沖區
  82. unsigned char code bufWxd[8] ={0x01,0x03,0x00,0x48,0x00,0x0A,0x45,0xDB,};//發送的數據        增加了code關鍵字,此數組寫在程序區減少使用內部內存128K
  83. unsigned long pdata cnt = 0; //毫秒計數
  84. unsigned long pdata sec; //秒計數
  85. //unsigned cha *but;// 發送指針
  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;         //設定的空占比%
  92. unsigned char cp; //充電樁PWM波形 cp電壓采集信號        120
  93. ////            關于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;         //命令、數據選擇 H\L
  98. sbit LCD1602_E = P5^4;         //使能
  99. unsigned char pdata ki;        //電流顯示1表示16A   2表示32A

  100. #define LCD1602_DATAPINS P1    //定義P1口為數據端
  101. void LcdWriteCom(unsigned char com); /*LCD1602寫入8位數據子函數*/       
  102. void LcdWriteData(unsigned char dat);        /*LCD1602寫入8位數據子函數*/
  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模塊設置
  129.         InitADC(); //初始化ADC
  130.        
  131.         Timer0Init(); //初始化T0
  132.                 LcdInit();//初始化lcd
  133.                   
  134.     while (1){
  135.         chongdian();  //充電流程
  136.         dianliuxuanze(); //電流選擇函數
  137.        
  138.         if(TF0==1){                                   //t0溢出的次數
  139.                 cnt++;}
  140.       if(pwmdip==1){           //檢測                  
  141.           GetADCResult(); //讀取刷新ADC的值         cp就是讀取的8位電壓信號
  142.             
  143.            }
  144.         if(cnt>=20000){                  //大概1秒鐘,還可以調整
  145.                         
  146.              cnt=0;
  147.                  sec++;
  148.                                                    
  149.                  UartWxd();          //發送電能模塊讀取命令                 
  150.                  jiexibuf();  //解析接受到的數據
  151.                  diannengjisuan(); //電能計算函數
  152.                  lcd1602();          //lcd顯示          
  153.                           }

  154.           

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

  157.            if(cp>111){      //當cp電壓大于11.1時                          狀態1
  158.                  s1=1;                        //小接觸器不吸合 常閉點12V  s1
  159.                  km=1;
  160.                          }           //主接觸器不吸合   
  161.            if(98>cp && cp>81){           //當cp電壓大于8.1V小于9.8時          狀態2                 與車輛已連接
  162.                  s1=0;                        //小接觸器吸合         切換至PWM
  163.                  km=1;                        }           //主接觸器不吸合
  164.            if(66>cp && cp>51){                  //當cp電壓大于5.1小于6.6時          狀態3         充電中
  165.                  s1=0;                   //小接觸器吸合         切換至PWM
  166.                  km=0;                                    //主接觸器吸合  開始充電
  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;                                        //累加器 等于外設寄存器
  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)         讀取累加器的值寫進外設寄存器
  191.     CCON = 0;                       //初始化PCA控制寄存器
  192.                                     //PCA定時器停止
  193.                                     //清除CF標志
  194.                                     //清除模塊中斷標志
  195.     CL = 0;                         //復位PCA寄存器
  196.     CH = 0;
  197.         CMOD = 0x04;
  198.    // CMOD = 0x04;                    //設置PCA時鐘源        t0定時器
  199.                                     //禁止PCA定時器溢出中斷
  200.     PCA_PWM0 = 0x00;                //PCA模塊0工作于8位PWM
  201.     CCAP0H = CCAP0L =255-255*60/100;         //PWM0的占空比為87.5% ((100H-20H)/100H)         255-255*設定空占比        /100
  202.     CCAPM0 = 0x42;                  //00101010  PCA模塊0允許比較功能        使用CCP0腳為可調脈沖輸出         P1.1

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

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

  252.    void jiexibuf()                 //解析接受到的數據
  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位數據高16位
  261.          j           = (bufRxd[11]<<8)|bufRxd[12];//電能 32位數據低16位
  262.          l     = h<<16;
  263.          o     = (l|j)*100;
  264.         kwh   =  o/3200;             
  265.                                 }
  266. void  diannengjisuan()        //計算電能顯示函數
  267. {         unsigned long x;
  268.           static bit p=1;
  269.        
  270.          if(p==1){        //開始初始電能記錄
  271.                      if(s1==0){  //刷新是否有電能數據
  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位數據,可變波特率
  282.         AUXR |= 0x01;                //串口1選擇定時器2為波特率發生器
  283.         AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
  284.         T2L = 0xC0;                //設定定時初值
  285.         T2H = 0xFD;                //設定定時初值
  286.         AUXR |= 0x10;                //啟動定時器2
  287. }
  288. void UartWxd(){       
  289.         unsigned char u; //數據位置         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. 軟件延時
  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){ //接收到字節
  312.         RI = 0; //手動清零接收中斷標志位
  313.         bufRxd[cntRxd++] = SBUF; //接收的數據存到接收緩沖區,數組
  314.            if(cntRxd==25){                  //接收24幀數據,然后復位接收計數器,下次從0開始接收
  315.                  cntRxd=0;
  316.                               }
  317.     }
  318.     if (TI){ //字節發送完畢
  319.        TI = 0; //手動清零發送中斷標志位
  320.            flagTxd = 1; //設置字節發送完成標志
  321.     }
  322.         }
  323. //清中斷標志/清中斷標志
  324. //void PCA_isr() interrupt 7
  325. //{
  326. //    CCF0 = 0;                       //清中斷標志
  327. //    CCAP0L = value;
  328. //    CCAP0H = value >> 8;            //更新比較值
  329. //    value += T100Hz;
  330. //    if (cnt-- == 0)
  331. //    {
  332. //        cnt = 100;                  //記數100次
  333. //       PCA_LED = !PCA_LED;         //每秒閃爍一次
  334. //    }
  335. //}
  336. ////            關于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;         //寫入時序
  344.         Lcd1602_Delay5ms();
  345.         LCD1602_E = 0;

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

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

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

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

  366.         LCD1602_E = 1;          //寫入時序
  367.         Lcd1602_Delay5ms();
  368.         LCD1602_E = 0;
  369. }
  370. void LcdInit()                                                  //LCD初始化子程序
  371. {       
  372.         Delay(20);
  373.         LcdWriteCom(0x32);         //將8位總線轉為4位總線
  374.         LcdWriteCom(0x28);         //在四位線下的初始化
  375.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  376.         LcdWriteCom(0x06);  //寫一個指針加1
  377.         LcdWriteCom(0x01);  //清屏
  378.         //LcdWriteCom(0x80);  //設置數據指針起點
  379. }
  380. void lcd1602()
  381. {        LcdWriteCom(0x80);  //設置數據指針起點
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


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

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:864602 發表于 2021-1-20 21:15 | 只看該作者
學習利器,謝謝
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

5#
ID:1046301 發表于 2022-9-30 08:34 | 只看該作者
從事電源類開發的。加個好友一起學習一下。
回復

使用道具 舉報

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

使用道具 舉報

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

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;             //外設功能切換寄存器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位結果
sfr ADC_LOW2    =   0xBE;           //ADC低2位結果
sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540個時鐘
#define ADC_SPEEDL  0x20            //360個時鐘
#define ADC_SPEEDH  0x40            //180個時鐘
#define ADC_SPEEDHH 0x60            //90個時鐘
                                                                                                                                                                                                                                                                            
sfr CCON        =   0xD8;           //PCA控制寄存器
sbit CCF0       =   CCON^0;         //PCA模塊0中斷標志
sbit CCF1       =   CCON^1;         //PCA模塊1中斷標志
sbit CR         =   CCON^6;         //PCA定時器運行控制位
sbit CF         =   CCON^7;         //PCA定時器溢出標志
sfr CMOD        =   0xD9;           //PCA模式寄存器
sfr CL          =   0xE9;           //PCA定時器低字節
sfr CH          =   0xF9;           //PCA定時器高字節
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寄存器
///////////////////////////////////////////////////////////函數列表、、、、、、、、、、、、、、、、、、、、、、、、、、、

void Timer0Init(); //初始化T0


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


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

///////////////////////////////////////////////////////////定義的一些變量、、、、、、、、、、、、、、、、、、、、、、、、、、、
bit flagTxd = 0; //單字節發送完成標志,用來替代 TXD 中斷標志位
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; //接收字節計數器
unsigned char pdata bufRxd[30]; //接收字節緩沖區
unsigned char code bufWxd[8] ={0x01,0x03,0x00,0x48,0x00,0x0A,0x45,0xDB,};//發送的數據        增加了code關鍵字,此數組寫在程序區減少使用內部內存128K
unsigned long pdata cnt = 0; //毫秒計數
//unsigned long pdata sec; //秒計數
//unsigned cha *but;// 發送指針
unsigned int pdata vcc; // 電壓
unsigned int pdata vci; // 電流
unsigned int pdata power; // 功率
unsigned long pdata kwh=0; // 電能
unsigned long pdata kwh1; // 初始電能
unsigned char pw;         //設定的空占比%
unsigned int value; // 電壓
unsigned char cp; //充電樁PWM波形 cp電壓采集信號        120
////            關于LCD 1602        /////////////////LCD的一些定義
sfr P5   = 0xC8;
unsigned char pdata lcd1[16];         //LCD第一行
unsigned char pdata lcd2[16];         //LCD第二行
sbit LCD1602_RS = P5^5;         //命令、數據選擇 H\L
sbit LCD1602_E = P5^4;         //使能
unsigned char pdata ki;        //電流顯示1表示16A   2表示32A

#define LEDDATA P7   //定義P1口為數據端
#define T100Hz 256
void LcdWriteCom(unsigned char com); /*LCD1602寫入8位數據子函數*/       
void LcdWriteData(unsigned char dat);        /*LCD1602寫入8位數據子函數*/
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模塊設置

       
        Timer0Init(); //初始化T0



    while (1){

                                         }
}
  
       



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

   
    ACC = P_SW1;                                        //累加器 等于外設寄存器
    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)         讀取累加器的值寫進外設寄存器
    CCON = 0;                       //初始化PCA控制寄存器
                                    //PCA定時器停止
                                    //清除CF標志
                                    //清除模塊中斷標志
    CL = 0;                         //復位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*設定空占比        /100
    CCAPM0 = 0x42;                  //00101010  PCA模塊0允許比較功能        使用CCP0腳為可調脈沖輸出         P1.1

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





回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲 91| 亚洲成人精品久久久 | 欧美一区二区在线观看 | 久久剧场 | a级大片| 精品国产一区二区国模嫣然 | 亚洲成人一区 | 一本大道久久a久久精二百 欧洲一区二区三区 | 麻豆久久久久久久 | 成人在线网址 | 精品国产精品三级精品av网址 | 国产高清一区二区三区 | 亚洲视频在线免费观看 | 精品久久久久久久久久久久 | 久久精品中文字幕 | 女女百合av大片一区二区三区九县 | 日本成人中文字幕 | www.日日操 | 色婷婷久久久久swag精品 | 午夜视频在线观看一区二区 | 日日欧美 | 国产精品久久久久久久久久 | 欧美成人aaa级毛片在线视频 | www.se91 | 成人福利网 | www.国产日本| 国产乱码精品一区二区三区五月婷 | 国产精品中文字幕在线 | 欧美一区二区三区,视频 | 中文字幕在线一区 | 久久不卡 | 亚洲一区二区精品视频 | 欧美日韩国产一区二区三区 | 一区二区在线 | 欧美在线网站 | 91色啪| 丁香久久 | 偷拍自拍网址 | 成人免费一区二区三区视频网站 | 精品国产亚洲一区二区三区大结局 | 日韩电影一区二区三区 |