久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1542|回復(fù): 0
收起左側(cè)

基于單片機(jī)TLC549+TLC5615的穩(wěn)壓電源仿真程序設(shè)計(jì)

[復(fù)制鏈接]
ID:268547 發(fā)表于 2024-3-6 16:36 | 顯示全部樓層 |閱讀模式
4 穩(wěn)壓電源設(shè)計(jì)
4.1 電路分析
穩(wěn)壓電路見(jiàn)圖4-1所示。三極管射極電壓是穩(wěn)壓電源的輸出電壓,可以接用電器或負(fù)載,這個(gè)電壓值通過(guò)TLC549(A/D,同TLC548)數(shù)據(jù)轉(zhuǎn)換后,送往單片機(jī)處理并顯示。調(diào)整按鍵可以改變輸入TLC5615(D/A,同TLC5616)的數(shù)據(jù)。TLC5615的輸出電壓通過(guò)運(yùn)算放大器與實(shí)際輸出取樣電壓比較,控制三極管的電壓輸出。穩(wěn)壓電路的電壓輸出接受單片機(jī)檢測(cè),同時(shí)又受單片機(jī)的控制。電路在仿真時(shí),各點(diǎn)的電壓都連接有電壓表顯示。
51hei.gif
圖 1 穩(wěn)壓電路
4.2 電路模塊
    一、A/D轉(zhuǎn)換部分
        TLC549 對(duì)輸出電壓進(jìn)行采集,其操作如下:  
(1)cs先為高電平。(cs為片選信號(hào),為1時(shí),輸入脈 i/o clock不起作用);
(2)clock = 0
(3)cs = 0; cs置底電平。 同時(shí)date_out為高。(=1);
      (4)延時(shí)1.4us。(setup time,cs low before first  clock);  
(5)開(kāi)始轉(zhuǎn)化數(shù)據(jù)。因?yàn)門(mén)LC549是8位串行模數(shù)轉(zhuǎn)換器。需將8 位數(shù)據(jù)依次串行輸出。期間,clock高低電平轉(zhuǎn)化一次;
(6)8次數(shù)據(jù)轉(zhuǎn)化之后。cs置1,片選無(wú)效。等待17us后讀出數(shù)據(jù)。
    二、D/A轉(zhuǎn)換部分
TLC5615為10位D/A轉(zhuǎn)換電路,其原理TLC5615的PDF文件。輸出電壓 = (轉(zhuǎn)
換數(shù)值/1024)*2*基準(zhǔn)電壓
    三、顯示
采用數(shù)碼管對(duì)A/D轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行顯示,因?yàn)門(mén)LC549 是8位A/D,程序中需要對(duì)轉(zhuǎn)化的數(shù)據(jù)進(jìn)行處理后才能在七段數(shù)碼管上動(dòng)態(tài)顯示。TLC549的檢測(cè)電壓值范圍為0~5V,A/D轉(zhuǎn)換后數(shù)據(jù)位0~255,應(yīng)該顯示0~5,并且包含小數(shù)點(diǎn)部分。
四、按鍵操作部分
四個(gè)獨(dú)立的按鍵主要是對(duì)DA 的輸入數(shù)據(jù)進(jìn)行操作的,ADD按鍵,SUB 按鍵 這些按鍵在安下一次松開(kāi)后便進(jìn)行加1 的操作,若按鍵超過(guò)一定的時(shí)間則增加步長(zhǎng),使其數(shù)值能夠快速增加,這樣就不必要達(dá)到一個(gè)電壓時(shí),一直按幾百次。SUB按鍵也是如此。至于那個(gè)預(yù)讀取按鍵,主要是用于保存你要常用的電壓值,這樣一來(lái)你就可以在使用此電源時(shí),不必要每次都要按鍵調(diào)整,可以通過(guò)讀取AT24C04的值進(jìn)行電壓預(yù)置,保存按鍵,是用于保存你長(zhǎng)使用的電壓值,通過(guò)此次的電壓值保存,使你可以快速達(dá)到你所要求的電壓值。
4.3 編程思路
    程序分為鍵盤(pán)處理、D/A、A/D和存儲(chǔ)四個(gè)模塊。運(yùn)用掃描法,對(duì)鍵盤(pán)進(jìn)行掃描,有按鍵就更改輸入TLC5615 的數(shù)值,ADD按鍵是對(duì)數(shù)據(jù)進(jìn)行加以操做,長(zhǎng)按的話使步進(jìn)值增大,實(shí)現(xiàn)快加,SUB按鍵與ADD按鍵同,預(yù)讀取按鍵用于讀取 AT24C04 中預(yù)置的數(shù)值,保存按鍵用于保存當(dāng)前電壓值;顯示部分主要是對(duì)TLC549采集回來(lái)的電壓進(jìn)行處理顯示,它主要是在定時(shí)器0的中斷服務(wù)程序中顯示,100ms刷新顯示一次;TLC5615 模塊,通過(guò)對(duì)dA的串行數(shù)據(jù)輸入,使其在輸出電壓時(shí)可控,輸出電壓后經(jīng)lm324,三極管,加上負(fù)載輸出電壓,輸出電壓后,用TLC549芯片100ms采集一次,送數(shù)碼管顯示。
4.5 程序清單
主函數(shù):
#include <REG51.H>
#include "intrins.h"
#include "AT24C04.h"

#define  uchar unsigned char
#define  uint unsigned int

uchar code  LED[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code Bit_sel[4] = {0x08,0x04,0x02,0x01 }; //各個(gè)數(shù)碼管對(duì)應(yīng)的位選數(shù)據(jù)

sbit DIO = P1^0;         //數(shù)據(jù)線
sbit CS = P1^1;             //片選
sbit CLK = P1^2;        //io口時(shí)鐘

sbit SCS = P1^4;
sbit SDATA = P1^5;
sbit SCLK = P1^3;

sbit ADD = P3^0;
sbit SUB = P3^1;
sbit Pre_read = P3^2;
sbit Store = P3^3;

uint qian,bai,shi,ge;  //用于顯示數(shù)碼管的 千,百,十,個(gè) 等四位的顯示
uint val,num;           //val 是用于輸入DA  的數(shù)據(jù),num是用于判斷是不是長(zhǎng)按的
uint cp;               //計(jì)數(shù)的變量
uchar key_stat;
uchar add_stat,sub_stat;
uchar st_flag,pre_flag;

void delay(uint x)         //微妙級(jí)是延時(shí)函數(shù)
{
    while(x--)
        _nop_();
}

/**********************************************
    函數(shù)名稱(chēng):deal
    函數(shù)作用:處理AD的返回值
    函數(shù)參數(shù):無(wú)
    函數(shù)返回值:無(wú)
**********************************************/                                               
void deal(uint num)      //顯示程序
{   
    qian=num/1000;          //千,百,十,個(gè)處理
    bai=num/100%10;
    shi=num/10%10;
    ge=num%10;
}

/**********************************************
    函數(shù)名稱(chēng):TL549_AD()
    函數(shù)作用:返回AD的返回值
    函數(shù)參數(shù):無(wú)
    函數(shù)返回值:data_ad
**********************************************/   
uint TL549_AD()            //TLC549處理
{
    uchar i;
    uint data_ad = 0;
    CS = 1;                //初始化,啟動(dòng)
    CLK = 0;
    CS = 0;
    _nop_();            
    for(i = 0;i < 8;i++)    //讀取采集數(shù)據(jù),讀取的是上一次采集數(shù)據(jù)
    {
        CLK = 1;     
        if(DIO)data_ad |= 0x01;
        CLK = 0;  
        data_ad = data_ad << 1;  
    }     
    CS = 1;
    data_ad = data_ad  * (500/ 256);   
    return(data_ad);
}

/**********************************************
    函數(shù)名稱(chēng):TLC5615_DA(uint da)
    函數(shù)作用:TLC5615_DA 將da轉(zhuǎn)換后模擬輸出
    函數(shù)參數(shù):da
    函數(shù)返回值:無(wú)
**********************************************/   
void TLC5615_DA(uint da) //    TLC5615 的DA 轉(zhuǎn)換函數(shù)
{
    uchar i;
    da<<=6;

    SCS=0;
    SCLK=0;

    for (i=0;i<12;i++)
    {
        SDATA=(bit)(da&0x8000);
        SCLK=1;
        da<<=1;
        SCLK=0;
    }

    SCS=1;
    SCLK=0;
    for (i=0;i<12;i++);
}
/**********************************************
    函數(shù)名稱(chēng):key_scan()
    函數(shù)作用:處理那些獨(dú)立鍵盤(pán)
    函數(shù)參數(shù):無(wú)
    函數(shù)返回值:無(wú)
**********************************************/   
void key_scan()
{
    if (ADD == 0)                           // ADD 按鍵的鍵盤(pán)處理函數(shù)
    {
        delay(10);
        if (ADD == 0)
        {
            add_stat = 1;
            num ++;
        }
        else
        {
            add_stat = 0;
            num = 0;
        }
        //此處判斷是不是長(zhǎng)按,長(zhǎng)按的話 使其步進(jìn)值 加大
        if (ADD == 0 && add_stat == 1 && num >= 300)  
        {
            val += 5;
            num = 0;
        }
        if (ADD == 1 && add_stat == 1)
        {
            val ++;
            num = 0;
            add_stat = 0;
        }
        if (val >= 1024)
        {
            val = 1023;
        }
    }

    if (SUB == 0)                            //SUB 按鍵的鍵盤(pán)處理函數(shù)
    {
        delay(10);
        if (SUB == 0)
        {
            sub_stat = 1;
            num ++;
        }
        if (SUB == 0 && sub_stat == 1 && num >= 300)
        {
            val -= 5;
            num = 0;
        }
        if (SUB == 1 && sub_stat == 1)
        {
            val --;
            num = 0;
            sub_stat = 0;
        }
        if (val <= 0)
            val = 0;
    }
                                    
    if (Pre_read == 0)                           //預(yù)讀數(shù)據(jù)的 鍵盤(pán)處理函數(shù)
    {
        delay(100);
        if (Pre_read == 0)
        {
            pre_flag = 1;
        }
        if (Pre_read == 1 &&pre_flag == 1 )
        {
            pre_flag = 0;
            val = read_24C04(20);            //從AT24C04中的地址20 中讀出預(yù)存儲(chǔ)的數(shù)據(jù)
        }
    }

    if (Store == 0)                        //保存數(shù)值 按鍵的鍵盤(pán)處理函數(shù)
    {
        delay(100);
        if (Store == 0)
        {
            st_flag = 1;
        }
        if (Store == 1 && st_flag == 1)
        {
            st_flag    = 0;
            write_24C04(20,val);         //向AT24C04中的地址20 寫(xiě)入存儲(chǔ)的數(shù)據(jù)
        }
    }
}
/**********************************************
    函數(shù)名稱(chēng):timer0_init (void)
    函數(shù)作用:初始化定時(shí)器0,并設(shè)置
    函數(shù)參數(shù):無(wú)
    函數(shù)返回值:無(wú)
**********************************************/   
void timer0_init (void)                    // timer0中斷初始化函數(shù)
{
    EA = 0;                     
    TMOD = 0x01;            
    TR0 = 0;                     
    TL0 = (65536-5000)%256;         //設(shè)置計(jì)數(shù)器初值
    TH0 = (65536-5000)/256;                  
    PT0 = 1;                     
    ET0 = 1;                     
    EA = 1;                     
    TR0 = 1;                     
}
/**********************************************
    函數(shù)名稱(chēng):main(void)
    函數(shù)作用:main主函數(shù)入口
    函數(shù)參數(shù):無(wú)
    函數(shù)返回值:無(wú)
**********************************************/                           
void main(void)                 //主程序
{  
    timer0_init();            //初始化定時(shí)器0
    init_24C04();            //初始化AT24C04
    while(1)
    {
        key_scan();            //調(diào)用鍵盤(pán)掃描函數(shù)
        TLC5615_DA(val);    //處理鍵盤(pán)發(fā)送過(guò)來(lái)的值
    }
}

/**********************************************
    函數(shù)名稱(chēng):timer0_isr(void)  interrupt 1
    函數(shù)作用:定時(shí)器0,方式1,的中斷服務(wù)子程序
    函數(shù)參數(shù):無(wú)
    函數(shù)返回值:無(wú)
**********************************************/   
void timer0_isr(void)  interrupt 1           // timer0中斷服務(wù)函數(shù)
{
                                             //數(shù)碼管的位選變量
    TR0 = 0;                                    //停止計(jì)數(shù)
    TL0 = (65536-5000)%256;                    //重新載入計(jì)數(shù)器初值
    TH0 = (65536-5000)/256;
    cp++;                                    //位循環(huán)變量加1
    if(cp >= 4)
        cp = 0;
    deal(TL549_AD());                       //循環(huán)顯示1次,j清零
       TR0 = 1;

    P0=0xff;  //與j對(duì)應(yīng),P2輸出數(shù)碼管的位選信號(hào)
    switch(cp)
    {
        case 0: P0 = LED[ge]; break;      
        case 1: P0 = LED[shi]; break;      
        case 2: P0 = LED[bai]&0x7f; break;
        case 3: P0 = LED[qian]; break;      
    }
    P2 = Bit_sel[cp];
}  
AT24C04 的驅(qū)動(dòng):
    #ifndef AT24C04_10_04_07

sbit ATCLK=P1^6;
sbit SDA=P1^7;


sbit a7=ACC^7;
sbit a6=ACC^6;
sbit a5=ACC^5;
sbit a4=ACC^4;
sbit a3=ACC^3;
sbit a2=ACC^2;
sbit a1=ACC^1;
sbit a0=ACC^0;
/*********************
*******24C04的初始化**
**** **************/
void init_24C04()
{
    SDA=1;
    _nop_();
    ATCLK=1;
    _nop_();
}
/*********************
****啟動(dòng)24C04*********
*******************/
void start_24C04()
{

    SDA=1;
    _nop_();
    ATCLK=1;
    _nop_();

    SDA=0;
    _nop_();
    ATCLK=0;
    _nop_();
}
/********************
*****停止24C04*******
*********************/
void stop_24C04()
{
    SDA=0;
    _nop_();

    ATCLK=1;
    _nop_();
    SDA=1;
    _nop_();

}
/*********************
****24C04應(yīng)答*********
*******************/
void response()
{
    unsigned char i;
    ATCLK=1;
    _nop_();
    while((SDA==1)&&(i<250))i++;
    ATCLK=0;
    _nop_();   
}
/********************
*****讀取24C04一個(gè)字節(jié)**
**************************/
unsigned char read_byte()
{
    SDA=1;
    ATCLK=1;a7=SDA;ATCLK=0;
    ATCLK=1;a6=SDA;ATCLK=0;
    ATCLK=1;a5=SDA;ATCLK=0;
    ATCLK=1;a4=SDA;ATCLK=0;
    ATCLK=1;a3=SDA;ATCLK=0;
    ATCLK=1;a2=SDA;ATCLK=0;
    ATCLK=1;a1=SDA;ATCLK=0;
    ATCLK=1;a0=SDA;ATCLK=0;
    SDA=1;
    ATCLK=0;
    return ACC;
}
/*************************
**寫(xiě)入24C04一個(gè)字節(jié)******
*************************/
void write_byte(unsigned char addr)
{
    ACC=addr;
    SDA=a7;ATCLK=1;ATCLK=0;
    SDA=a6;ATCLK=1;ATCLK=0;
    SDA=a5;ATCLK=1;ATCLK=0;
    SDA=a4;ATCLK=1;ATCLK=0;
    SDA=a3;ATCLK=1;ATCLK=0;
    SDA=a2;ATCLK=1;ATCLK=0;
    SDA=a1;ATCLK=1;ATCLK=0;
    SDA=a0;ATCLK=1;ATCLK=0;
    SDA=1;
    ATCLK=0;

}
/***********************
**寫(xiě)24C04的數(shù)據(jù)*******
*****************/
void write_24C04(unsigned char addr,unsigned char dat)
{
    start_24C04();
    write_byte(0xa0);
    response();
    write_byte(addr);
    response();
    write_byte(dat);
    response();
    stop_24C04();
}
/**********************
***讀24C04的數(shù)據(jù)*******
*****************/
unsigned char read_24C04(unsigned char addr)
{
    unsigned char t;
    start_24C04();
    write_byte(0xa0);
    response();
    write_byte(addr);
    response();
    start_24C04();
    write_byte(0xa1);
    response();
    t=read_byte();
    stop_24C04();
    return t;
}
#endif

仿真程序下載(注意仿真文件是Proteus7.8版本的dsn文件,請(qǐng)勿用高版本的打開(kāi)): 基于單片機(jī)的穩(wěn)壓電源設(shè)計(jì).7z (75.3 KB, 下載次數(shù): 24)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产18久久久久久二百 | 超碰在线97国产 | 国产精品大片 | 久久久成人精品 | 欧美日韩在线综合 | 日本中文字幕在线视频 | 自拍视频网站 | 国产精品一区二区久久久久 | 国产a区| 久久高清| 成人免费视频观看视频 | 国产一区亚洲 | 国产精彩视频在线观看 | 久久久久久亚洲精品 | 99精品网 | 一区二区三区四区电影 | 91av视频 | www.日韩系列 | 国产精品视频一区二区三区四区国 | a级大片免费观看 | 免费在线看a | 久色一区 | 国产女人与拘做受免费视频 | 国产精品亚洲欧美日韩一区在线 | 成年人在线观看视频 | 碰碰视频| 日韩中文字幕第一页 | 日韩成人免费 | 午夜精| 亚洲一区视频在线 | 中文一级片 | 国产欧美日韩精品一区 | 国产精品1区2区3区 一区中文字幕 | 欧美一级免费看 | 久草.com | 91大神新作在线观看 | 视频在线观看一区二区 | www.欧美视频 | 欧美一区二区三区视频 | 91国语清晰打电话对白 | 中文字幕av在线一二三区 |