基于单片机的信号发生器,现在我的程序可产生方波,正弦波,锯齿波,三角波,频率、幅度、频率步进值可调
但老师要求方波要可调节为矩形波,也就是说方波的占空比要可调,但个人无法达成,求助,程序太多放不下,附两张仿真图...
但老师要求方波要可调节为矩形波,也就是说方波的占空比要可调,但个人无法达成,求助,
程序太多放不下,附两张仿真图 展开
程序太多放不下,附两张仿真图 展开
4个回答
2016-05-22
展开全部
#include <reg52.h>
#include "inc/delay.h"
#include "inc/hc595.h"
#define uchar unsigned char
#define uint unsigned int
sbit PIN_ROTARY_A = P2^0; //引脚1接口
sbit PIN_ROTARY_B = P2^1; //引脚2接口
sbit PIN_ROTARY_C = P2^2; //按下的接口
sbit PIN_ROTARY_D = P2^3; //按下的接口
//uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/* 存储待发送的数据 */
/* 1->8的段码表 */
code unsigned char ucDis_Segmentcode[16] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/* 位码表 */
code unsigned char ucDis_Bitcode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
uchar dis_XS[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d};
uchar count = 0;
uchar flag;
uchar Last_BMB_status;
uchar Current_BMB_status;
void display()
{
uchar i;
dis_XS[0] = ucDis_Segmentcode[count/100]; //百位
dis_XS[1] = ucDis_Segmentcode[count%100/10]; //十位
dis_XS[2] = ucDis_Segmentcode[count%10]; //个位
if(i < 2)
{
i++;
}
else
{
i = 0;
}
// for (i = 0; i < 3; i++ )
{
Send_Data(dis_XS[i], ucDis_Bitcode[i]);
//PIN_ROTARY_D = 0;
// Delay1ms(1);
}
}
//************************************************
void main()
{
TMOD=0x01; //定时器0,工作方式1
TH0=0xD8;
TL0=0xF0; //给定时器装上初值,10ms中断一次
ET0=1; //打开定时器中断
EA =1; //打开总中断
TR0=1; //启动定时器0
while(1)
{
//display();
Last_BMB_status=PIN_ROTARY_B;
while(!PIN_ROTARY_A) //BMA为低电平时
{
Current_BMB_status = PIN_ROTARY_B;
flag = 1; //标志位置为1说明编码开关被旋转了
}
if(flag == 1)
{
flag = 0; //时刻要注意这一点!给标志位清零
if((Last_BMB_status == 0)&&(Current_BMB_status == 1)) //BMB上升沿表示正转
{
count++;
if(count == 255)
{
count = 0;
}
}
if((Last_BMB_status == 1)&&(Current_BMB_status == 0)) //BMB下降沿表示反转
{
count--;
if(count == 0)
{
count = 255;
}
}
}
}
}
//***********************************************
void timer0() interrupt 1//定时器0的中断服务程序
{
TH0=0xF8; // TH0=0xD8;
TL0=0xF0; //再次装入初值
display(); //每隔10ms显示一次
if(!PIN_ROTARY_C) //按下旋转编码开关则计数清零
{
count = 0;
}
PIN_ROTARY_D = !PIN_ROTARY_D;
}
#include "inc/delay.h"
#include "inc/hc595.h"
#define uchar unsigned char
#define uint unsigned int
sbit PIN_ROTARY_A = P2^0; //引脚1接口
sbit PIN_ROTARY_B = P2^1; //引脚2接口
sbit PIN_ROTARY_C = P2^2; //按下的接口
sbit PIN_ROTARY_D = P2^3; //按下的接口
//uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/* 存储待发送的数据 */
/* 1->8的段码表 */
code unsigned char ucDis_Segmentcode[16] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/* 位码表 */
code unsigned char ucDis_Bitcode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
uchar dis_XS[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d};
uchar count = 0;
uchar flag;
uchar Last_BMB_status;
uchar Current_BMB_status;
void display()
{
uchar i;
dis_XS[0] = ucDis_Segmentcode[count/100]; //百位
dis_XS[1] = ucDis_Segmentcode[count%100/10]; //十位
dis_XS[2] = ucDis_Segmentcode[count%10]; //个位
if(i < 2)
{
i++;
}
else
{
i = 0;
}
// for (i = 0; i < 3; i++ )
{
Send_Data(dis_XS[i], ucDis_Bitcode[i]);
//PIN_ROTARY_D = 0;
// Delay1ms(1);
}
}
//************************************************
void main()
{
TMOD=0x01; //定时器0,工作方式1
TH0=0xD8;
TL0=0xF0; //给定时器装上初值,10ms中断一次
ET0=1; //打开定时器中断
EA =1; //打开总中断
TR0=1; //启动定时器0
while(1)
{
//display();
Last_BMB_status=PIN_ROTARY_B;
while(!PIN_ROTARY_A) //BMA为低电平时
{
Current_BMB_status = PIN_ROTARY_B;
flag = 1; //标志位置为1说明编码开关被旋转了
}
if(flag == 1)
{
flag = 0; //时刻要注意这一点!给标志位清零
if((Last_BMB_status == 0)&&(Current_BMB_status == 1)) //BMB上升沿表示正转
{
count++;
if(count == 255)
{
count = 0;
}
}
if((Last_BMB_status == 1)&&(Current_BMB_status == 0)) //BMB下降沿表示反转
{
count--;
if(count == 0)
{
count = 255;
}
}
}
}
}
//***********************************************
void timer0() interrupt 1//定时器0的中断服务程序
{
TH0=0xF8; // TH0=0xD8;
TL0=0xF0; //再次装入初值
display(); //每隔10ms显示一次
if(!PIN_ROTARY_C) //按下旋转编码开关则计数清零
{
count = 0;
}
PIN_ROTARY_D = !PIN_ROTARY_D;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
调节占空比用单片机的PWM功能呀
更多追问追答
追问
额,你对这方面了解吗,能不能加个QQ教一下?程序太长这里丢不进去,我补充了两张图片你可以看下
追答
呵呵,那是你弄得太复杂了,单片机只产生一个一定频率的方波,然后百度一个这个频率的滤波电路,然后想有什么波都行,想怎么调都行,软件应该能控制在100行以内吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
老哥你的电路图还有不,我们课设也是做这个,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
发我邮箱,帮你看看,zhxiufan@163.com
更多追问追答
追问
已发,帮我看看谢谢哈
追答
改了一下,不过没改LCD显示,只是方波的PWM控制增加了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询