打印
[STC单片机]

高手求教用pcf8591 步进控制输出电压,HC6800开发板

[复制链接]
1881|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jch793155|  楼主 | 2013-8-11 19:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用HC6900的开发板,要用pcf8591的AD/DA芯片步进控制输出电压,而且要把输出电压显示在数码管上
我现在的思路是用 K1、K2两个按键进行输出电压的加减,也做到了,但是不会用ad转换把输出电压数值显示在数码管上、、求各位指导
程序如下:
#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int
#define  PCF8591 0x90         //PCF8591 地址


sbit SCL=P2^1;        //串行时钟输入端
sbit SDA=P2^0;        //串行数据输入端
sbit K1=P2^7;
sbit K2=P2^6;
sbit LS138A=P2^2;  
sbit LS138B=P2^3;
sbit LS138C=P2^4;
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char AD_CHANNEL;
unsigned long xdata  LedOut[8];
unsigned int  D[32];

void delay()        //延时4-5个微秒
{;;}

void delay_1ms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void start() //开始信号
{
        SDA=1;
        delay();
        SCL=1;
        delay();
        SDA=0;
        delay();
}

void stop() //停止信号
{
        SDA=0;
        delay();
    SCL=1;
        delay();
        SDA=1;
        delay();
}


void respons()//应答        相当于一个智能的延时函数
{
        uchar i;
        SCL=1;
        delay();
        while((SDA==1)&&(i<250))
                i++;
        SCL=0;
        delay();
}

void init() //初始化
{
        SDA=1;
        delay();
        SCL=1;
        delay();         
}

void write_byte(uchar date) //写一字节数据
{
        uchar i,temp;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1; //左移一位 移出的一位在CY中
                SCL=0;                        //只有在scl=0时sda能变化值
                delay();
                SDA=CY;
                delay();
                SCL=1;
                delay();                 
        }         
        SCL=0;
        delay();
        SDA=1;
        delay();
        }

       
void write_add(uchar control,uchar date)
{
        start();
        write_byte(PCF8591);        //10010000        前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平
        respons();
        write_byte(control);
        respons();
        write_byte(date);
    respons();
        stop();
}

char Pressed1(void)
{
unsigned int i;
while(P0==0XFE);
for(i=0;i<8000;i++);
if (P0!=0XFE)
return 1;
else   
return 0;
}

char Pressed2(void)
{
unsigned int i;
while(P0==0XFD);
for(i=0;i<8000;i++);
if (P0!=0XFD)
return 1;
else   
return 0;
}  


void main()
{  
        uchar a=0;
        init();
        while(1)
        {
                write_add(0x40,a);
                delay_1ms(5);
                if(Pressed1()){a+=2;}
                if(Pressed2()){a-=2;}
                if(a>100)a=100;
                if(a<0) a=0;
    }

相关帖子

沙发
林志财| | 2013-8-11 21:16 | 只看该作者
直接把八位的数据,例如NUM
bai=NUM/100;
shi=num%100/10;
ge=num%10;
然后在动态扫描就好了

使用特权

评论回复
板凳
jch793155|  楼主 | 2013-8-11 21:51 | 只看该作者
林志财 发表于 2013-8-11 21:16
直接把八位的数据,例如NUM
bai=NUM/100;
shi=num%100/10;

我该怎么修改这个程序呢,是不是还要加一些 ADC的发送和读取函数,对数模转换不是很理解

使用特权

评论回复
地板
林志财| | 2013-8-11 22:06 | 只看该作者
ADC你会写吧,
出来的不是有八个数字电平嘛,引线回来给单片机某个口,比如P1,然后加个74HC138控制位,再把P1赋值给NUM,
uchar code table1[]={0x0c,0x08,0x04,0};
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
    qian=num/1000;
        bai=(num%1000)/100;
    shi=((num%1000)%100)/10;
    ge=num%10;
       
        P2=table1[0];
    P1=table[ge];
    delay(4);

    P2=table1[1];
    P1=table[shi];
    delay(4);
  
    P2=table1[2];
    P1=table[bai];
    delay(4);

    P2=table1[3];
    P1=table[qian];
    delay(4);
       

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

9

帖子

0

粉丝