qq_52645865 2021-06-23 12:56 采纳率: 0%
浏览 61

单片机在protues软件中搭建电路,在keil c51中搭建工程

在protues软件中搭建电路,在keil c51中搭建工程,仿真出使用TLC549芯片采样模拟信号数据,并且根据输入模拟信号大小控制直流电机转速。

      要求使用89c51芯片,DC_MOTOR,电机调速使用定时器产生PWM。

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-06 19:08
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题解答:
    1. 在Protues中搭建电路: 1)从元件库中选择所需元件,如TLC549芯片、89C51芯片、DC_MOTOR等,拖放到工作区。 2)连接元件之间的引脚,电路图如下图所示。 电路图

    2. 在Keil C51中搭建工程: 1)在Keil C51中创建新的工程。 2)将工程中所需的文件添加到工程中,包括头文件、源文件和配置文件,如下图所示。 添加文件

      3)编写程序代码,根据输入模拟信号大小控制直流电机转速,代码如下。

    #include <reg52.h>
    #include <intrins.h>
    #include "TLC549.h"
    #define PWM_FREQ 10000 // PWM频率为10kHz
    #define PWM_DUTY 50 // 占空比50%
    sbit EN_MOTOR = P1^4;
    void main() {
        unsigned char adc_data = 0;
        unsigned int pwm_cnt = 0;
        unsigned int pwm_top = 0;
        initTLC549(); // 初始化TLC549芯片
        
        TMOD |= 0x01; // 定时器0工作在模式1(16位定时器)下
        TH0 = 0xFF; // 定时器0赋初值
        TL0 = 0xFF;
        pwm_top = (65536 / PWM_FREQ) - 1; // 计算PWM计数器的上限值
        while (1) {
            adc_data = readTLC549(); // 读取TLC549芯片采样后的模拟信号数据
            pwm_cnt = (unsigned int)adc_data * (unsigned int)pwm_top / 255; // 计算PWM计数器的计数值
            EN_MOTOR = 1; // 使能直流电机
            TH0 = pwm_cnt >> 8; // 计算PWM计数器的高8位和低8位
            TL0 = pwm_cnt & 0xFF;
            TR0 = 1; // 启动定时器0
        }
    }
    void timer0_isr() interrupt 1 { // 定时器0中断服务程序
        EN_MOTOR = 0; // 关闭直流电机
        TR0 = 0; // 停止定时器0
    }
    
    1. 仿真出使用TLC549芯片采样模拟信号数据: 1)在Protues中仿真电路时,先添加所需的信号源,如下图所示。 信号源

      2)在信号源中生成模拟信号,如下图所示。 模拟信号

    2. 根据输入模拟信号大小控制直流电机转速: 1)在程序中读取TLC549芯片采样后的模拟信号数据。 2)根据模拟信号数据计算出PWM计数器的计数值。 3)根据PWM计数器的计数值,控制PWM产生的占空比和频率,从而控制直流电机转速。代码中使用定时器0产生PWM,占空比为50%,频率为10kHz。

    3. 代码:

    #include <reg52.h>
    #include <intrins.h>
    #include "TLC549.h"
    #define PWM_FREQ 10000 // PWM频率为10kHz
    #define PWM_DUTY 50 // 占空比50%
    sbit EN_MOTOR = P1^4;
    void main() {
        unsigned char adc_data = 0;
        unsigned int pwm_cnt = 0;
        unsigned int pwm_top = 0;
        initTLC549(); // 初始化TLC549芯片
        
        TMOD |= 0x01; // 定时器0工作在模式1(16位定时器)下
        TH0 = 0xFF; // 定时器0赋初值
        TL0 = 0xFF;
        pwm_top = (65536 / PWM_FREQ) - 1; // 计算PWM计数器的上限值
        while (1) {
            adc_data = readTLC549(); // 读取TLC549芯片采样后的模拟信号数据
            pwm_cnt = (unsigned int)adc_data * (unsigned int)pwm_top / 255; // 计算PWM计数器的计数值
            EN_MOTOR = 1; // 使能直流电机
            TH0 = pwm_cnt >> 8; // 计算PWM计数器的高8位和低8位
            TL0 = pwm_cnt & 0xFF;
            TR0 = 1; // 启动定时器0
        }
    }
    void timer0_isr() interrupt 1 { // 定时器0中断服务程序
        EN_MOTOR = 0; // 关闭直流电机
        TR0 = 0; // 停止定时器0
    }
    
    评论

报告相同问题?