久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1951|回復: 0
收起左側(cè)

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

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

仿真原理圖如下(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};

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

/*按鍵掃描函數(shù):主函數(shù)主循環(huán)只調(diào)用此函數(shù),其完成參數(shù)設定以及下達功能*/
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,"--");}
                                //設置數(shù)據(jù)處理完成,以下代碼進行DA輸出設置
                                fword = (unsigned int)(freqtemp*1.009);        //設置頻率控制字
                                AmPort = (unsigned char)(50*5.1);        //設置幅值
                                Duty = dutytemp;        //設置方波占空比
                                EA = 1;        
                        }
                }while(!KEY1);           //循環(huán)到松手        
        }
        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);           //循環(huán)到松手        
        }
        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單片機的信號發(fā)生器.7z (52.17 KB, 下載次數(shù): 45)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久久 | 午夜精品久久久久久久久久久久久 | 久久国产一区 | 玖玖精品视频 | 日韩精品一区二区三区视频播放 | 亚洲成人精选 | 国产一区精品在线 | 国产成人精品一区二区三区四区 | 国产久 | 日韩午夜影院 | 久久成人一区二区三区 | 国产一级片久久久 | www国产亚洲精品 | 欧美亚洲国产一区 | 欧美一区二区三区精品免费 | 亚洲精品一区二区三区蜜桃久 | 日韩高清av | 中文字幕日韩一区 | 最新av片| 亚洲精品国产电影 | 国产精品久久久久久久久久不蜜臀 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 国产精品精品视频一区二区三区 | 国产精品污www一区二区三区 | 国产精品久久精品 | 天天干天天爽 | 国产高清视频一区 | 久久99精品久久久久子伦 | 国产一区二区三区亚洲 | 涩涩视频网站在线观看 | 亚洲国产精品一区 | 黄频免费 | 国产精品毛片无码 | 精品96久久久久久中文字幕无 | 四虎成人av| 日韩最新网站 | 久久乐国产精品 | 国产精品久久久久久一级毛片 | 91精品久久久久久久久久入口 | 中文字幕一区在线观看视频 | 欧美国产91 |