51单片机数模转换
郭天祥的新编51C语言教程中关于D/A转换有一篇例题,例题是5.5.1程序内容为:#include<reg52.h>#defineucharunsignedchar#de...
郭天祥的新编51C语言教程中关于D/A转换有一篇例题,例题是5.5.1程序内容为:
#include<reg52.h>
#define uchar unsigned char
#define unit unsigned int
sbit dula=P2^6; //此处申明U1锁存器的锁存端
sbit wela=P2^7; //此处申明U2锁存器的锁存端
sbit dawr=P3^6; //此处定义DA 的WR端口
sbit dacs=P3^2; //此处定义DA 的CS端口
sbit beep=P2^3; //此处定义蜂鸣器
void delayms (unit xms) //延时程序
{
unit i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main() //主函数
{
unchar val,flag;
dula=0; //此处关闭段选
wela=0; //此处关闭位选
dacs=0; //CS低电平有效
dawr=0; //WR低电平有效
P0=0; //不明白为什么P0=0????
while(1) //大循环开始
{
if(flag==0) //此处不明白...flag干嘛的.....
{
val+=5; //val又是干嘛的....
P0=val; //有什么关系吗...这两个....
if(val==255)
{
flag=1; //不懂
beep=0; //明白
delayms(100);
beep=1;
}
delayms(50);
}
else
{
val-=5; //不懂
P0=val; //不懂
if(val==0) //不懂
{
flag=0;
beep=0;
delayms(100);
beep=1;
}
delayms(50)
}
}
} 展开
#include<reg52.h>
#define uchar unsigned char
#define unit unsigned int
sbit dula=P2^6; //此处申明U1锁存器的锁存端
sbit wela=P2^7; //此处申明U2锁存器的锁存端
sbit dawr=P3^6; //此处定义DA 的WR端口
sbit dacs=P3^2; //此处定义DA 的CS端口
sbit beep=P2^3; //此处定义蜂鸣器
void delayms (unit xms) //延时程序
{
unit i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main() //主函数
{
unchar val,flag;
dula=0; //此处关闭段选
wela=0; //此处关闭位选
dacs=0; //CS低电平有效
dawr=0; //WR低电平有效
P0=0; //不明白为什么P0=0????
while(1) //大循环开始
{
if(flag==0) //此处不明白...flag干嘛的.....
{
val+=5; //val又是干嘛的....
P0=val; //有什么关系吗...这两个....
if(val==255)
{
flag=1; //不懂
beep=0; //明白
delayms(100);
beep=1;
}
delayms(50);
}
else
{
val-=5; //不懂
P0=val; //不懂
if(val==0) //不懂
{
flag=0;
beep=0;
delayms(100);
beep=1;
}
delayms(50)
}
}
} 展开
5个回答
展开全部
这个程序的效果是 电压值逐渐上升 然后逐渐下降 吗?
说下我的理解。
P0=0 // 初值呀, 这样转化到0V。
flag 是一个标志 当数字量(val)为255(最大转化值)时置1. 为0时清零。
val是一个待转化的数字量 。把val的值给P0口 ,再通过P0与数模转化芯片转化为模拟量。
注释如下:
P0=0; //P0付初值。也就是让val为0;
while(1) //大循环开始
{
if(flag==0) //当flag为0时 。
{
val+=5; // val=val+5;
P0=val; //把val送给P0口;
if(val==255) //如果 val=255;
{
flag=1; //flag=1
beep=0; // 蜂鸣器 汪汪叫 (0是叫还是不叫?)
delayms(100);
beep=1; // 跟前个状态相反。
}
delayms(50);
}
else //如果flag==1; (val=255)
{
val-=5; // 待转化的数字量-5;
P0=val; // val送给P0;
if(val==0) // 待转化val=0;
{
flag=0; // 标记flag =0;
beep=0; // 蜂鸣器不叫
delayms(100);
beep=1; /蜂鸣器叫
}
delayms(50)
}
}
}
以上是我的理解 。 不知道你用PROTUES仿真了没有 。
说下我的理解。
P0=0 // 初值呀, 这样转化到0V。
flag 是一个标志 当数字量(val)为255(最大转化值)时置1. 为0时清零。
val是一个待转化的数字量 。把val的值给P0口 ,再通过P0与数模转化芯片转化为模拟量。
注释如下:
P0=0; //P0付初值。也就是让val为0;
while(1) //大循环开始
{
if(flag==0) //当flag为0时 。
{
val+=5; // val=val+5;
P0=val; //把val送给P0口;
if(val==255) //如果 val=255;
{
flag=1; //flag=1
beep=0; // 蜂鸣器 汪汪叫 (0是叫还是不叫?)
delayms(100);
beep=1; // 跟前个状态相反。
}
delayms(50);
}
else //如果flag==1; (val=255)
{
val-=5; // 待转化的数字量-5;
P0=val; // val送给P0;
if(val==0) // 待转化val=0;
{
flag=0; // 标记flag =0;
beep=0; // 蜂鸣器不叫
delayms(100);
beep=1; /蜂鸣器叫
}
delayms(50)
}
}
}
以上是我的理解 。 不知道你用PROTUES仿真了没有 。
追问
beep=0是叫
P0口的话STC80C51
不应该是P0.0~P0.7八个口吗?如果把val赋给P0口是什么呀...
追答
去看看数模转化吧。
展开全部
看这一句 "unchar val,flag"
是定义的 val计数 flag是标记位
当flag为零 val值+5 然后把val给P0
因为是8位的DAC 所以当val为255时 把flag置1 因为256就溢出了
后面不懂的地方类似
是定义的 val计数 flag是标记位
当flag为零 val值+5 然后把val给P0
因为是8位的DAC 所以当val为255时 把flag置1 因为256就溢出了
后面不懂的地方类似
追问
你好,为什么要把val赋给P0呢???
追答
那要看你的P0口接的是什么了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
P0接的是DA的D0到D7的数据口吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
遇到过这样的问题,现在还不知道为什么,,val,flag 没有赋初值,缘何判断?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我看过这个程序 很多句子也不懂 unchar val,flag; 这句虽然定义了 但是没有赋初值,后面运行到if(flag==0)是怎么运行的呢?无法判断啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询