标题: 大神快来 [打印本页]

作者: 通信-冷    时间: 2014-10-31 10:52
标题: 大神快来
我用的是51单片机 问一下 如何控制AD来控制他的一个灯让他从最亮到最暗两秒循环 我的是DAC0832
  #include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num;
void delay(uint);
sbit csda=P3^2;
sbit wr=P3^6;
void main()
{
csda=0;
wr=0;
num=0xff;
while(1)
{
  num=num--;
  if(num==0)
  {
     delay(50);
     num=0xff;
   }
  P0=num;



}
}
  void delay (uint z)   
  {
   uint x,y;
   for(x=z;x>0;x--)
   for(y=110;y>0;y--);
  
  
  }这样写为什么不可以 是不是不能直接对16进制数进行+-运算呢
post_newreply








分享到: QQ好友和群腾讯微博QQ空间
评分收藏0转播分享淘帖000

AD与单片机连接.jpg (87.07 KB, 下载次数: 181)

AD与单片机连接.jpg

作者: 通信-冷    时间: 2014-10-31 10:56
传错了

DA接口.jpg (84.76 KB, 下载次数: 177)

DA接口.jpg

作者: T29    时间: 2014-10-31 16:07
本帖最后由 T29 于 2014-10-31 16:09 编辑

很好  学习  谢谢
作者: T29    时间: 2014-11-1 00:44
没看到驱动部分,是不是驱动的问题
作者: dgahz    时间: 2014-11-2 15:51
要搞清--num和num--的区别;num=num--则num的值就永远不会变。
public class Test {
    public static void main(String[] args) {
        int i = 1;
        i = i++;
        System.out.println(i);
    }
}

先想一想,这个程序会输出什么?是1还是2?按照我最初的想法,输出应该是2,因为把i赋值给i相当于没做什么操作,然后对i进行自加操作,所以变量i的值变为2了。但实际输出结果却是1!

跟David讨论了一下,他说这个i = i++;的操作可能相当于以下三步操作:①把变量i的值取出来,放在一个临时变量里(我们先记作temp);②把变量i的值进行自加操作;③把临时变量temp的值作为自增运算前i的值使用,在本题中就是给变量i赋值。因此,经过以上三步操作以后,虽然变量i在第②步操作中进行了自增运算,但第三步操作以后又把原来的值赋给了它,故最后输出结果为1。虽然我不确定这种解释是否正确,毕竟对底层实现细节不是太了解,但这种解释至少跟结果是符合的。
作者: 通信-冷    时间: 2014-11-4 21:16
dgahz 发表于 2014-11-2 15:51
要搞清--num和num--的区别;num=num--则num的值就永远不会变。
public class Test {
    public static v ...

受教了 多谢大神 我去试试
作者: 通信-冷    时间: 2014-11-4 21:17
dgahz 发表于 2014-11-2 15:51
要搞清--num和num--的区别;num=num--则num的值就永远不会变。
public class Test {
    public static v ...

受教了 多谢大神 我去试试
作者: dgahz    时间: 2014-11-4 21:20
while(1)
{
  num=num--;
  if(num==0)
  {
     delay(50);

改成
while(1)
{
  num--;
  if(num==0)
  {
作者: 通信-冷    时间: 2014-11-4 21:40
还有一个问题 :这段程序这样表示可以吗:num=0xff;num=--num 就是我上面说的 能对16进制进行运算吗
作者: dgahz    时间: 2014-11-4 22:05
可以。编程可以用十进制和十六进制,不可用二进制。十进制和十六进制都能运算
作者: dgahz    时间: 2014-11-4 22:08
本帖最后由 dgahz 于 2014-11-4 22:12 编辑

如P1=0xFF和P1=255效果一样
作者: dgahz    时间: 2014-11-4 22:11
这段程序这样表示可以吗:num=0xff;num=--num

可以,先减可以,后减不行
作者: 通信-冷    时间: 2014-11-4 22:22
可程序要实现的功能却没有实现 我是想让上面发的电路图中的最右边的D12灯实现从亮到暗变换 。。不知道程序哪里错了 大神给点意见呗
作者: dgahz    时间: 2014-11-5 09:37
本帖最后由 dgahz 于 2014-11-5 09:44 编辑

试试:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num;

sbit csda=P3^2;
sbit wr=P3^6;
void delay7ms800us(void)   //误差 0us 12m晶振
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=193;a>0;a--);
}

void main()
{
csda=0;
wr=0;
num=0xff;
while(1)
{  P0=num;  
delay7ms800us();
  num--;
  
  if(num==0)
  {
     
     num=0xff;
   }






作者: 通信-冷    时间: 2014-11-5 21:30
我编译了一下 貌似有错误啊 大神 对了 我用的是ATM89C52 单片机 还有就是void delay7ms800us(void)   //误差 0us 12m晶振
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=193;a>0;a--);
}这个我没看懂 就是个延时函数还是什么

IMG_20141105_212554.jpg (2.06 MB, 下载次数: 136)

IMG_20141105_212554.jpg

IMG_20141105_212603.jpg (1.84 MB, 下载次数: 149)

IMG_20141105_212603.jpg

作者: 通信-冷    时间: 2014-11-5 21:30
我编译了一下 貌似有错误啊 大神 对了 我用的是ATM89C52 单片机 还有就是void delay7ms800us(void)   //误差 0us 12m晶振
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=193;a>0;a--);
}这个我没看懂 就是个延时函数还是什么
作者: dgahz    时间: 2014-11-5 21:42
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num;
sbit csda=P3^2;
sbit wr=P3^6;
void delay7ms800us(void)   //误差 0us 12m晶振
{
    unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=193;a>0;a--);
}
void main()
{
        csda=0;
        wr=0;
        num=0xff;
    while(1)
    {   P0=num;  
        delay7ms800us();
        num--;
                if(num==0)
                {
                   num=0xff;
                }
    }
}
作者: dgahz    时间: 2014-11-5 21:43
是延时函数
作者: dgahz    时间: 2014-11-5 21:45
重新编译好给你,上次那个随便拿记事本写好给你,没检查,不好意思
作者: 通信-冷    时间: 2014-11-8 13:46
我去试试

作者: 通信-冷    时间: 2014-11-8 20:06
dgahz 发表于 2014-11-5 21:43
是延时函数

这个延时函数 我不是很明白 他没运行一次是多少时间 另外就是那个由亮到暗这个功能是实现了  但数码管却也在变化 我不太理解 难道这两个是连在一块的 ?

作者: dgahz    时间: 2014-11-8 20:36
有个软件叫单片机小精灵,里面你要延时多长它自动帮你算,形成C代码,复制过来就可以了。数码管会变应该是共用了P0口,开发板单片机IO都是共用的。你看一下你的板电原理图就清楚了。
作者: 通信-冷    时间: 2014-11-8 21:38
这两个之间貌似连了锁存器 可以通过设置锁存器来关闭数码管吗
作者: 通信-冷    时间: 2014-11-8 21:40
哦 好像弄错了 好像没有啊
作者: dgahz    时间: 2014-11-8 23:00
发个电路图过来





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1