找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教!这个C51单片机信号发生器如何增加幅值调节程序?

[复制链接]
跳转到指定楼层
楼主
本帖最后由 zlkj 于 2016-12-19 15:23 编辑

仿真程序:
    #include<reg52.h>
    #include<absacc.h>
    #define BYTE unsigned char
    #define WORD unsigned int
    #define DA0832 XBYTE[0x7FFF]
   
    static bit flag;    //标志位,被外部中断0改变,以此改变波形
    static bit t_flag;  //定时器标志位
    WORD i,j,N=1;       //循环变量和延时周期的定义
   
    BYTE code desg[]={              //正弦函数表
                          0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,
                          0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
                          0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
                          0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
                          0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,
                          0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
                          0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,
                          0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
                          0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,
                          0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,
                          0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,
                          0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
                          0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,
                          0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,
                          0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
                          0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
                          0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,
                          0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
                          0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,
                          0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,
                          0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
                          0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,
                          0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
                          0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
                          0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
                          0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
                          0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
                          0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,
                          0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,
                          0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
                          0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,
                          0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80
                     };  
    void delay(unsigned int n){         //延时子程序
        for(i = 0; i < n; i++){
            TMOD = 0x00;       //定时器初始化,在此采用方式0
            TH0 = 0xFF;        //定时器时长4个机器周期
            TL0 = 0x1c;        //定时器初值用二进制表示为:
            TR0 = 1;           //1111 1111 0001 1100
            t_flag = 1;
            while(t_flag);
        }
    }
                                   
    void sin(void){                 //正弦波
         flag = 1;
         while(flag){
            for(j = 0; j < 256;j+=2){  //此处为了提高频率,
                DA0832 = desg[j];      //每隔4个取函数表中的一个值
                delay(N);              //即64个值
            }
         }
    }
    void saw(void){                 //锯齿波
        WORD value = 0x00;
        flag = 1;
        while(flag){
            DA0832 = value;
            value++;
            delay(N);
        }
    }
    void square(void){              //方波
        flag = 1;
        while(flag){
            DA0832 = 0xFF;
            delay(100*N);
            DA0832 = 0x00;
            delay(100*N);
        }
    }        
   
    void triple(void){              //三角波
        WORD value = 0x00;
        flag = 1;
        while(flag){
            if(value < 256){
                DA0832 = value;
                value++;
                delay(N);
            }
            else{
                while(--value){
                    DA0832 = value;
                    delay(N);
                }
            }      
        }
    }
    WORD k=0;
   
    void main(void)  
    {
        EA = 1;       //开总中断
        EX0 = 1;      //外部中断0允许
        IT0 = 1;      //INT0边沿触发
        EX1 = 1;      //外部中断1允许
        IT1 = 1;      //INT1边沿触发
        ET0 = 1;      //定时器0中断允许
      
        while(1){
            switch(k){                     //根据k选择输出波形
                case 0:while(k%1);break;
                case 1:square();break;
                case 2:saw();break;
                case 3:triple();break;
                case 4:sin();break;
                default:k=1;
                    }
                }
    }
    void int0() interrupt 0 using 0{   //外部中断0处理
            k++;        //变换波形
            flag=0;     //标志位清零
           return;
      
    }
    void int1() interrupt 2 using 0{  //外部中断1处理
            if(N<3)   //变换周期
                N++;
            else
                N = 1;
            return;
    }
    void timer0() interrupt 1 using 0{    //定时器中断处理
        t_flag = 0;   //
        return;
    }

66d7e8fbh85c31d234155&amp;690.jpg (42.68 KB, 下载次数: 72)

66d7e8fbh85c31d234155&amp;690.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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