熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2021-6-2 19:21
正文摘要:怎么實(shí)現(xiàn)題目的第四個(gè)功能,前三個(gè)已經(jīng)實(shí)現(xiàn)了,有沒有大佬會(huì),再原有的基礎(chǔ)上實(shí)現(xiàn)第四個(gè)功能或者不用那么全,只是能通過串口發(fā)送一個(gè)字母然后改變一下頻率也行,實(shí)在是不會(huì)了 單片機(jī)源程序如下: #include< ... |
給你說一個(gè)思路,程序你自己寫。通過上位機(jī)串口發(fā)送一串十六進(jìn)的數(shù)字,單片機(jī)串口收到這個(gè)數(shù)字后,用接收到的數(shù)字給單片機(jī)的頻率發(fā)生定時(shí)器賦值,用賦值改變定時(shí)器的初值,就可能實(shí)現(xiàn)串口調(diào)節(jié)頻率。 例如串口收到6,就給定時(shí)器的初值減1、串口收到8,就給定時(shí)器的初值加1,從而實(shí)現(xiàn)頻率的升或降。 |
不懂得再問
![]() |
#include <reg52.h> #include <math.h> #define uchar unsigned char #define uint unsigned int #define DA_DATA P1 //DAC0832數(shù)據(jù)口 #define AMP_DEFAULT 5.0f //默認(rèn)幅值 單位:V #define AMP_MAX 12.0f //最大幅值為12 #define AMP_MIN 0.0f //最小幅值 #define T 1000 //計(jì)時(shí)周期 單位:us #define CYCLE_DEFAULT 1000 //默認(rèn)正弦周期 單位:us #define CYCLE_MAX 20000 //最大周期 #define CYCLE_MIN 1000 #define PI 3.1415926f /****************************變量*******************************/ uint Angle = 0; //角度 0-360 int time = 0; //計(jì)時(shí) int cycle_T = 0; //正弦周期 float Amp = 0.0f; //定義DAC0832接口 sbit DA_WR = P2^1; //寫輸入信號(hào) sbit DA_CS = P2^0; //片選信號(hào) //定義按鍵接口 sbit key0 = P2^2; //增大周期 sbit key1 = P2^3; //減小周期 sbit key2 = P2^4; //增大幅值 sbit key3 = P2^5; //減小幅值 //延時(shí) void delayms(int x) { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } /********************************** 外設(shè)初始化函數(shù) ***********************************/ void da_init() { DA_WR = 0; DA_CS = 0; DA_DATA = 0; key0 = 1; //按鍵置高 key1 = 1; //按鍵置高 key2 = 1; //按鍵置高 key3 = 1; //按鍵置高 } /********************************** 定時(shí)器初始化函數(shù) ***********************************/ void init() { TMOD = 0x01; //設(shè)置定時(shí)器工作方式,第二位為定時(shí)器0 TH0 = (65536 - T)/256; //定時(shí)器0高8位 定時(shí)時(shí)間1ms TL0 = (65536 - T)/256; //定時(shí)器0低8位 TR0 = 1; //打開定時(shí)器 ET0 = 1; //開定時(shí)器中斷 EA = 1; //開總中斷 } /********************************** 按鍵檢測函數(shù) ***********************************/ 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); //等待按鍵松開 } } /********************************** 波形發(fā)生函數(shù) ***********************************/ void wave() { float sinAngle = 0.0f; Angle ++; //角度自加 if (Angle >= 360) Angle = 0; sinAngle = sin(((float)Angle * PI / 180.0f)); //求角度對(duì)應(yīng)的正弦值 返回[-1,1] sinAngle = sinAngle * Amp / AMP_MAX; //按照幅值范圍等比例放大縮小 DA_DATA = (int)(((sinAngle + 1.0f) / 2.0f) * 255.0f); } void main() { init(); //定時(shí)器初始化 cycle_T = CYCLE_DEFAULT; //初始化為默認(rèn)正弦周期 Amp = AMP_DEFAULT; //初始化為默認(rèn)幅值 da_init(); //DA初始化 while(1) { key_check(); } } void T0_time() interrupt 1 { TH0 = (65536 - T)/256; //定時(shí)器0高8位 定時(shí)時(shí)間1ms TL0 = (65536 - T)/256; //定時(shí)器0低8位 time ++; if (time > (cycle_T / T)) //0.1ms { time = 0; wave(); //波形發(fā)生函數(shù) } } |
直接輸入數(shù)值進(jìn)行轉(zhuǎn)換不行嗎,不要搞太復(fù)雜. |
我的程序大概就這樣 #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) //如果接收完成則進(jìn)入 { b = SBUF; } RI = 0; //RI清0,重新接收 ES = 1; //串口1中斷允許 } |
0.png (98.92 KB, 下載次數(shù): 56)
參與人數(shù) 1 | 黑幣 +50 | 收起 理由 |
---|---|---|
![]() | + 50 | 回帖助人的獎(jiǎng)勵(lì)! |
這就相當(dāng)于50個(gè)動(dòng)作,可以通過串口發(fā)送編碼,接收編碼解碼后控制即可。 |
Powered by 單片機(jī)教程網(wǎng)