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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

如何通過單片機串口改變頻率?

查看數: 4078 | 評論數: 6 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2021-6-2 19:21

正文摘要:

怎么實現題目的第四個功能,前三個已經實現了,有沒有大佬會,再原有的基礎上實現第四個功能或者不用那么全,只是能通過串口發送一個字母然后改變一下頻率也行,實在是不會了 單片機源程序如下: #include< ...

回復

ID:593706 發表于 2021-6-16 18:01
給你說一個思路,程序你自己寫。通過上位機串口發送一串十六進的數字,單片機串口收到這個數字后,用接收到的數字給單片機的頻率發生定時器賦值,用賦值改變定時器的初值,就可能實現串口調節頻率。
      例如串口收到6,就給定時器的初值減1、串口收到8,就給定時器的初值加1,從而實現頻率的升或降。
ID:157057 發表于 2021-6-16 09:12
不懂得再問
ID:157057 發表于 2021-6-16 09:12
#include <reg52.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define DA_DATA  P1    //DAC0832數據口
#define AMP_DEFAULT      5.0f    //默認幅值  單位:V
#define AMP_MAX          12.0f   //最大幅值為12
#define AMP_MIN          0.0f    //最小幅值
#define T                1000     //計時周期  單位:us
#define CYCLE_DEFAULT    1000    //默認正弦周期   單位:us
#define CYCLE_MAX        20000    //最大周期
#define CYCLE_MIN                 1000
#define PI               3.1415926f

/****************************變量*******************************/
uint Angle = 0;   //角度  0-360
int time = 0;            //計時
int cycle_T = 0;    //正弦周期
float Amp = 0.0f;

//定義DAC0832接口
sbit DA_WR = P2^1;         //寫輸入信號
sbit DA_CS = P2^0;   //片選信號


//定義按鍵接口
sbit key0 = P2^2;  //增大周期
sbit key1 = P2^3;  //減小周期
sbit key2 = P2^4;  //增大幅值
sbit key3 = P2^5;  //減小幅值

//延時
void delayms(int x)
{  uint i,j;
    for(i=x;i>0;i--)
          for(j=110;j>0;j--);
}

/**********************************
外設初始化函數
***********************************/
void da_init()          
{
   DA_WR = 0;
   DA_CS = 0;
   DA_DATA = 0;
   key0 = 1;   //按鍵置高
   key1 = 1;   //按鍵置高
   key2 = 1;   //按鍵置高
   key3 = 1;   //按鍵置高
}
/**********************************
定時器初始化函數
***********************************/
void init()          
{
   TMOD = 0x01;        //設置定時器工作方式,第二位為定時器0
   TH0 = (65536 - T)/256; //定時器0高8位  定時時間1ms
   TL0 = (65536 - T)/256; //定時器0低8位
   TR0 = 1;           //打開定時器
   ET0 = 1;           //開定時器中斷
   EA = 1;     //開總中斷
}

/**********************************
按鍵檢測函數
***********************************/
void key_check()
{
   /*按鍵端口置高*/
   key0 = 1;
   key1 = 1;
   key2 = 1;
   key3 = 1;

   /*增大周期*/
   if(key0 == 0)
   {
                   delayms(5);         //按鍵消抖
                if(key0 == 0)   
                {
                  cycle_T = cycle_T + 2000;   //每次增加2000us
                  /*限幅*/
                  if (cycle_T > CYCLE_MAX)
                  {
                          cycle_T        =  CYCLE_MAX;
                  }
                }
                while(!key0);        //等待按鍵松開
   }
   /*減小周期*/
   if(key1 == 0)
   {
                   delayms(5);         //按鍵消抖
                if(key1 == 0)   
                {
                  cycle_T = cycle_T - 2000;   //每次減小2000us
                  /*限幅*/
                  if (cycle_T < CYCLE_MIN)
                  {
                          cycle_T        =  CYCLE_MIN;
                  }
                }
                while(!key1);        //等待按鍵松開
   }
   /*增大幅值*/
   if(key2 == 0)
   {
                   delayms(5);         //按鍵消抖
                if(key2 == 0)   
                {
                  Amp = Amp + 1.0f;
                  if (Amp >= AMP_MAX)
                           Amp = AMP_MAX;
                }
                while(!key2);        //等待按鍵松開
   }
   /*減小幅值*/
   if(key3 == 0)
   {
                   delayms(5);         //按鍵消抖
                if(key3 == 0)   
                {
                  Amp = Amp - 1.0f;
                  if (Amp <= AMP_MIN)
                           Amp = AMP_MIN;
                }
                while(!key3);        //等待按鍵松開
   }

}

/**********************************
波形發生函數
***********************************/
void wave()
{
        float sinAngle = 0.0f;

        Angle ++;   //角度自加
        if (Angle >= 360)
                Angle = 0;       
        sinAngle = sin(((float)Angle * PI / 180.0f));   //求角度對應的正弦值  返回[-1,1]
        sinAngle = sinAngle * Amp / AMP_MAX;     //按照幅值范圍等比例放大縮小
        DA_DATA         = (int)(((sinAngle + 1.0f) / 2.0f) * 255.0f);
}

void main()
{  
   init(); //定時器初始化
   cycle_T = CYCLE_DEFAULT;  //初始化為默認正弦周期
   Amp = AMP_DEFAULT;       //初始化為默認幅值     
   da_init();    //DA初始化
   while(1)
   {  
     key_check();
   }
}

void T0_time() interrupt 1
{
        TH0 = (65536 - T)/256; //定時器0高8位  定時時間1ms
    TL0 = (65536 - T)/256; //定時器0低8位
        time ++;
        if (time > (cycle_T / T))   //0.1ms
        {
           time = 0;
           wave();          //波形發生函數
        }       
}
ID:81196 發表于 2021-6-16 08:42
直接輸入數值進行轉換不行嗎,不要搞太復雜.
ID:777356 發表于 2021-6-2 22:56
我的程序大概就這樣
#include<reg51.h>
#include<absacc.h>

#define DAC0832 XBYTE[0x8000]
#define zkb 25
unsigned char tamp=0xff,a=0;
unsigned char b = 0;

void UartInit()
{
        SCON =0x50; // SCON: 模式 1, 8-bit UART, 使能接收
        TMOD |= 0x20; // TMOD:timer 1, mode 2, 8-bit 重裝
        TH1 =TL1= 0xFD; // TH1: 重裝值9600 波特率 晶振 11.0592MHz
        TR1 =1; // TR1: timer 1 打開
        EA = 1; //打開總中斷
        ES = 1; //打開串口中斷
        PCON=0;
}

void main()
{

        TMOD=0x01;
        EA=1;
        TR0=1;
        ET0=1;
  TH0 = 0xF7;
        TL0 = 0x00;
        DAC0832=tamp;
        UartInit();
        while(1);
        
}

void js() interrupt 1
{
        if(b == '1')
        {
                TH0 = 0x0f;
                TL0 = 0x00;
        }
        else
        {
                TH0 = 0xF7;
                TL0 = 0x00;
        }
        a++;
        if(a==(zkb*2)/5)
        {
                tamp=~tamp;
                DAC0832=tamp;        
        }
        if(a==40)
        {
                tamp=~tamp;
                DAC0832=tamp;
                a=0;
        }
               
}

void Uart_Receive(void) interrupt 4         
{
//        unsigned char ch,num;
        ES = 0;
        
        if (RI)                                        //如果接收完成則進入
        {
                b = SBUF;
        }
        RI = 0;                            //RI清0,重新接收
        ES = 1;                            //串口1中斷允許                        
}

0.png (98.92 KB, 下載次數: 56)

0.png

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

ID:366877 發表于 2021-6-2 22:14
這就相當于50個動作,可以通過串口發送編碼,接收編碼解碼后控制即可。

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

Powered by 單片機教程網

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