#include <reg52.h>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//定义DAC0832的地址
#define DAC_OUT XBYTE[0x7fff]
/* 波形数据 ---------------------------------------------------------*/
uint code Sine12bit[32] = {
2448,2832,3186,3496,3751,3940,4057,4095,4057,3940,
3751,3496,3186,2832,2448,2048,1648,1264,910,600,345,
156,39,0,39,156,345,600,910,1264,1648,2048
};
sbit SB1 = P3^4;
sbit SB2 = P3^5;
sbit SW = P3^7;
//定义峰值,频率,输出的波形
uchar FZ = 50,MS = 1;
uint PL = 100;
uchar Set = 7;
//定义定时器值
uchar TimeH,TimeL;
//定义一个数组,保存输出的电压
uchar idata Buffer[32] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
uchar code SMG_CODE[] = {/*0,1,2,3,4,5,6,7,8,9,空,*/
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,};
uchar array[] = {5,0};
sbit Wei1 = P3^2;
sbit Wei2 = P3^3;
void Write_Wei(uchar x)
{
if(x&0x01)Wei1 = 1; else Wei1 = 0;
if(x&0x02)Wei2 = 1; else Wei2 = 0;
}
//颜、延时函数
void delayms(uint x)
{
uchar i;
while(x--)for(i = 0; i < 120; i++);
}
//更新频率
void GX_PL(void)
{
float x;
x = 10000000/32/PL;
//x-=20.1;
TimeH = (uint)(65536 - x)>>8;
TimeL = (uint)(65536 - x)&0xff;
RCAP2H = TimeH;
RCAP2L = TimeL;
}
void GX_Bo(uchar x)
{
uchar i;
float y;
switch(x)
{
//选择输出为方波
case 0: MS = 1;
for(i = 0; i < 16; i++)
{
Buffer[i] = FZ/50.0*255.0;
}
for(i = 16; i < 32; i++)
{
Buffer[i] = 0;
}
break;
//选择输出为三角波
case 1: MS = 2;
y = FZ/16.0;
for(i = 0; i < 16; i++)
{
Buffer[i] = y*i*5.1;
}
for(i = 16; i < 32; i++)
{
Buffer[i] = (FZ - (i - 16)*y)*5.1;
}
break;
//选择输出为正玄波
case 2: MS = 3;
for(i = 0; i < 32; i++)
{
Buffer[i] = (uint)Sine12bit[i]/800.0*FZ;
}
break;
case 3: MS = 4;
y = FZ/32.0;
for(i = 0; i < 32; i++)
{
Buffer[i] = y*i*5.1;
}
break;
}
}
//主函数
void main(void)
{
uchar Old_SW = 1;
GX_Bo(1);
//更新频率
GX_PL();
EA = 1;
ET2 = 1;
TR2 = 1;
TMOD = 0x01;
TH0 = (65536 - 5000)>>8;
TL0 = (65536 - 5000)&0xff;
ET0 = 1;
TR0 = 1;
//实时扫描按键
while(1)
{
if(SW != Old_SW)
{
Old_SW = SW;
if(SW == 1)GX_Bo(1);
else if(SW == 0)GX_Bo(3);
}
if(SB1 == 0)
{
if(FZ < 50)FZ++;
if(SW == 1)GX_Bo(1);
else if(SW == 0)GX_Bo(3);
while(SB1 == 0);
}
if(SB2 == 0)
{
if(FZ > 1)FZ--;
if(SW == 1)GX_Bo(1);
else if(SW == 0)GX_Bo(3);
while(SB2 == 0);
}
array[0] = FZ/10;
array[1] = FZ%10;
}
}
void ET0_T0(void) interrupt 1
{
static uchar i = 0,Wei = 0xfe;
TH0 = (65536 - 5000)>>8;
TL0 = (65536 - 5000)&0xff;
P1 = 0x00;
Write_Wei(Wei);
if(i == 0)P1 = SMG_CODE[array[i]]|0x80;
else P1 = SMG_CODE[array[i]];
Wei = (Wei<<1)|0x01;
if(++i == 2){i = 0; Wei = 0xfe;}
}
//定时器用于输出电压
void ET2_T2(void) interrupt 5
{
static uchar i = 0;
TF2 = 0;
DAC_OUT = Buffer[i];
if(++i == 32)i = 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机的信号发生和测量(D/A、A/D转换)
共65个文件
bak:8个
obj:6个
lst:6个
需积分: 0 2 下载量 124 浏览量
2023-12-02
13:28:47
上传
评论
收藏 228KB ZIP 举报
温馨提示
1、信号发生器(D/A转换实验) 利用DAC0832产生可产生锯齿波,三角波。利用开关状态进行选择所需要输出的波形。 开关闭合:利用DAC0832产生0~5V的锯齿波,用两位数码管进行显示电压值(精确到小数点后1位),同时利用示波器进行观察。 开关断开:利用DAC0832产生0~5V的三角波,用两位数码管进行显示电压值(精确到小数点后1位),同时利用示波器进行观察。 提示:假设0832工作在单缓冲方式,地址为0x7fff。 开关接至P1.0,P2.7接0832片选端CS,P3.6接WR1,DA0832的输出接两级运放后再接示波器显示波形。 2、信号测量(A/D转换实验) 将模拟信号接至ADC0809进行处理,产生的数字信号输出给单片机进行处理。 ① 利用电位器输出产生模拟信号。模拟信号接至ADC0809的通道0(IN0)。分别设计查询和中断程序不断采集电位器输出的模拟电压值,将A/D转换的结果通过P1口连接的8个LED显示出来。(用外中断0) ② 定时数据采集程序设计:用T0定时5秒采集一次通
资源推荐
资源详情
资源评论
收起资源包目录
信号发生和测量.zip (65个子文件)
20250525 DAC0832 ADC0809
1信号发生器
程序
程序_uvopt.bak 6KB
程序_uvproj.bak 13KB
程序.uvgui.ausu 67KB
程序 12KB
main.__i 62B
STARTUP.LST 14KB
程序.M51 14KB
main.OBJ 11KB
STARTUP.A51 6KB
程序.hex 6KB
main.LST 7KB
程序.uvproj 13KB
程序.plg 3KB
程序.uvgui.ASUS 66KB
STARTUP.OBJ 749B
程序.lnp 56B
main.c 3KB
程序.uvopt 6KB
仿真.PWI 792B
仿真.DSN 82KB
Last Loaded 仿真.DBK 82KB
2信号测量
1查询
程序
程序_uvopt.bak 6KB
程序_uvproj.bak 14KB
程序 4KB
main.__i 43B
STARTUP.LST 14KB
程序.M51 5KB
main.OBJ 3KB
STARTUP.A51 6KB
程序.uvgui_ASUS.bak 66KB
程序.hex 720B
main.LST 2KB
程序.uvproj 13KB
程序.plg 983B
程序.uvgui.ASUS 66KB
程序.build_log.htm 985B
STARTUP.OBJ 749B
程序.lnp 56B
main.c 547B
程序.uvopt 6KB
仿真.PWI 742B
仿真.DSN 70KB
Last Loaded 仿真.DBK 113KB
2中断
程序
程序_uvopt.bak 6KB
程序_uvproj.bak 14KB
程序 4KB
main.__i 43B
STARTUP.LST 14KB
程序.M51 5KB
main.OBJ 4KB
STARTUP.A51 6KB
程序.uvgui_ASUS.bak 66KB
程序.hex 769B
main.LST 2KB
程序.uvproj 13KB
程序.plg 736B
程序.uvgui.ASUS 66KB
程序.build_log.htm 985B
STARTUP.OBJ 749B
程序.lnp 56B
main.c 554B
程序.uvopt 6KB
仿真.PWI 742B
仿真.DSN 72KB
Last Loaded 仿真.DBK 71KB
共 65 条
- 1
资源评论
s1174670658
- 粉丝: 1
- 资源: 27
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功