找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2856|回复: 6
收起左侧

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

[复制链接]
回帖奖励 30 黑币 回复本帖可获得 30 黑币奖励! 每人限 1 次
ID:928334 发表于 2021-6-2 19:21 | 显示全部楼层 |阅读模式
F5G~B9@PC35%P6]CF7EKGG4.png V@0Q60]KP]I)B100D5NGHZH.png
怎么实现题目的第四个功能,前三个已经实现了,有没有大佬会,再原有的基础上实现第四个功能或者不用那么全,只是能通过串口发送一个字母然后改变一下频率也行,实在是不会了

单片机源程序如下:
  1. #include<reg51.h>      
  2. #include<intrins.h>
  3. #define uchar unsigned char   
  4. #define uint unsigned int

  5. sbit s1=P1^0;         
  6. sbit s2=P1^1;
  7. sbit s3=P1^2;


  8.                                                                            
  9. sbit lcdrs=P1^6;      
  10. sbit lcden=P1^7;


  11. char num,boxing,u;      
  12. int pinlv=50,bujin=10,bujin1=10;
  13. uchar geshu=1;
  14. uchar code table[]="0123456789";
  15. uchar code table1[]="pinlv:boxing:";
  16. unsigned long int m;
  17. int n=0;
  18. float hc=0;
  19. int a,b,h,num1;
  20. uchar code sin[64]={
  21. 135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
  22. 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
  23. };                                          //ÕyÏò2¨è¡Âë


  24. void delay(uint xms)
  25. {
  26.         int a,b;
  27.         for(a=xms;a>0;a--)
  28.                 for(b=110;b>0;b--);
  29. }
  30. void write_com(uchar com)
  31. {
  32.         lcdrs=0;
  33.         P0=com;        
  34.         delay(1);
  35.         lcden=1;
  36.         delay(1);                                                                           
  37.         lcden=0;
  38. }

  39. void write_date(uchar date)
  40. {
  41.         lcdrs=1;
  42.         P0=date;
  43.         delay(1);
  44.         lcden=1;
  45.         delay(1);
  46.         lcden=0;
  47. }

  48. void init_lcd()
  49. {                                                                  
  50.         lcden=0;¼  
  51.         write_com(0x0f);
  52.         write_com(0x38);
  53.         write_com(0x01);
  54.         write_com(0x0c);
  55.         write_com(0x06);
  56.         write_com(0x80);
  57. }
  58. void initclock()   
  59. {
  60.         uint i;
  61.         TMOD=0x01;
  62.         TH0=a;
  63.         TL0=b;
  64.         EA=1;
  65.         ET0=1;
  66.         TR0=1;
  67.         for(i=6;i<13;i++)     
  68.         {
  69.                 write_date(table1[i]);
  70.                 delay(2);
  71.         }
  72.         write_com(0x80+0x40);
  73.         for(i=0;i<6;i++)
  74.         {
  75.                 write_date(table1[i]);
  76.                 delay(2);
  77.         }
  78.         write_com(0x80+7);
  79.                 write_date('s');
  80.                 write_date('i');
  81.                 write_date('n');
  82.                 write_date(' ');
  83.                 write_date(' ');
  84.                 write_date(' ');
  85.                 write_date(' ');
  86.                 write_com(0x80+0x40+0xa);
  87.                 write_date(' ');
  88.                 write_date('1');
  89.                 write_date('0');
  90.                 write_date('H');
  91.                 delay(2);
  92.                 write_date('Z');
  93.                 delay(2);
  94. }
  95. void display()      
  96. {
  97.         uchar wan,qian,bai,shi,ge;
  98.         uint a=0;
  99.         a=pinlv;
  100.         wan=a/10000;
  101.         qian=a/1000%10;
  102.         bai=a/100%10;
  103.         shi=a%100/10;
  104.         ge=a%100%10;
  105.         write_com(0x80+0x40+8);
  106.         write_date(table[wan]);
  107.         delay(2);
  108.         write_date(table[qian]);
  109.         delay(2);
  110.         write_date(table[bai]);
  111.         delay(2);
  112.         
  113.         write_date(table[shi]);
  114.         delay(2);
  115.         write_date(table[ge]);
  116.         delay(2);
  117.         write_date('H');
  118.         delay(2);
  119.         write_date('Z');
  120.         delay(2);
  121.         if(boxing==0)
  122.         {
  123.                 write_com(0x80+7);
  124.                 write_date('s');
  125.                 write_date('i');
  126.                 write_date('n');
  127.                 write_date(' ');
  128.                 write_date(' ');
  129.                 write_date(' ');
  130.                 write_date(' ');
  131.         }


  132. }
  133. uchar keyscan()
  134. {
  135. //        if(P1&0x0F==0x0F) return 0;
  136.         if(s1==0)
  137.         {         
  138.                 EA=0;
  139.                 delay(1);
  140.                 if(s1==0)
  141.                 {
  142.                         while(!s1);
  143.                         pinlv+=bujin;
  144.                         if(pinlv>30000)
  145.                         {
  146.                                 pinlv=30000;
  147.                         }
  148.                         geshu=pinlv/120+1;
  149.                         if(pinlv>960)
  150.                         {
  151.                                 geshu=8;
  152.                                 bujin=100;
  153.                                 bujin1=100;
  154.                         }
  155.                         if(pinlv>1080) geshu=10;
  156.                         if(pinlv>2000) geshu=11;

  157.                         hc=15625/pinlv;
  158.                         m=hc*geshu;
  159.                         m-=54;
  160.                         m/=15;
  161.                         
  162.                         EA=1;
  163.                         display();
  164.                         
  165.                 }
  166.         }
  167.         if(s2==0)
  168.         {         
  169.                
  170.                 delay(1);
  171.                 if(s2==0)
  172.                 {
  173.                         EA=0;        
  174.                         while(!s2);
  175.                         pinlv-=bujin;
  176.                         if(pinlv<0)
  177.                         {
  178.                                 pinlv=0;
  179.                         }
  180.                         geshu=pinlv/120+1;
  181.                         if(pinlv>960)
  182.                         {
  183.                                 geshu=8;
  184.                                 bujin=100;
  185.                                 bujin1=100;
  186.                         }
  187.                         if(pinlv>1080) geshu=10;
  188.                         if(pinlv>2000) geshu=11;
  189.                         if(pinlv<=3100)
  190.                                 {hc=15625/pinlv;
  191.                                 m=hc*geshu;
  192.                                 m-=54;
  193.                                 m/=15;}        
  194.                         else
  195.                         {
  196.                                 m=65276+(pinlv-480);
  197.                         }
  198.                         display();        
  199.                         EA=1;
  200.                 }
  201.         }
  202.         if(s3==0)
  203.         {         
  204.                 delay(1);
  205.                 if(s3==0)
  206.                 {
  207.                         EA=0;
  208.                         while(!s3);
  209.                         if(pinlv!=10)
  210.                         {
  211.                            pinlv=10;
  212.                      hc=15625/pinlv;
  213.                            m=hc*geshu;
  214.                                  m-=54;
  215.                            m/=15;
  216.                         }
  217.                         else if(pinlv==10)
  218.                         {
  219.                            pinlv=100;
  220.                                  hc=15625/pinlv;
  221.                            m=hc*geshu;
  222.                                  m-=54;
  223.                            m/=15;
  224.                                 }
  225.                         
  226.                         display();
  227.                         EA=1;

  228.                 }
  229.         }
  230.         return 1;        
  231. }

  232. void main()
  233. {        
  234.         
  235.         init_lcd();
  236.         hc=15625/pinlv;
  237.         m=hc*geshu;
  238.         m-=54;
  239.         m/=15;

  240.         initclock();
  241.         display();
  242. //        csda=0;
  243. //        wr=0;
  244.         while(1)
  245.         {
  246.                  
  247.                  switch(boxing)
  248.                  {
  249.                          case 0:        P2=sin[u];
  250.                                 break;

  251.                  }
  252.                 u+=geshu;
  253.                 n=m;
  254.                 if(u>=64)
  255.                 {
  256.                         u=0;
  257.                 }
  258.                 while(n-->0);
  259.         }
  260. }
  261. void T0_time()interrupt 1   
  262. {
  263.         

  264. //                TH0=a;
  265. //                TL0=b;
  266.                 TH0=0;
  267.                 TL0=0;
  268.                 if(h==0)
  269.                  {
  270.                           keyscan();
  271.                  }
  272. }
复制代码
回复

使用道具 举报

ID:366877 发表于 2021-6-2 22:14 | 显示全部楼层
这就相当于50个动作,可以通过串口发送编码,接收编码解码后控制即可。
回复

使用道具 举报

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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:81196 发表于 2021-6-16 08:42 | 显示全部楼层
直接输入数值进行转换不行吗,不要搞太复杂.
回复

使用道具 举报

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:157057 发表于 2021-6-16 09:12 | 显示全部楼层
不懂得再问 1.jpg
回复

使用道具 举报

ID:593706 发表于 2021-6-16 18:01 | 显示全部楼层
给你说一个思路,程序你自己写。通过上位机串口发送一串十六进的数字,单片机串口收到这个数字后,用接收到的数字给单片机的频率发生定时器赋值,用赋值改变定时器的初值,就可能实现串口调节频率。
      例如串口收到6,就给定时器的初值减1、串口收到8,就给定时器的初值加1,从而实现频率的升或降。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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