微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > adc0832问题

adc0832问题

时间:10-02 整理:3721RD 点击:

编写程序仿真 通道0能行 换成通道1就不信 为什么?
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#define INT8U unsigned char
#define INT16U unsigned int
//DAC0832
sbit CS=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
//1602
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
#define LCD_PORT P0
INT8U Disp_Buff1[]=" VOLTAGE:  0.00V";
INT8U Disp_Buff2[16];
#define delay4us() { _nop_();_nop_();_nop_();_nop_(); }
void delay_ms(INT16U x)
{
        INT8U t;
        while(x--) for(t=0;t<120;t++);
}
//读液晶屏忙状态
bit Read_LCD_Busy_Flag()
{
        INT8U result;
        LCD_PORT=0xFF;
        RS=0;
        RW=1;
        E=1;
        delay4us();
        result=P0;E=0;
        return(result & 0x80)?1:0;
}
//写指令
void Write_LCD_Command(INT8U cmd)
{
        while(Read_LCD_Busy_Flag());
        RS=0;
        RW=0;
        E=0;
        _nop_();
        _nop_();
        LCD_PORT=cmd;
        delay4us();
        E=1;
        delay4us();
        E=0;
}
//写数据
void Write_LCD_Data(INT8U dat)
{
        while(Read_LCD_Busy_Flag());
        RS=1;
        RW=0;
        E=0;
        LCD_PORT=dat;
        delay4us();
        E=1;
        delay4us();
        E=0;
}
//指定行列显示字符串
void LCD_Show_String(INT8U r,INT8U c,char*s)
{
        INT8U i=0;
        INT8U code DDRAM[]={0x80,0xc0};
        Write_LCD_Command(DDRAM[r]|c);
        while(s && i<16) Write_LCD_Data(s[i++]);
}
//液晶初始化
void LCD_Initialise()
{
        Write_LCD_Command(0x38);   delay_ms(1);
        Write_LCD_Command(0x0c); delay_ms(1);
        Write_LCD_Command(0x06); delay_ms(1);
        Write_LCD_Command(0x01); delay_ms(1);
}
//获取AD转换结果
INT8U Get_AD_Result()
{
        INT8U i,dat1=0,dat2=0;
        CS=0;_nop_();
        _nop_();CLK=0;_nop_();
        _nop_();
        DIO = 1;      
        _nop_();
        _nop_();
        CLK = 1;      
        _nop_();
        _nop_();
        CLK = 0;
        DIO = 1;
        _nop_();
        _nop_();
        CLK = 1;      
        _nop_();
        _nop_();
        CLK = 0;
        DIO = 0;//
         _nop_();
         _nop_();
        CLK = 1;
        DIO = 1;   
        _nop_();
        _nop_();
        CLK = 0;
        DIO = 1;
        _nop_();
        _nop_();
        //CLK = 1; _nop_(); _nop_();         //        新
    //CLK = 0; _nop_(); _nop_();         //         加
        for(i=0;i<8;i++)
        {
                CLK=1;      
                _nop_();
                _nop_();
                CLK=0;      
                _nop_();
                _nop_();
                dat1 = (dat1<<1) | DIO;
        }
        for(i=0;i<8;i++)
        {
                dat2=dat2|((INT8U)DIO<<i);
                CLK=1;      
                _nop_();
                _nop_();
                CLK=0;
                _nop_();
                _nop_();
        }
        CS=1;DIO = 1;CLK=1;
        return(dat1==dat2)?dat1 : 0x00;
}
void main()
{
        INT8U i,AD;INT16U d;
        LCD_Initialise();
         delay_ms(10);
        while(1)
        {
                AD=        Get_AD_Result();
                d=AD*500.0*2/511.0;
                Disp_Buff1[11]=d/100 +'0';
                Disp_Buff1[13]=d/10%10 +'0';
                Disp_Buff1[14]=d%10 +'0';
                LCD_Show_String(0,0,Disp_Buff1);
                i=(INT16U)AD*16/255;
                memset(Disp_Buff2 ,'\xFF',i);
                memset(Disp_Buff2+i ,'\xDB',16-i);
                LCD_Show_String(1,0,Disp_Buff2);
        }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top