找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

如何通过单片机串口改变频率?

查看数: 4151 | 评论数: 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 单片机教程网

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