找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2475|回复: 1
打印 上一主题 下一主题
收起左侧

求助,用51单片机输出两路正弦波的程序

[复制链接]
跳转到指定楼层
楼主
ID:117370 发表于 2016-4-28 19:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        #include <reg52.h>  
sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4;  
unsigned char code sin[]={0x8B,0x98,0xA4,0xB0,0xBB,0xC6,0xD0,0xD9,0xE2,0xE9,0xEF,0xF5,0xF9,0xFC,0xFE
,0xFE,0xFE,0xFC,0xF9,0xF5,0xEF,0xE9,0xE2,0xD9,0xD0,0xC6,0xBB,0xB0,0xA4,0x98,0x8B
,0x7F,0x73,0x66,0x5A,0x4E,0x43,0x38,0x2E,0x25,0x1C,0x15,0x0F,0x09,0x05,0x02,0x00
,0x00,0x00,0x02,0x05,0x09,0x0F,0x15,0x1C,0x25,0x2E,0x38,0x43,0x4E,0x5A,0x66,0x73
, 0x7F};
unsigned char i = 0;   //动态扫描的索引
unsigned int cnt = 0;  //记录 T0 中断次数 同时50HZ正弦波输出点
   unsigned long t=0;  
void main()
{  
   unsigned long sec = 0;  //记录50HZ输出点数  
   unsigned long sec2=0;
   float E0; //正弦波幅值
  //1HZ正弦波输出点
    EA = 1;       //使能总中断   
        ENLED = 0;    //使能 U3,选择控制数码管   
         ADDR3 = 1;    //因为需要动态改变 ADDR0-2 的值,所以不需要再初始化了     
         TMOD = 0x01;  //设置 T0 为模式 1     
      // void         conminucation()
             TH0  = 0xFE;  //为 T0 赋初值 FEE0,定时 0.2ms     
         TL0  = 0xE0;     
         ET0  = 1;     //使能 T0 中断   
          TR0  = 1;     //启动 T0   
            while (1)   
                 {      
                   if (cnt >= 1)  //判断 T0 溢出是否达到 1 次      
                     {        //幅值最大为5V
                          
                       
                                    cnt = 0;       //第一路
                        P2 = sin[sec] ;           
                                        sec++;         //秒计数自加 1            
                       if(sec>62)                                 
                                sec=0;
                                                    
                         }
                        if(t>=50)          //第二路
                               {       
                            
                                  t=0;
                                  
                          P3 = sin[sec2];
                                       sec2++;
                                   if (sec2>62)
                                       sec2=0;
                                   }
                                  
                                           
                                                         }   
                                                          }
                                                          
/* 定时器 0 中断服务函数 */
  void InterruptTimer0() interrupt 1
   {          TH0  = 0xFE;  //为 T0 赋初值 FEE0,定时 0.2ms     
         TL0  = 0xE0;                                                                                           
     cnt++;        //中断次数计数值加 1   
             t++;  

                              }
         
   程序在上面  可是那个1HZ的正弦波峰峰值 离5V差的很远。而且波形很差。每个点都会有一定的下降。这是为什么啊

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:117370 发表于 2016-4-28 19:37 | 只看该作者
就是那个第二路的波形。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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