📄 max517c3.c
字号:
/*************************************************************/
/* 这是MAX517 C51语言程序-不是调用汇编的,文件名为MAX517C3.C */
/* 功能:本程序是实现MAX517芯片的D/A转换。程序中转换的十六 */
/* 进制值依次为10H,20H,40H,80H,0FFH,00H, OUT脚输出转换后 */
/* 的模拟信号,它既可用万用表的直流电压档测试,也可用示波器 */
/* 的探头点在此处观察。 */
/**************************************************************/
#include <reg52.h> // 引用标准库的头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P1^0; // MAX517串行数据
sbit SCL = P1^1; // MAX517串行时钟
uchar i;
void delay(uint t) // 延时t毫秒
{
uint i;
while(t--)
{
for (i=0;i<125;i++) // 对于12M时钟,约延时1ms
{}
}
}
void start(void) // 起始条件子程序
{
SDA = 1;
SCL = 1;
_nop_();
SDA = 0;
_nop_();
}
void stop(void) // 停止条件子程序
{
SDA = 0;
SCL = 1;
_nop_();
SDA = 1;
_nop_();
}
void ack(void) // 应答子程序
{
SDA = 0;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
}
void send(uchar ch) // 发送数据子程序,ch为要发送的数据
{
uchar BitCounter = 8; //位数控制
uchar tmp; //中间变量控制
do
{
tmp = ch;
SCL = 0;
_nop_();
if ((tmp&0x80)==0x80)//如果最高位是1
SDA = 1;
else
SDA = 0;
SCL = 1;
tmp = ch<<1; //左移
ch = tmp;
BitCounter--;
}
while(BitCounter);
SCL = 0;
}
void DACOut(uchar ch) // 串行DA转换子程序
{
start(); // 发送启动信号
send(0x58); // 发送地址字节
ack();
send(0x00); // 发送命令字节
ack();
send(ch); // 发送数据字节
ack();
stop(); // 结束一次转换
}
void main(void) // 主程序
{
SP=0xcf;
delay(2000);
i=0x10; // 对数字0x10作数模转换
DACOut(i);
delay(2000); // 延时约2s
i=0x20; // 对数字0x20作数模转换
DACOut(i);
delay(2000); // 延时约2s
i=0x40;
DACOut(i);
delay(2000);
i=0x80;
DACOut(i);
delay(2000);
i=0xff;
DACOut(i);
delay(2000);
i=0x00;
DACOut(i);
delay(2000);
while(1)
{ // 对数字0~255进行数模转换
for (i=0;i<=255;i++)
{
delay(1000); // 间隔约1s
DACOut(i); // 调用串行DA转换子程序
}
delay(2000); // 延时2s
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -