欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1951|回復: 0
收起左側

基于51單片機的信號發生器Proteus仿真程序

[復制鏈接]
ID:1049106 發表于 2022-10-25 10:31 | 顯示全部樓層 |閱讀模式
基于51單片機的信號發生器,仿真用的proteus,程序用的是keil,數模轉換重要用的是DAC0832,可實現波形轉換。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

仿真圖

仿真圖
51hei.gif

單片機源程序如下:
#include"key.h"
#include"math.h"
unsigned int  fword = 1000;
unsigned char Duty;
unsigned char gFunctionCount=0;
unsigned char gTimeCount=0;
unsigned char gType=0;
char FreqNum[5]={0,1,0,0,0};
char AmpNum[2]={5,0};
char DutyNum[2]={5,0};

/*延時函數:按鍵消抖用*/
static void delay10ms(void)
{
        unsigned char j,i;
        for(j=0;j<110;j++)
                for(i=0;i<100;i++);
}

/*按鍵掃描函數:主函數主循環只調用此函數,其完成參數設定以及下達功能*/
void key_scan(void)
{
        unsigned int  freqtemp;
        unsigned int  amptemp;
        unsigned char dutytemp;
        if(KEY1==0)                  //功能鍵按下
        {
                delay10ms();
                if(KEY1==0)
                {
                        gFunctionCount++;
                        //功能設定一:設置波形
                        if(gFunctionCount==1)     
                        {
                                gTimeCount=0;
                                EA = 0;
                                LCDDispChar(8,1,'#');
                        }
                        //功能設定二:設置頻率
                        else if(gFunctionCount==2)
                        {
                                 gTimeCount=0;
                                LCDCursor();
                                LCDDispChar(8,1,' ');
                                LCDDispNum(6,2,FreqNum[3]);
                        }
                        //功能設定三:設置方波占空比
                        else if((gFunctionCount==3)&&(gType==1))   //        ((gFunctionCount==4)&&(gType==1))
                        {
                                gTimeCount=0;
                                LCDCursor();
                                LCDDispNum(14,2,DutyNum[1]);
                                LCDDispNum(13,2,DutyNum[0]);
                        }
                        //設定完畢
                        else if((gFunctionCount==4)||((gFunctionCount==3)&&(gType!=1)))                 //         ((gFunctionCount==5)||((gFunctionCount==4)&&(gType!=1)))
                        {
                                gFunctionCount=0;
                                
                                LCDNotCursor();
                                //計算頻率值               
                                freqtemp=(unsigned int )FreqNum[0]*10000+(unsigned int )FreqNum[1]*1000+(unsigned int)FreqNum[2]*100+(unsigned int)FreqNum[3]*10+(unsigned int)FreqNum[4];
                                if(freqtemp>10000)//當輸入頻率大于10kHz時,將頻率設置成10kHz
                                {
                                        freqtemp = 10000;
                                        LCDDispNum(3,2,1);LCDDispNum(4,2,0);LCDDispNum(5,2,0);LCDDispNum(6,2,0);LCDDispNum(7,2,0);
                                        FreqNum[0]=1;FreqNum[1]=0;FreqNum[2]=0;FreqNum[3]=0;FreqNum[4]=0;
                                }
                                else if(freqtemp<1)//當輸入頻率小于1Hz時,將頻率設置成1Hz
                                {
                                        freqtemp = 1;
                                        LCDDispNum(3,2,0);LCDDispNum(4,2,0);LCDDispNum(5,2,0);LCDDispNum(6,2,0);LCDDispNum(7,2,1);
                                        FreqNum[0]=0;FreqNum[1]=0;FreqNum[2]=0;FreqNum[3]=0;FreqNum[4]=1;
                                }
                                //幅值
                            amptemp =50;
                                //計算占空比
                                dutytemp=(unsigned char)DutyNum[0]*10   +(unsigned char)DutyNum[1];
                                if(dutytemp>90)//當輸入占空比大于90%時,將占空比設置成90%
                                {        
                                        dutytemp = 90;
                                        LCDDispNum(13,2,9);LCDDispNum(14,2,0);
                                        DutyNum[0]=9;DutyNum[1]=0;        
                                }
                                else if(dutytemp<10)//當輸入占空比小于10%時,將占空比設置成10%
                                {        
                                        dutytemp = 10;
                                        LCDDispNum(13,2,1);LCDDispNum(14,2,0);
                                        DutyNum[0]=1;DutyNum[1]=0;        
                                }
                                if(gType!=1)//當波形不為方波時,顯示橫杠表示無效
                                {        LCDDispString(13,2,"--");}
                                //設置數據處理完成,以下代碼進行DA輸出設置
                                fword = (unsigned int)(freqtemp*1.009);        //設置頻率控制字
                                AmPort = (unsigned char)(50*5.1);        //設置幅值
                                Duty = dutytemp;        //設置方波占空比
                                EA = 1;        
                        }
                }while(!KEY1);           //循環到松手        
        }
        if(KEY2==0)                  //設定鍵按下
        {
                delay10ms();
                if(KEY2==0)
                {
                        gTimeCount++;
                        /*********************************************************
                        波形設定
                        *********************************************************/
                        if(gFunctionCount==1 && gTimeCount==1)
                        {        LCDDispString(5,1,"Squ");gType=1; }
                        else if(gFunctionCount==1 && gTimeCount==2)
                        {        LCDDispString(5,1,"Tri");gType=2; }
                        else if(gFunctionCount==1 && gTimeCount==3)
                        {        LCDDispString(5,1,"Saw");gType=3;}
                        else if(gFunctionCount==1 && gTimeCount==4)
                        {        gTimeCount=0;LCDDispString(5,1,"Sin");gType=0; }
                        /*********************************************************
                        頻率設定
                        *********************************************************/
                        else if(gFunctionCount==2 && gTimeCount==1)
                        {        LCDDispNum(5,2,FreqNum[2]);        }
                        else if(gFunctionCount==2 && gTimeCount==2)
                        {        LCDDispNum(4,2,FreqNum[1]);        }
                        else if(gFunctionCount==2 && gTimeCount==3)
                        {        LCDDispNum(3,2,FreqNum[0]);        }
                        else if(gFunctionCount==2 && gTimeCount==4)
                        {        LCDDispChar(2,2,' ');        }
                        else if(gFunctionCount==2 && gTimeCount==5)
                        {        gTimeCount=0;LCDDispNum(6,2,FreqNum[3]);        }
                        /*********************************************************
                        方波設定
                        *********************************************************/
                        else if(gFunctionCount==3 && gTimeCount==1)
                        {        LCDDispChar(12,2,':');        }
                        else if(gFunctionCount==3 && gTimeCount==2)
                        {        gTimeCount=0;LCDDispNum(13,2,DutyNum[0]);        }

                }while(!KEY2);           //循環到松手        
        }
        if(KEY3==0)                  //加鍵按下
        {
                delay10ms();
                if(KEY3==0)
                {
                        if(gFunctionCount==2 && gTimeCount==1)
                        {
                                FreqNum[3]++;
                                if(FreqNum[3]==10)
                                        FreqNum[3]=0;
                                LCDDispNum(6,2,FreqNum[3]);LCDDispNum(5,2,FreqNum[2]);        
                        }
                        else if(gFunctionCount==2 && gTimeCount==2)
                        {        
                                FreqNum[2]++;
                                if(FreqNum[2]==10)
                                        FreqNum[2]=0;
                                LCDDispNum(5,2,FreqNum[2]);LCDDispNum(4,2,FreqNum[1]);               
                        }

Keil代碼與Proteus仿真下載: 基于51單片機的信號發生器.7z (52.17 KB, 下載次數: 45)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表