问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

基于单片机和DAC0832做的低频信号发生器

发布网友 发布时间:2022-05-24 07:15

我来回答

4个回答

热心网友 时间:2023-08-25 14:08

做综合设计的吗?
给你个程序自己看看

#include"at89x51.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/************************* 全局变量定义部分 **************************/
//硬件设计接口不同,要修改下一行
uchar code acLEDCS[]={0x7f,0xbf,0xdf,0xef};
uchar code acLedSegCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e};/* 段码 */
uchar acLED[4]; /* 显示缓冲区 */
char cScanIndex; /* 位选指针0~3 */
uchar cKey;
sbit cKey1=P2^2;
sbit cKey2=P2^1;
sbit cKey3=P2^0;
uchar cKeyCode;
uchar cLongDelay;
uchar Out[32];
bit bStill; /* 是否松键标志 */
uint nDelayKey=0; /* 键盘延时变量,为定时中断间隔时间的整数倍 */
uchar cMode=0;
uchar Num;
uchar cF=100;
uchar code tosin[32]={
0x80,0x99,0xb1,0xc7,0xda,0xea,0xf6,0xfd,
0xff,0xfd,0xf5,0xe9,0xd8,0xc5,0xae,0x96,
0x80,0x66,0x4e,0x38,0x25,0x15,0x09,0x02,
0x00,0x02,0x0a,0x16,0x27,0x3a,0x51,0x69
};
union UniT
{
uint m_nT;
uchar m_ucT[2];
}idata uT;
/*************************** 函数声明部分 ***************************/
void Display1(void);
void Display2(void);
void Scankey(void);
void DisposeKEY(void);

/******************** 按键处理程序 ******************/

void DisposeKEY(void)
{
if (cKey1==0) { if(cF<134)cF++;else cF = 1;nDelayKey = 2000;}
else if (cKey2==0){if(cF>1)cF--;else cF = 135;nDelayKey = 2000;}
else if (cKey3==0){if(bStill==0) { cMode++;cMode &= 3; bStill = 1;}}
//switch(cKey)
//{
//case 0x30: /* 例如:KeyADD */
// if(cF<134)cF++;
// else cF = 1;
// nDelayKey = 2000; /* 按住键不动,可连续产生键值,相当于连续按键 */
// break;
// case 0x28: /* 例如:KeySUB */
// if(cF>1)cF--;
// else cF = 135;
// nDelayKey = 2000;
// break;
// case 0x18:
// if(bStill==0)
// {
// cMode++; /* 假设有4种显示状态 */
// cMode &= 3;
// bStill = 1; /* 如果没松键就不会再改变显示方式 */
// }
// break;
// default:break;
// }

Display2();
cKey = 0;
}
void Display2(void)
{
uchar i;
acLED[0]=acLedSegCode[cMode+10]; /* LED显示第1位 */
acLED[1]=acLedSegCode[cF/100]; /* LED显示第2位 */
acLED[2]=acLedSegCode[cF/10%10]; /* LED显示第3位 */
acLED[3]=acLedSegCode[cF%10]; /* LED显示第4位 */
uT.m_nT=38-5760/cF;

switch(cMode)
{
case 0:
for(i=0;i<16;i++)Out[i] = 255; //方波
for(i=16;i<32;i++)Out[i] = 0;
break;
case 1:
for(i=0;i<32;i++)Out[i] = tosin[i]; //正弦波
break;
case 2:
for(i=0;i<16;i++)Out[i] = i << 4; //三角波
for(i=16;i<32;i++)Out[i] = 255-i<<4;
break;
case 3:
for(i=0;i<32;i++)Out[i] = i<<3; //锯齿波
break;
}
}
/************************** 主函数 *****************************/
void main(void)
{
P3_7=0;
/**************** 定时器初始化 *******************/
TMOD= 0x12; /* 定义定时器0工作于方式2(8位自动重装),定时器1工作于方式1(16位定时器) */
uT.m_nT=18-2880/cF;
TH1 =uT.m_ucT[0];
TL1 =uT.m_ucT[1];
TR1 = 1;
ET1 = 1;
IP = 0x04; /* T1中断优先 */

TH0 = -200; /* 8位自动重装定时器约每100uS中断1次,9216次为1秒 */
TL0 = -200;
TR0 = 1;
ET0 = 1;

EA = 1; /* 开总中断 */

while(1)
{
if(cKey)
{
DisposeKEY(); /* 响应按键操作 */
}
}
}
/****************** 多任务时序控制时钟中断 *********************/
void IntT0(void) interrupt 1 /* 定时器0中断,完成1秒定时和LED延时 */
{
P0 = 0; /* 先清显示再换位选 */
P2 = acLEDCS[cScanIndex]; /* 送位选数据 */
P0 = acLED[cScanIndex++]; /* 送显示数据,位选指针移位 */
cScanIndex &= 3; /* 位选指针回位 */

/************************* 扫描按键程序 ******************/
if(nDelayKey==0)
{
cKey = P2 & 0x0e; // 取键值P2.3、P2.2、P2.1
if(cKey != 0x0e)nDelayKey=100;// 设置延迟时间削颤
else
{
bStill = 0;
} // 松键
}
else // 有按键利用DelayKey按键消颤
{
nDelayKey--;
if(nDelayKey==0)
{
cKeyCode = P2 &0x0e;
if(cKey != cKeyCode)
{
cKeyCode = 0;
}
}
}

}
/****************** 可控制定时时间间隔的时钟中断 *********************/
void IntT1(void) interrupt 3 /* 定时器1中断,记录T1计时溢出次数 */
{
TL1 =uT.m_ucT[1];
TH1 =uT.m_ucT[0];
P1 = Out[Num++];
Num &= 31;
}

热心网友 时间:2023-08-25 14:08

做综合设计的吗?
给你个程序自己看看
#include"at89x51.h"
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
ulong
unsigned
long
/*************************
全局变量定义部分
**************************/
//硬件设计接口不同,要修改下一行
uchar
code
acLEDCS[]={0x7f,0xbf,0xdf,0xef};
uchar
code
acLedSegCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e};/*
段码
*/
uchar
acLED[4];
/*
显示缓冲区
*/
char
cScanIndex;
/*
位选指针0~3
*/
uchar
cKey;
sbit
cKey1=P2^2;
sbit
cKey2=P2^1;
sbit
cKey3=P2^0;
uchar
cKeyCode;
uchar
cLongDelay;
uchar
Out[32];
bit
bStill;
/*
是否松键标志
*/
uint
nDelayKey=0;
/*
键盘延时变量,为定时中断间隔时间的整数倍
*/
uchar
cMode=0;
uchar
Num;
uchar
cF=100;
uchar
code
tosin[32]={
0x80,0x99,0xb1,0xc7,0xda,0xea,0xf6,0xfd,
0xff,0xfd,0xf5,0xe9,0xd8,0xc5,0xae,0x96,
0x80,0x66,0x4e,0x38,0x25,0x15,0x09,0x02,
0x00,0x02,0x0a,0x16,0x27,0x3a,0x51,0x69
};
union
UniT
{
uint
m_nT;
uchar
m_ucT[2];
}idata
uT;
/***************************
函数声明部分
***************************/
void
Display1(void);
void
Display2(void);
void
Scankey(void);
void
DisposeKEY(void);
/********************
按键处理程序
******************/
void
DisposeKEY(void)
{
if
(cKey1==0)
{
if(cF<134)cF++;else
cF
=
1;nDelayKey
=
2000;}
else
if
(cKey2==0){if(cF>1)cF--;else
cF
=
135;nDelayKey
=
2000;}
else
if
(cKey3==0){if(bStill==0)
{
cMode++;cMode
&=
3;
bStill
=
1;}}
//switch(cKey)
//{
//case
0x30:
/*
例如:KeyADD
*/
//
if(cF<134)cF++;
//
else
cF
=
1;
//
nDelayKey
=
2000;
/*
按住键不动,可连续产生键值,相当于连续按键
*/
//
break;
//
case
0x28:
/*
例如:KeySUB
*/
//
if(cF>1)cF--;
//
else
cF
=
135;
//
nDelayKey
=
2000;
//
break;
//
case
0x18:
//
if(bStill==0)
//
{
//
cMode++;
/*
假设有4种显示状态
*/
//
cMode
&=
3;
//
bStill
=
1;
/*
如果没松键就不会再改变显示方式
*/
//
}
//
break;
//
default:break;
//
}
Display2();
cKey
=
0;
}
void
Display2(void)
{
uchar
i;
acLED[0]=acLedSegCode[cMode+10];
/*
LED显示第1位
*/
acLED[1]=acLedSegCode[cF/100];
/*
LED显示第2位
*/
acLED[2]=acLedSegCode[cF/10%10];
/*
LED显示第3位
*/
acLED[3]=acLedSegCode[cF%10];
/*
LED显示第4位
*/
uT.m_nT=38-5760/cF;
switch(cMode)
{
case
0:
for(i=0;i<16;i++)Out[i]
=
255;
//方波
for(i=16;i<32;i++)Out[i]
=
0;
break;
case
1:
for(i=0;i<32;i++)Out[i]
=
tosin[i];
//正弦波
break;
case
2:
for(i=0;i<16;i++)Out[i]
=
i
<<
4;
//三角波
for(i=16;i<32;i++)Out[i]
=
255-i<<4;
break;
case
3:
for(i=0;i<32;i++)Out[i]
=
i<<3;
//锯齿波
break;
}
}
/**************************
主函数
*****************************/
void
main(void)
{
P3_7=0;
/****************
定时器初始化
*******************/
TMOD=
0x12;
/*
定义定时器0工作于方式2(8位自动重装),定时器1工作于方式1(16位定时器)
*/
uT.m_nT=18-2880/cF;
TH1
=uT.m_ucT[0];
TL1
=uT.m_ucT[1];
TR1
=
1;
ET1
=
1;
IP
=
0x04;
/*
T1中断优先
*/
TH0
=
-200;
/*
8位自动重装定时器约每100uS中断1次,9216次为1秒
*/
TL0
=
-200;
TR0
=
1;
ET0
=
1;
EA
=
1;
/*
开总中断
*/
while(1)
{
if(cKey)
{
DisposeKEY();
/*
响应按键操作
*/
}
}
}
/******************
多任务时序控制时钟中断
*********************/
void
IntT0(void)
interrupt
1
/*
定时器0中断,完成1秒定时和LED延时
*/
{
P0
=
0;
/*
先清显示再换位选
*/
P2
=
acLEDCS[cScanIndex];
/*
送位选数据
*/
P0
=
acLED[cScanIndex++];
/*
送显示数据,位选指针移位
*/
cScanIndex
&=
3;
/*
位选指针回位
*/
/*************************
扫描按键程序
******************/
if(nDelayKey==0)
{
cKey
=
P2
&
0x0e;
//
取键值P2.3、P2.2、P2.1
if(cKey
!=
0x0e)nDelayKey=100;//
设置延迟时间削颤
else
{
bStill
=
0;
}
//
松键
}
else
//
有按键利用DelayKey按键消颤
{
nDelayKey--;
if(nDelayKey==0)
{
cKeyCode
=
P2
&0x0e;
if(cKey
!=
cKeyCode)
{
cKeyCode
=
0;
}
}
}
}
/******************
可控制定时时间间隔的时钟中断
*********************/
void
IntT1(void)
interrupt
3
/*
定时器1中断,记录T1计时溢出次数
*/
{
TL1
=uT.m_ucT[1];
TH1
=uT.m_ucT[0];
P1
=
Out[Num++];
Num
&=
31;
}

热心网友 时间:2023-08-25 14:09

频率可调:我觉得用一个滑动变阻器来调节,单片机通过AD采集滑动变阻器阻值,换算出目标频率,然后就是单片机处理了

热心网友 时间:2023-08-25 14:09

我做的信号发生器,怎么用proteus仿真可以,但是把硬件做好后,用示波器看就不行了啊
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
提升学历选自考好还是成考好 成考和自考的文凭哪个好 2024年成人自考和成人高考哪个更好 家用净水器滤芯类型有哪些 家用净水器什么滤芯好 请问在VB中如何调用多线程? 交强险理赔后第二年上涨吗? 交强险出一次险第二年保费多出多少? 全家人都爱吃的家常菜目录 丽台Quadro P5000专业图形显卡-购买最佳价格 求基于单片机的低频信号发生器的原理图和程序 利用89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角波等信号波形,信号的频率、幅度 今年箱包最新起名带琦字 急,大家帮忙给孩子取个名字,就差中间一个字,郭( )轩 箱包店起名起个凯翔怎么样?我想知道什么意义.... 郭致远 郭家睿 郭浩轩三个名字哪个分数高 帮起两名字,今天出生的两胞胎都是男孩子。起什么名好? 我姓郭~想给孩子起个名字,哪个好心人帮我一下啊 郭皓轩这个名字怎么样 请高人帮忙分析下 妈妈姓兰 春秋航空座位间距很窄吗 两个机场因跑道垂直要满足安全,间距应该要多少公里? 两驱的长安林肯飞行家最小离地间隙是多少? 怎样制作南方的烧麦? 怎么应对男人的冷暴力? 如何冻结 金佰鑫指纹锁J20多少钱? 金佰鑫自锁盾甲门怎么样? 保卫盾门锁和金佰鑫门锁那个好 在哪里能找到火火兔G6的免费资源链接求分享感激不尽 求推荐新手学习手绘、绘画学习之用的书籍。《五天学会绘画》如何?大神们帮帮忙 设计单片机低频信号发生器,要求使用汇编语言,片选方式 男孩儿SEO博客:如何建立一个成功的品牌型的网站 怎样做网站优化,使其在搜索引擎中排名靠前。 SQL中的group by为什么是按照分组的第二个字段排序的呢? sort by 和 group by 的区别是什么? sql group by 排序问题 求助asp 中group by 的用法是什么啊!! 急!急!为什么有时用groupby结果还是显示同一个人的记录 sql group 后按分组数量的多少排序怎么写? 快影制作视频封面微信发却没有 弹力测力计的使用方法 如题 用弹簧测力计探究动滑轮的省力特点的视频 什么是约瑟夫法则 求解josephus问题的算法 约瑟夫环的算法原理 编写C语言算法,试编写一个求解Josephus问题的函数,用整数序列1, 2, 3, …… josephus问题数据结构C 怎样用vb实现约瑟夫环算法?? Josephus环算法的设计 流程图 描写解决约瑟夫问题的算法,按出列顺序组成新的表,然后再输出 C语言编程Josephus问题