基于51单片机的SPWM波(数码管)原理图、流程图、物料清单、仿真图、源代码

请添加图片描述

基于51单片机的SPWM波(数码管)

基于at89c1单片机。
要求能够输出SPWM并且测量输入正弦波的频率并显示。
直流电压通过DC-AC电路转为方波,搭建检测电路进行滤波和调节,得到正弦波,单片机采集该正弦波的频率,并显示。请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#include "reg51.h"
sbit out=P3^7;//输出

unsigned int pwm=0;
unsigned char code table[]={	//正弦编码
128,130,132,134,136,139,141,143,145,148,150,152,154,156,158,161,163,165,167,169,171,173,175,177,180,182,184,186,188,190,191,
193,195,197,199,201,203,204,206,208,210,211,213,215,216,218,220,221,223,224,226,227,228,230,231,232,234,235,236,237,238,239,
240,242,243,243,244,245,246,247,248,249,249,250,251,251,252,252,253,253,254,254,254,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,254,254,254,253,253,252,252,251,251,250,249,249,248,247,246,245,244,244,243,242,241,240,238,237,236,235,
234,232,231,230,228,227,226,224,223,221,220,218,217,215,213,212,210,208,206,205,203,201,199,197,195,194,192,190,188,186,184,
182,180,178,176,174,171,169,167,165,163,161,159,156,154,152,150,148,146,143,141,139,137,134,132,130,128,125,123,121,119,117,
114,112,110,108,105,103,101,99,97,95,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,51,49,47,45,44,42,40,39,
37,36,34,33,31,30,28,27,25,24,23,22,20,19,18,17,16,15,14,13,12,11,10,9,8,7,7,6,5,5,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,9,10,10,11,12,13,14,15,16,18,19,20,21,22,24,25,26,28,29,31,32,34,35,37,38,40,42,43,45,47,48,
50,52,54,56,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,88,90,92,94,96,98,101,103,105,107,109,112,114,116,118,120,123,125};
void delay()//延时,并产生SPWM
{
	unsigned int i=0;
	for(i=0;i<255;i++)
	{
		if(i<table[pwm])
			out=1;
		else
			out=0;
	}
}
void main()
{
	IT0=1;//跳变沿出发方式(下降沿)
	EX0=1;//打开INT0的中断允许。
	TMOD|=0X20;
	TH1=118;
	TL1=118;	
	ET1=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR1=1;
	while(1)
	{
		delay();
	}
}
void Timer1() interrupt 3//定时器1中断
{
	if(pwm<359)//SPWM占空比控制
		pwm++;
	else
		pwm=0;
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 我可以给你一些提示,帮助你完成你的任务。你首先需要为51单片机编写一段代码,用来输出PWM和SPWM。然后,你需要根据你的应用场景调节PWM模块的参数,比如脉冲宽度、脉冲周期、正常/反转等。最后,你需要调整SPWM模块的参数,以确保输出的SPWM形满足你的应用要求。 ### 回答2: 生成代码(51单片机同时输出PWM和SPWM) 在51单片机中,可以通过使用定时器来生成PWM和SPWM。 要生成PWM,可以使用定时器模块,并设置占空比来控制输出形的高低电平时间比例。下面是一个简单的示例代码: ``` #include <reg52.h> sbit PWM_PIN = P1^0; // PWM输出引脚 void main() { TMOD = 0x01; // 设置定时器1为16位定时器 TH1 = 0xFF; // 设置定时器初值 TL1 = 0xFF; // 设置定时器初值 P1 = 0x00; // 初始化P1端口 while(1) { PWM_PIN = 1; // 设置PWM引脚为高电平 TR1 = 1; // 启动定时器1 while (TF1 == 0); // 等待定时器溢出 PWM_PIN = 0; // 设置PWM引脚为低电平 TR1 = 0; // 停止定时器1 TF1 = 0; // 清除定时器1溢出标志位 } } ``` 要生成SPWM,可以使用定时器中断来实现。我们可以在定时器中断服务函数中动态改变输出引脚的状态,从而生成不同频率和幅度的形。下面是一个简单的示例代码: ``` #include <reg52.h> sbit SPWM_PIN = P1^0; // SPWM输出引脚 void Timer1_ISR() interrupt 1 { // 在定时器中断服务函数中设置SPWM引脚的状态 SPWM_PIN = !SPWM_PIN; // 切换SPWM引脚的电平状态 } void main() { TMOD = 0x09; // 设置定时器1为工作模式1,并启用定时器1中断 TH1 = 0xFF; // 设置定时器初值 TL1 = 0xFF; // 设置定时器初值 EA = 1; // 允许中断 while(1) { // 主程序中可以根据需要来调整定时器的参数 } } ``` 在上述代码中,通过初始化定时器相关的寄存器,并在适当的地方设置输出引脚的状态,就可以同时生成PWM和SPWM。代码仅供参考,实际应用时需要根据具体需求进行修改和调整。 ### 回答3: 生成代码(51单片机同时输出pwm和spwm)需要使用定时器和中断来实现。以下是一种可能的代码实现: 首先,需要初始化51单片机的定时器和中断配置: ``` void Timer_Init() { TMOD = 0x01; // 使用定时器0的模式1 TH0 = 0xff; // 定时器初值设为255 TL0 = 0xff; ET0 = 1; // 开启定时器0中断 TR0 = 1; // 启动定时器0 EA = 1; // 全局中断允许 } void PWM_Init() { // 初始化PWM的相关寄存器设置 // ... } void SPWM_Init() { // 初始化SPWM的相关寄存器设置 // ... } void Interrupt_Init() { EX0 = 1; // 开启外部中断0 IT0 = 1; // 边沿触发 EX1 = 1; // 开启外部中断1 IT1 = 1; // 边沿触发 } void main() { Timer_Init(); PWM_Init(); SPWM_Init(); Interrupt_Init(); while (1) { // 主循环处理其他任务 // ... } } ``` 接下来,需要实现定时器中断服务函数和外部中断服务函数: ``` void Timer0_ISR() interrupt 1 { // 处理PWM的中断服务 // ... } void External0_ISR() interrupt 0 { // 处理SPWM的中断服务 // ... } void External1_ISR() interrupt 2 { // 处理其他外部中断的中断服务 // ... } ``` 在以上代码中,Timer0_ISR函数用于处理每隔一定时间(由定时器的初值决定)触发的定时器中断,可用于产生PWM信号;External0_ISR函数用于处理外部中断0触发的中断,可用于产生SPWM信号;External1_ISR函数用于处理其他外部中断触发的中断,可用于其他操作。 需要根据具体的PWM和SPWM的输出需求,编写相应的中断服务函数来实现输出形的生成。注意,在编写中断服务函数时,为避免中断函数执行时间过长导致其他重要操作的延迟,应尽量保持中断服务函数的简洁和效率。 以上是一种基本的实现方法,具体的生成代码还需根据具体的硬件电路和输出要求进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值