给你说一个思路,程序你自己写。通过上位机串口发送一串十六进的数字,单片机串口收到这个数字后,用接收到的数字给单片机的频率发生定时器赋值,用赋值改变定时器的初值,就可能实现串口调节频率。 例如串口收到6,就给定时器的初值减1、串口收到8,就给定时器的初值加1,从而实现频率的升或降。 |
不懂得再问
![]() |
#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(); //波形发生函数 } } |
直接输入数值进行转换不行吗,不要搞太复杂. |
我的程序大概就这样 #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)
这就相当于50个动作,可以通过串口发送编码,接收编码解码后控制即可。 |