欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 求助這個程序和仿真有什么錯誤,運行一會會后會報錯還有顯示有問題 [打印本頁]

作者: 22488    時間: 2020-7-9 17:10
標題: 求助這個程序和仿真有什么錯誤,運行一會會后會報錯還有顯示有問題
1.可控電源設計液晶屏能正常顯示功能實現
2.正確顯示電壓值、 DA能準確輸出對應電壓
3.能連續可調節0-12V的電壓并正常顯示
#include"reg52.h"                //包含頭文件

//宏定義
#define uchar unsigned char
#define uint unsigned int

//按鍵定義
sbit KEY1=P2^0;
sbit KEY2=P2^1;
sbit KEY3=P2^2;
sbit KEY4=P2^3;

//液晶控制引腳定義
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;

//DAC定義
sbit CS_5615=P1^5;          //定義選片信號IO口
sbit CLK_5615=P1^6;         //定義時鐘信號IO口
sbit DAT_5615=P1^7;         //定義數據輸入IO口

//ADC定義
sbit CS=P3^5;  //定義選片信號IO口
sbit CLK=P3^3; //定義時鐘信號IO口
sbit DIO=P3^4; //定義數據輸入IO口

//報警指示燈定義
sbit led=P3^1;

uint U;
uchar GETU=0;
bit flag=0;
uint a=0;

unsigned char Int,Dec;  //分別儲存轉換后的整數部分與小數部分
uchar code tab1[]={"Welcome to use  "};  //固定字符
uchar code tab2[]={"adj power supply"};  //固定字符
uchar code tab3[]={"Voltage:     . v"};  //固定字符
uchar code tab4[]={"                "};  //固定字符
uchar code tab5[]={"Short circuit!!!"};  //固定字符
uchar code tab6[]={"Please restart!!"};  //固定字符
//延時函數
void delay(uint xms)  //延時函數,有參函數
{
    uint x,y;
    for(x=xms;x>0;x--)
     for(y=121;y>0;y--);
}

//液晶寫入指令函數
void write_1602com(uchar com)
{
    RS=0;  //數據/指令選擇置為指令
    RW=0;  //讀寫選擇置為寫
    P0=com;  //送入數據
    delay(1);
    EN=1;  //拉高使能端,為制造有效的下降沿做準備
    delay(1);
    EN=0;  //en由高變低,產生下降沿,液品執行命令
}

//液晶寫入數據函數
void write_1602dat(uchar dat)
{
    RS=1;  //數據/指令選擇置為數據
    RW=0;  //讀寫選擇置為寫
    P0=dat;  //送入數據
    delay(1);
    EN=1;  //en置高電平,為制造下降沿做準備
    delay(1);
    EN=0;  //en由高變低,產生下降沿,液晶執行命令
}

//液晶初始化函數
void lcd_init()
{
    uchar p;
    write_1602com(0x38);  //設置液晶工作模式,意思: 16*2行顯示,5*7點陣,8位數據
    write_1602com(0x0c);  //開顯示不顯示光標
    write_1602com(0x06);  //整屏不移動,光標自動右移
    write_1602com(0x01);  //清顯示
        write_1602com(0x80);  //日歷顯示固定符號從第一行第1個位置之后開始顯示
    for(p=0;p<16;p++)
    {
            write_1602dat(tab1[p]);  //向液晶屏寫日歷顯示的固定符號部分
    }
        write_1602com(0xc0);  //時間顯示固定符號寫入位置,從第2個位置后開始顯示
    for(p=0;p<16;p++)
        {
            write_1602dat(tab2[p]);  //寫顯示時間固定符號,兩個冒號
    }
    delay(1000);
    write_1602com(0x80);  //日歷顯示固定符號從第一行第1個位置之后開始顯示
    for(p=0;p<16;p++)
    {
        write_1602dat(tab3[p]);  //向液晶屏寫日歷顯示的固定符號部分
    }
        write_1602com(0xc0);  //時間顯示固定符號寫入位置,從第2個位置后開始顯示
    for(p=0;p<16;p++)
    {
        write_1602dat(tab4[p]);  //寫顯示時間固定符號,兩個冒號
    }
}

//液晶顯示函數
void shuma(uint buf)
{
    uchar a,b,c,d,p;
    a=buf/1000;        //十位
    b=buf%1000/100; //個位
    c=buf%100/10;  //小數點后一位
        d=buf%10;  //小數點后兩位
    if(flag==0)
    {
        write_1602com(0x80+11);
        write_1602dat(a+0x30);
                write_1602dat(b+0x30);
        write_1602dat('.');
        write_1602dat(c+0x30);
    }
        if(flag==1)        //短路提示
        {
                    write_1602com(0x80);         //時間顯示固定符號寫入位置,從第二個位置后開始顯示
                 for(p=0;p<16;p++)
                 {
                    write_1602dat(tab5[p]); //寫入時間固定符號,兩個冒號
                 }
                    write_1602com(0xc0);         //時間顯示固定符號寫入位置,從第二個位置后開始顯示
                 for(p=0;p<16;p++)
                 {
                    write_1602dat(tab6[p]); //寫入時間固定符號,兩個冒號
                 }
        }
}

//DAC5615驅動函數
void tlc_5615(uint buf)          //DA輸出
{
    uint a,c;         //定義變量
    c=buf;                 //要輸出的數據賦值
    CS_5615=0;         //引腳拉低
    for(a=16;a>0;a--)         //循環16次
    {
        DAT_5615=c>>15;         //把數據串行口輸入da芯片
        c=c<<1; //將數據左移一位,下次循環時就是傳輸第二位數據了
        CLK_5615=1;                //拉高
        CLK_5615=0;                //拉低
    }
    CLK_5615=1;
    CLK_5615=0;
    CLK_5615=1;
    CLK_5615=0;
    CS_5615=1;
}

//ADC驅動函數
unsigned int A_D()
{
    unsigned char i, dat;
    CS=1;  //一個轉換周期開始
    CLK=0;  //為第一個脈沖作準備
    CS=0;  //CS置0,片選有效

        DIO=1;  //DI0置1,規定的起始信號
    CLK=1;  //第一個脈沖
    CLK=0;  //第一個脈沖的下降沿,此前DIO必須是高電平
    DIO=1;  //DI0置1,通道選擇信號
    CLK=1;  //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選擇通道1
    CLK=0;  //第二個脈沖下降沿
    DIO=0;  //DI置0,選擇通道0
    CLK=1;  //第三個脈沖
    CLK=0;  //第三個脈沖下降沿
        DIO=1;  //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
    CLK=1;        //第四個脈沖
        for(i=0;i<8;i++)  //高位在前
    {
        CLK=1;  //第四個詠沖
        CLK=0;
        dat<<=1;  //將下面儲存的低位數據向右移
        dat|=(unsigned char)DIO;  //將輸出數據DIO通過或運算儲存在dat最低位
    }
    CS=1;  //片選無效
    return dat;  //將讀出的數據返回
}

//主函數
void main(void)
{
    U=0;   //電壓值顯示0
        lcd_init();
        while(1)  //進入循環
        {
            tlc_5615(U);  //輸出電壓值
                shuma(U/8*10);  //顯示電壓值
                if(flag==0)           //沒有短路
                {
                  if(KEY1==0)        //按鍵1按下
                 {
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);//此處調用顯示函數就是延時去抖的作用
                        if(KEY1==0)         //再次判斷按鍵1按下
                        {
                            if(U<960) //1V 對應的是80 10位ad
                                U=U+8;          //電壓加0.1V
                        }
                }
                if(KEY2==0)           //按鍵2按下
                {
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                        if(KEY2==0)
                        {
                            if(U>=8) //電壓減
                                U=U-8;
                        }
                }       
                if(KEY3==0)          //按鍵3按下
                {
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                        if(KEY3==0)
                        {
                                U=528;        //輸出6.6V電壓
                        }
                }
                if(KEY4==0)         //按鍵4按下
                {
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                   shuma(U/8*10);
                   if(KEY4==0)
                   {
                     U=0;           //關閉輸出
                         }
                }
        }
                GETU=A_D();                //讀取ad數據
                if(GETU>=12)  //0.0196V,采樣電阻采集到的電壓數據
                {
                   U=0;           //關閉輸出
                   led=0;
                   a=0;
                   flag=1; //短路標志位
                 }               
        }
}

1.png (71.83 KB, 下載次數: 74)

1.png

0.png (4.41 KB, 下載次數: 96)

0.png

可控電源.zip

115.61 KB, 下載次數: 4






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