在protues软件中搭建电路,在keil c51中搭建工程,仿真出使用TLC549芯片采样模拟信号数据,并且根据输入模拟信号大小控制直流电机转速。
要求使用89c51芯片,DC_MOTOR,电机调速使用定时器产生PWM。
在protues软件中搭建电路,在keil c51中搭建工程,仿真出使用TLC549芯片采样模拟信号数据,并且根据输入模拟信号大小控制直流电机转速。
要求使用89c51芯片,DC_MOTOR,电机调速使用定时器产生PWM。
关注让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言问题解答:
在Protues中搭建电路: 1)从元件库中选择所需元件,如TLC549芯片、89C51芯片、DC_MOTOR等,拖放到工作区。 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
}
仿真出使用TLC549芯片采样模拟信号数据: 1)在Protues中仿真电路时,先添加所需的信号源,如下图所示。 
2)在信号源中生成模拟信号,如下图所示。 
根据输入模拟信号大小控制直流电机转速: 1)在程序中读取TLC549芯片采样后的模拟信号数据。 2)根据模拟信号数据计算出PWM计数器的计数值。 3)根据PWM计数器的计数值,控制PWM产生的占空比和频率,从而控制直流电机转速。代码中使用定时器0产生PWM,占空比为50%,频率为10kHz。
代码:
#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
}