![]() |
發布時間: 2021-6-2 19:21
正文摘要:怎么實現題目的第四個功能,前三個已經實現了,有沒有大佬會,再原有的基礎上實現第四個功能或者不用那么全,只是能通過串口發送一個字母然后改變一下頻率也行,實在是不會了 單片機源程序如下: #include< ... |
給你說一個思路,程序你自己寫。通過上位機串口發送一串十六進的數字,單片機串口收到這個數字后,用接收到的數字給單片機的頻率發生定時器賦值,用賦值改變定時器的初值,就可能實現串口調節頻率。 例如串口收到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個動作,可以通過串口發送編碼,接收編碼解碼后控制即可。 |