❶ 用89S51單片機設計低頻函數信號發生器,能產生方波、正弦波、三角波等信號波形的電路原理圖和c語言程序
給你發一個參考電路圖
❷ stc15f2k60s2單片機如何用c語言將一個模擬信號轉換成數字信號
你可以查詢51單片機的AD信號採集程序,也就是說,你是使用ADC晶元採集到的信號送到單片機里提取的。
❸ hd74ls164的輸入和輸出信號是如何轉換的即如何用c語言編程實現
是串並轉換吧。下面是送i串列信號里的一個信號的操作:
先置clear 為1
置CLK為0
再送A B 信號(一般會有一個固定為1)
再讓CLK置1,產生低-高的跳變,然後置回0,准備輸入下一個信號
上面每一個名字都對應了一個管腳
❹ 單片機C語言版信號發生器
單片機信號發生器,一般是通過控制單片機的IO的高低電平來實現的,具體為
1,可以通過先配置一個管腳為輸出,然後給這個管腳寫0,輸出就為低電平,然後寫1,這個管腳就輸出為高電平。如果你的單片機是3.3v供電的話,那麼高電平一般為3.3V,低電平一般為0v。
2,如果要產生一個方波的話,需要先輸出1,然後延遲一段時間,然後再輸出0,然後再延遲一段時間,然後輸出1.... 要如此反復的話,可以用while(1), 然後在while(1)裡面寫入你的置高,延遲,置低的代碼,具體偽代碼可以為
配置對應輸出管腳為輸出; //因為管腳可以配置為輸出和輸入,所以需要先配置為輸出
while(1)
{
對對應輸出管腳置高;
sleep(半個周期的時間);
對對應輸出管腳置低;
sleep(半個周期的時間);
}
3, 如果你牽涉到高級應用的話,比如要輸出一個正弦波,那麼需要外加信號產生晶元,比如DDS晶元。
4,如果還需要更加復雜的信號,任意波形的,可以用一個片內DA按照你的意思輸出對應的電平,或者片外DA來輸出。
❺ 單片機C語言版正弦波信號發生器怎麼做
#include<at89x51.h>
//unsigned char TIME0_H=0xec,TIME0_L=0x78; //定時器0的初值設置;全局變數
#include<sinx.h>
#include<0832.h>
void main()
{
TMOD=0X01;
TH0=0xff;
TL0=0xd9;
IT0=1; //設置中斷觸發方式,下降沿
EA=1;
EX0=1;
ET0=1;
IP=0X01; //鍵盤中斷級別高
TR0=1;
while(1)
{
// square();
;
}
}
#ifndef __0832_h__
#define __0832_h__
//#define INPUT XBYTE[0xbfff] //即cs 與xfer 輪流低電平。
//#define DACR XBYTE[0x7fff] //單通道輸出,單緩沖就行了。
unsigned char i,sqar_num=128; //最大值100,默認值50
unsigned char cho=0; //0:正弦波。1:方波。2:三角波。3:鋸齒波。
unsigned char num=0;
unsigned char TIME0_H=0xff,TIME0_L=0xd9; //定時器0的初值設置;全局變數.對應正弦波,鋸齒波50HZ
sbit chg= P1^0; //三角波100Hz.
sbit freq_u=P1^1;
sbit freq_d=P1^2;
sbit ty_u=P1^3;
sbit ty_d=P1^4;
sbit cs =P3^7;
bit flag=0;
unsigned int FREQ=50;//初始化頻率,50HZ
//調節部分——頻率
void freq_ud(void)
{
unsigned int temp;
if(freq_d==0)
{ FREQ--; }
else if(freq_u==0)
{ FREQ++; }
if(cho==1|cho==3) //鋸齒波256次中斷一周期,特殊處理下。否則他的頻率是100(+\-)n*2Hz.
{
temp=0xffff-3906/FREQ; //方波,三角波默認為100hz,切換後頻率也為50HZ 65336-10^6/(256*FREQ)
TIME0_H=temp/256;
TIME0_L=temp%256;
}
else if(cho==0|cho==3){ //正弦波 三角波默認周期50hz 65536-10^6//(512*FREQ)
temp=0xffff-1953/FREQ;
TIME0_H=temp/256;
TIME0_L=temp%256;
}
}
//調節部分——方波的占空比
void ty_ud(void) //方波也採用512次中斷構成一個周期。
{
if(ty_d==0&sqar_num>0)
sqar_num--;
else if(ty_u==0&sqar_num<255)
sqar_num++;
}
//波形發生函數
void sint(void)
{
if(!flag)
{
cs=0;P2=sin_num[num++];cs=1;
if(num==0){num=255;flag=1;}
}
else if(flag)
{
cs=0;P2=sin_num[num--];cs=1;
if(num==255){num=0;flag=0;}
}
}
void square(void)
{
if(i++<sqar_num) {cs=0;P2=0XFF;cs=1;}
else{cs=0;P2=0X00;cs=1;}
}
void triangle(void)
{
cs=0;P2=num++;cs=1;
}
void stw(void)
{
if(~flag)
{
cs=0;P2=num++;cs=1;
if(num==0){num=255;flag=1;}
}
else if(flag)
{
cs=0;P2=num--;cs=1;
if(num==255){num=1;flag=0;}
}
}
//按鍵中斷處理程序。
void it0() interrupt 0
{
if(chg==0) { if(++cho==4) {cho=0;num=0;} } //num=0;所有數據從新開始,保證波形的完整性
else if(freq_u==0|freq_d==0)
{freq_ud();}
else if (cho==1&(ty_d==0|ty_u==0))
{ty_ud();}
else ;
}
//定時器中斷處理程序。
void intt0() interrupt 1
{
//TH0=0x00;TL0=0x00;sinx();
switch(cho)
{
case 0:{TH0=TIME0_H;TL0=TIME0_L;sint() ;break;} //正弦波//每半周期256取樣。
case 1:{TH0=TIME0_H;TL0=TIME0_L;square(); break;} //方波 //為了提高方波的最高頻率,只有犧牲占空比的最小可調值。分100份 每次1%。
case 2:{TH0=TIME0_H;TL0=TIME0_L;triangle();break;} //三角波
case 3:{TH0=TIME0_H;TL0=TIME0_L;stw(); break;} //鋸齒波
default: ;
}
}
#endif
//正弦表;每半個周期256個取值,最大限度保證波形不失真。
//各個值通過MATLAB算出,並四設五如取整。具體程序如下
#ifndef __sinx_h__
#define __sinx_h__
unsigned char code sin_num[]={
0,0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2,
2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,
10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21,
22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37,
38, 39, 40, 41, 42, 44, 45, 46, 47, 49, 50, 51, 52, 54, 55, 56,
57, 59, 60, 61, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78,
80, 81, 83, 84, 86, 87, 89, 90, 92, 93, 95, 96, 98, 99, 101,102,
104, 106, 107, 109, 110, 112, 113, 115, 116, 118, 120, 121, 123, 124, 126, 128,
129, 131, 132, 134, 135, 137, 139, 140, 142, 143, 145, 146, 148, 149, 151, 153,
154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 169, 171, 172, 174, 175, 177,
178, 180, 181, 182, 184, 185, 187, 188, 189, 191, 192, 194, 195, 196, 198, 199,
200, 201, 203, 204, 205, 206, 208, 209, 210, 211, 213, 214, 215, 216, 217, 218,
219, 220, 221, 223, 224, 225, 226, 227, 228, 229, 230, 230, 231, 232, 233, 234,
235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 243, 243, 244, 245, 245, 246,
246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253,
253, 253, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255
};
#endif
//MATLAB程序:
//x=linspace(-pi/2,pi/2,255);%如果過採用1位採用,很多值是重的。雖然實際中並不會。
//y=(sin(x)+1)/2.0*255;
//%uint32(y)%強制類型轉換。
//%fprintf('%.f\n',uint32(y));%控制輸出類型
//round(y)%四捨五入函數
❻ 我要用C語言實現A/D轉換(即把感測器測到的土壤模擬信號轉化為數字信號),請高手幫忙編寫一下程序段
A/D轉換是由硬體晶元完成的。
程序的作用是控制A/D轉換晶元,讀取A/D轉換晶元輸出的結果。然後將A/D轉換晶元直接輸出的值換算為你需要的結果。
❼ 簡易函數信號發生器C語言編寫
我沒做過正弦波和三角波,我認為正弦波做的話用帶DA功能的單片機,但是你沒說正弦波的頻率和賦值,三角波也可以用DA做,方波就很簡單了用拉高活拉低口線就可以了。你直接用單片機做,不用外圍電路嗎??
❽ 求高手把這些匯編語言轉成c語言,51單片機數字信號發生器-串列通訊軟體設計
幫助你改變
#包括
無符號字元型噸= 0;
SBIT P3_7 = P3 ^ 7;
無效的主要()
{
TMOD = 0X01 ;/ /設置T0定時1
TH0 =值0x3c ;/ /設置初始值的計時器100ms的
TL0 = 0XB0; /> EA = 1 ;/ / CPU開中斷
ET0 = 1 ;/ /定時器0中斷使能
P3 = 0X00 ;/ /設置正常狀態P3口
P1 = 0X00 ;/ / VD1VD6發紅外光
{(1)
(P3! = 0X00)/ /顯示器,如果有人闖入
{
TR0 = 1 ;/ /啟動T0定時
}
}
}
無效定時器0()中斷1 / /定時器0中斷子程序
{
TH0 =值0x3c ;/ /重新設置初始值
TL0 = 0XB0;
+ +;
(== 10)/ / 1S,1S尚未返回
{
T = 0 ;/ /重置計數器的初始值
P3_7 =! P3_7 ;/ / P3.7埠否定}
}
❾ 用c語言寫的信號發生器程序
個值做下處理,這樣就可以生成隨機數了。
延時函數可試下sleep函數
另外,團IDC網上有許多產品團購,便宜有口碑
❿ 急!!用ADC0809做A/D轉換器,編制C程序,將正弦信號轉換成數字信號輸送給單片機,出來電信號,是led燈亮
#include<reg52.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
//AD埠定義
sbit CLK=P3^4;
sbit start=P3^0;
sbit oe=P3^1;
sbit eoc=P3^2;
#define uchar unsigned char
#define uint unsigned int
/*********初始化***********/
void sysinit()
{
TMOD = 0x20; //設定定時器T1工作方式 T0 工作方式1
TH1=0xfe; //利用T1中斷產生CLK信號
TL1=0xfe;//
EA = 1; //開總中斷
ET1=1;
TR1=1; //啟動定時器T1
start=0; // START: A/D轉換啟動信號,輸入,高電平有效。
oe=0; //數據輸出允許信號,輸入,高電平有效。當A/D轉換結束時,此端輸入一個高電平,才能打開輸出三態門,輸出數字量。
}
void t1(void) interrupt 3
{
ET1=0;
CLK=~CLK;
ET1=1;
}
//adc0800數據採集
unsigned char adc()
{
unsigned char Temp;
start=1;
start=0; //啟動信號
while (!eoc);// A/D轉換結束信號
P1=0xff;
oe=1;
Temp=P1;//讀取採集數據
oe=0;
return(Temp);//返回採集數據
}
void main()
{
uchar a;
sysinit();
while(1)
{
a=adc();//AD轉換,轉換後將數據存入變數a中
}
}