標題: 可以幫忙看看這個單片機仿真為什么沒結(jié)果嗎? [打印本頁]

作者: 一一aaaa    時間: 2022-11-5 16:58
標題: 可以幫忙看看這個單片機仿真為什么沒結(jié)果嗎?
#include <reg52.h>                 //調(diào)用單片機頭文件
#define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
#define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

uint dianya;   //電壓

sbit CS=P1^5;                //CS定義為P1口的第3位腳,連接ADC0832CS腳
sbit CLK=P1^6;                //CLK定義為P1口的第4位腳,連接ADC0832CLK腳
sbit DODI=P1^7;                //DODI定義為P1口的第5位腳,連接ADC0832DODI腳
  
sbit rs=P1^0;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
sbit rw=P1^1;         //寄存器選擇信號 H:數(shù)據(jù)寄存器          L:指令寄存器
sbit e =P1^2;         //片選信號   下降沿觸發(fā)


/********************************************************************
* 名稱 : delay_uint()
* 功能 : 小延時。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void delay_uint(uint q)
{
        while(q--);
}

/********************************************************************
* 名稱 : write_com(uchar com)
* 功能 : 1602指令函數(shù)
* 輸入 : 輸入的指令值
* 輸出 : 無
***********************************************************************/
void write_com(uchar com)
{
         rs=0;             //寫指令
        rw=0;             //對1602寫操作
        P0=com;             //P0口對1602寫指令數(shù)據(jù)
        delay_uint(25);
        e=1;                 //e=1使能信號
        delay_uint(100);   //延時一下等1602完成操作
        e=0;
}

/********************************************************************
* 名稱 : write_data(uchar dat)
* 功能 : 1602寫數(shù)據(jù)函數(shù)
* 輸入 : 需要寫入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write_data(uchar dat)
{
         rs=1;             //寫數(shù)據(jù)
        rw=0;             //對1602寫操作
        P0=dat;                  //P0口對1602寫數(shù)據(jù)
        delay_uint(25);
        e=1;                 //e=1使能信號
        delay_uint(100);   //延時一下等1602完成操作
        e=0;        
}

/********************************************************************
* 名稱 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
                  write_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                write_com(0x80+add);           //1602寫第一行的地址
        else
                write_com(0x80+0x40+add);   //1602寫第二行的地址
        while(1)                                                                                                                 
        {
                if(*p == '\0')  break;        //\0字符串的結(jié)尾標志  break結(jié)束while循環(huán) 結(jié)束寫字符
                write_data(*p);            //寫數(shù)據(jù)
                p++;                    //指針地址加1  
        }        
}

/***********************lcd1602上顯示3位十進制數(shù)************************/
void write_lcd3_dy(uchar hang,uchar add,uint date)
{
        if(hang==1)   
                write_com(0x80+add);           //1602寫第一行的地址
        else
                write_com(0x80+0x40+add);  //1602寫第二行的地址
        write_data(0x30+date/100%10);  //顯示百位數(shù)
        write_data('.');                           //顯示小數(shù)點
        write_data(0x30+date/10%10);   //顯示十位數(shù)
        write_data(0x30+date%10);           //顯示個位數(shù)        
}

/***********************lcd1602初始化設置************************/
void init_1602()
{
        write_com(0x38);  //顯示模式設置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口 不檢測忙信號
        write_com(0x0c);  //開顯示 不顯示光標
        write_com(0x06);  //當寫一個字符是,地址指針加 1
        write_string(1,0,"     U=0.00V     ");           //初始化1602顯示
}

/***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù)*******************/        
//請先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來讀本函數(shù),主要是對應時序圖來理解,本函數(shù)是模擬0832的串行協(xié)議進行的
unsigned char ad0832read(bit SGL,bit ODD)
{
        unsigned char i=0,value=0;               
        CLK=0;
        DODI=1;
        CS=0;                //開始
        CLK=1;                //第一個上升沿        
        CLK=0;
        DODI=ODD;        //通道選擇
        CLK=1;          //第二個上升沿
        CLK=0;
        DODI=SGL;        //通道選擇
        for(i=0;i<8;i++)
        {
                CLK=1; //下降沿接收數(shù)據(jù)
                value<<=1;          //8位的數(shù)據(jù)高位在前
                CLK=0;
                if(DODI==1)          //如果DO為1  
                        value++;  //8位的數(shù)據(jù)低位置1                                                         
        }
        return value;          //返回0832采集到的數(shù)據(jù)
}

/****************主函數(shù)***************/
void main()
{        
        init_1602();                    //1602初始化
        while(1)
        {
                dianya = ad0832read(1,0);        //采集電壓
                dianya = dianya * 100 / 255 * 5 * 2 ;
                write_lcd3_dy(1,7,dianya);         //顯示電壓
        }
}

1.jpg (204.56 KB, 下載次數(shù): 80)

1.jpg

作者: zhxiufan    時間: 2022-11-6 08:39
上拉電阻排選錯了,應該選共9個引腳的那種,一個公共端接VCC,其余八個接P0口。
作者: 一一aaaa    時間: 2022-11-6 13:16
zhxiufan 發(fā)表于 2022-11-6 08:39
上拉電阻排選錯了,應該選共9個引腳的那種,一個公共端接VCC,其余八個接P0口。

對,這樣就可以了
作者: 一一aaaa    時間: 2022-11-6 13:17
zhxiufan 發(fā)表于 2022-11-6 08:39
上拉電阻排選錯了,應該選共9個引腳的那種,一個公共端接VCC,其余八個接P0口。

可以再幫忙看看程序嘛,測量電壓,一直都顯示0v,測不出來
作者: 大漠落日    時間: 2022-11-7 15:49
仿真文件發(fā)上來




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1