找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 541|回复: 3
收起左侧

关于STC15单片机PWM 1KHZ设置没有输出的问题

[复制链接]
ID:899981 发表于 2024-7-6 10:28 | 显示全部楼层 |阅读模式
如题,坛内朋友的代码,之前是STC15WS408,我换成STC15W4K32S4


485 - 通讯程序加显示.rar

1007.54 KB, 下载次数: 3

回复

使用道具 举报

ID:899981 发表于 2024-7-6 10:59 | 显示全部楼层
#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定时器开始工作





回复

使用道具 举报

ID:1034262 发表于 2024-7-6 14:47 | 显示全部楼层
这是SYC官方的例子,你试试
STC15系列-PCA相关程序.rar (209.38 KB, 下载次数: 2)
回复

使用道具 举报

ID:899981 发表于 2024-7-6 16:20 | 显示全部楼层
coody_sz 发表于 2024-7-6 14:47
这是SYC官方的例子,你试试

谢谢,我试试看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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