#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转换)
需积分: 0 74 浏览量
更新于2023-12-02
收藏 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秒采集一次通
s1174670658
- 粉丝: 34
- 资源: 29
最新资源
- 永磁同步电机无传感,高频脉振注入,采用如图观测器,结果如图,可以跟踪上给定
- 光伏并网逆变器设计方案,附有相关的matlab电路文件,以及DSP的程序代码,方案、仿真文件、代码三者结合使用效果好,事半功倍 备注:赠送逆变器并联环流matlab文件,基于矢量控制的环流抑制策略和
- 西门子1214PLC博图程序例程,版本V16及以上,加KTP700Basic PN触摸屏画面,双相机四轴多工位检测设备案例 程序主要有: 上下双工位4轴脉冲控制步进电机; 与上位机双相机的TCP I
- 计及碳捕集电厂低碳特性需求响应综合能源系统多时间尺度调度模型 关键词:碳捕集电厂 综合灵活运行方式 需求响应 日前调度 实时调度 多时间尺度 参考文档:计及碳捕集电厂低碳特性的含风电电力系统源
- 电力系统随机潮流概率潮流计算MATLAB程序包含蒙特卡洛模拟法、半不变量法+级数展开(Gram-Charlie,Cornish-Fisher); 考虑光伏不确定性(Beta分布),以IEEE34节点为
- 西门子1200伺服步进FB块程序 程序内含两个FB,一个是scl写的,一个是梯形图,可以多轴多次调用,中文注释详细 真实可用,经过在专用设备真实调试运行,可以直接应用到实际项目中 此FB块适合PTO
- 基于单片机家庭安全监控 安全防护设计-仿真原理图程序 主要功能:温度检测、火焰报警、PM2.5检测、按键设置 仿真、原理图、程序
- MATLAB代码:基于主从博弈理论的共享储能与综合能源微网优化运行研究 关键词:主从博弈 共享储能 综合能源微网 优化调度 参考文档:《基于主从博弈理论的共享储能与综合能源微网优化运行研究》完全复现
- 三相两电平并网逆变器仿真模型,电流环双闭环控制,单位功率因数,锁相环
- MATLAB代码:基于概率距离快速削减法的风光场景生成与削减方法 关键词:风光场景生成 场景削减 概率距离削减法 蒙特卡洛法 参考文档:《含风光水的电厂与配电公司协调调度模型》完全复现场景削减部分 仿
- MATLAB代码:含电热联合系统的微电网运行优化 关键词:微网 电热联合系统 优化调度 火参考文档:《含电热联合系统的微电网运行优化》完全复现 仿真平台:MATLAB yalmip+cplex
- MATLAB代码:含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度 关键词:冰蓄冷空调 CCHP-MG 多时间尺度优化 冷热电联供 参考文档:《含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度》完全
- BLDC有感仿真模型 双闭环控制,带霍尔传感器,其中霍尔处理,相逻辑用代码实现的,容易理解,为方便转化到代码
- 基于ISODATA改进算法的负荷场景曲线聚类(适用于风光场景生成) 摘要:代码主要做的是一种基于改进ISODATA算法的负荷场景曲线聚类,代码中,主要做了四种聚类算法,包括基础的K-means算法、I
- 转速、电流双闭环直流调速系统控制器设计 额定功率185w,电压220v,转速1600,电枢电流1.1A 电源电压为5或10v 分别用工程设计法和超前校正发进行仿真,均对空载、额定负载、突加负载(
- 基于PSO算法的光伏MPPT的Simulink仿真实现,可以定制其他算法优化的MPPT,比如:GWO,SSA等 代码质量极高,方便学习