OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5213|回复: 6

51单片机同时产生方波和正弦波,方波相位可调,求大神指导相位怎么调,下面是我的程序,目前频率可调,方波有点问题

[复制链接]

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-12-23
在线时间
13 小时
发表于 2017-9-4 14:21:56 | 显示全部楼层 |阅读模式
5金钱
#include<reg52.h> //°üo&#172;í·&#206;&#196;&#188;t£&#172;ò&#187;°&#227;&#199;é&#191;&#246;2&#187;Dèòa&#184;&#196;&#182;ˉ£&#172;í·&#206;&#196;&#188;t°üo&#172;ì&#216;êa1|&#196;ü&#188;&#196;′&#230;&#198;÷μ&#196;&#182;¨ò&#229;
#define uchar unsigned char
#define  uint  unsigned int


uint counter,step,phase;
#define DAC0832_DATA P0 P1
//sbit P10=P1^0;

uchar code SineTab[256]={                    //&#213;y&#207;ò2¨&#182;&#212;ó|êy×&#214;á&#191;
  0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
        0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
        0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,
        0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
        0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
        0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,
        0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb4,
        0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,
        0x80,0x7d,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,
        0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
        0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,
        0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,
        0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,
        0x9,0xa,0xc,0xd,0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,
        0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,0x43,0x46,0x48,0x4b,
        0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c
};

uchar code SquareTab[256]={
  0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
        0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
        0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
        0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
        0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
        0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
        0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
        0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
};


void delayms(uint ms)
{
        uint i;
        while(ms--)
          {
                        for(i=0;i<120;i++);
                 }
}

void  int0()interrupt 0
{
delayms(10);
        if(INT0==0)
        {
                 //phase++;
           if(step<4096)
                 {
                  step++;
                       
                 }
                 else
                         step=2;
        }
}


void  int1()interrupt 0
{
delayms(10);
        if(INT1==0)
        {
                 P1=~P1;
           if(step>2)
                 {
                  step--;
                 }
                 else
                         step=4096;
        }
}
/*------------------------------------------------
                 &#182;¨ê±&#198;÷&#214;D&#182;&#207;×ó3ìDò
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
//TH0=(65536-500)/256;                  //&#214;&#216;D&#194;&#184;3&#214;μ 12M&#190;§&#213;&#241;&#188;&#198;&#203;&#227;£&#172;&#214;&#184;á&#238;&#214;ü&#198;ú1uS£&#172;
//TL0=(65536-500)*256;         //1mS·&#189;2¨°&#235;&#184;&#246;&#214;ü&#198;ú500uS£&#172;&#188;′&#182;¨ê±500′&#206;
                              //ò&#231;3&#246;è&#187;oóê&#228;3&#246;&#182;&#203;è&#161;·′
TH0=0xFF;
TL0=0xFF;
counter=counter+step;
        //phase=0.0055+step;
P0=SineTab[(uint)counter>>8];
P1=SquareTab[(uint)counter>>8];
//P10=~P1^0;
//P0=SineTab[(uint)counter>>8];
}
void INT_init(void)
{
  EX0=1;
        IT0=1;
        EX1=1;
        IT1=1;
        EA=1;
        PX0=1;
}
/*------------------------------------------------
                    &#182;¨ê±&#198;÷3&#245;ê&#188;&#187;ˉ×ó3ìDò
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //ê1ó&#195;&#196;£ê&#189;1£&#172;16&#206;&#187;&#182;¨ê±&#198;÷£&#172;ê1ó&#195;"|"·&#251;o&#197;&#191;éò&#212;&#212;úê1ó&#195;&#182;à&#184;&#246;&#182;¨ê±&#198;÷ê±2&#187;êüó°&#207;ì                     
TH0=0xFE;              //&#184;&#248;&#182;¨3&#245;&#214;μ£&#172;&#213;aà&#239;ê1ó&#195;&#182;¨ê±&#198;÷×&#238;′ó&#214;μ′ó0&#191;aê&#188;&#188;&#198;êyò&#187;&#214;±μ&#189;65535ò&#231;3&#246;
TL0=0x0C;
ET0=1;           //&#182;¨ê±&#198;÷&#214;D&#182;&#207;′ò&#191;a
TR0=1;           //&#182;¨ê±&#198;÷&#191;a1&#216;′ò&#191;a
}
/*
void timer1(void) interrupt 3
{
TH1=(65536-100)/256;;
TL1=(65536-100)*256; ;

}
void Init_Timer1(void)
{
TMOD |= 0x01;          //ê1ó&#195;&#196;£ê&#189;1£&#172;16&#206;&#187;&#182;¨ê±&#198;÷£&#172;ê1ó&#195;"|"·&#251;o&#197;&#191;éò&#212;&#212;úê1ó&#195;&#182;à&#184;&#246;&#182;¨ê±&#198;÷ê±2&#187;êüó°&#207;ì                     
TH1=0xFE;              //&#184;&#248;&#182;¨3&#245;&#214;μ£&#172;&#213;aà&#239;ê1ó&#195;&#182;¨ê±&#198;÷×&#238;′ó&#214;μ′ó0&#191;aê&#188;&#188;&#198;êyò&#187;&#214;±μ&#189;65535ò&#231;3&#246;
TL1=0x0C;
ET1=1;           //&#182;¨ê±&#198;÷&#214;D&#182;&#207;′ò&#191;a
TR1=1;           //&#182;¨ê±&#198;÷&#191;a1&#216;′ò&#191;a
}
*/
/*------------------------------------------------
                    &#214;÷3ìDò
------------------------------------------------*/
main()
{
INT_init();
Init_Timer0();
step=2;
while(1)
{
;
}
}

QQ截图20170904142055.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165312
金钱
165312
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-9-5 00:56:26 | 显示全部楼层
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-9-4
在线时间
7 小时
发表于 2017-9-5 21:03:52 | 显示全部楼层
相位可调就让counter的值改变不就行了吗。。可能是我想的太简单了。。。
回复

使用道具 举报

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-12-23
在线时间
13 小时
 楼主| 发表于 2017-9-5 22:12:01 | 显示全部楼层
zq1741314853 发表于 2017-9-5 21:03
相位可调就让counter的值改变不就行了吗。。可能是我想的太简单了。。。

那个改变的频率,counter=counter+step,按键里面step++,counter就变了,变的是频率
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-9-6 10:53:30 来自手机 | 显示全部楼层
改初始化的step
回复

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-9-4
在线时间
7 小时
发表于 2017-9-6 21:02:36 | 显示全部楼层
563097922 发表于 2017-9-5 22:12
那个改变的频率,counter=counter+step,按键里面step++,counter就变了,变的是频率

比如说一个周期一百个数,counter=counter+50,之后再counter=counter+step,不是把相位移动了180度吗
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2017-9-8 18:44:13 | 显示全部楼层
相位变化不就是让波形滞后呗,延时行不
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 21:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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