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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

一個簡單的單片機直流可調穩壓電源設計

作者:huqin   來源:本站原創   點擊數:  更新時間:2013年12月16日   【字體:

通過做直流穩壓電源可以掌握A/D,D/A模塊的使用,51單片機程序分為鍵盤處理、D/A、A/D和存儲四個模塊。運用掃描法,對鍵盤進行掃描,有按鍵就更改輸入TLC5615 的數值,ADD按鍵是對數據進行加以操做,長按的話使步進值增大,實現快加,SUB按鍵與ADD按鍵同,預讀取按鍵用于讀取。粒裕玻矗茫埃础≈蓄A置的數值,保存按鍵用于保存當前電壓值;顯示部分主要是對TLC549采集回來的電壓進行處理顯示,它主要是在定時器0的中斷服務程序中顯示,100ms刷新顯示一次;TLC5615 模塊,通過對dA的串行數據輸入,使其在輸出電壓時可控,輸出電壓后經lm324,三極管,加上負載輸出電壓,輸出電壓后,用TLC549芯片100ms采集一次,送數碼管顯示。


完整的工程文件及hex文件下載地址:http://m.zg4o1577.cn/f/dpjdianyuan_c.rar

AT24C04.h 代碼

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_();
}
/*********************
****啟動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應答*********
*******************/
void response()
{
unsigned char i;
ATCLK=1;
_nop_();
while((SDA==1)&&(i<250))i++;
ATCLK=0;
_nop_();
}
/********************
*****讀取24C04一個字節**
**************************/
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;
}
/*************************
**寫入24C04一個字節******
*************************/
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;

}
/***********************
**寫24C04的數據*******
*****************/
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的數據*******
*****************/
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;
}

main.c 代碼
#include"reg52.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 }; //各個數碼管對應的位選數據

sbit DIO = P1^0; //數據線
sbit CS = P1^1; //片選
sbit CLK = P1^2; //io口時鐘

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; //用于顯示數碼管的 千,百,十,個 等四位的顯示
uint val,num; //val 是用于輸入DA 的數據,num是用于判斷是不是長按的
uint cp; //計數的變量
uchar key_stat;
uchar add_stat,sub_stat;
uchar st_flag,pre_flag;

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

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

/**********************************************
函數名稱:TL549_AD()
函數作用:返回AD的返回值
函數參數:無
函數返回值:data_ad
**********************************************/
uint TL549_AD() //TLC549處理
{
uchar i;
uint data_ad = 0;
CS = 1; //初始化,啟動
CLK = 0;
CS = 0;
_nop_();
for(i = 0;i < 8;i++) //讀取采集數據,讀取的是上一次采集數據
{
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);
}

/**********************************************
函數名稱:TLC5615_DA(uint da)
函數作用:TLC5615_DA 將da轉換后模擬輸出
函數參數:da
函數返回值:無
**********************************************/
void TLC5615_DA(uint da) // TLC5615 的DA 轉換函數
{
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++);
}

/**********************************************
函數名稱:key_scan()
函數作用:處理那些獨立鍵盤
函數參數:無
函數返回值:無
**********************************************/
void key_scan()
{
if (ADD == 0) // ADD 按鍵的鍵盤處理函數
{
delay(10);
if (ADD == 0)
{
add_stat = 1;
num ++;
}
else
{
add_stat = 0;
num = 0;
}
//此處判斷是不是長按,長按的話 使其步進值 加大
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 按鍵的鍵盤處理函數
{
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) //預讀數據的 鍵盤處理函數
{
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 中讀出預存儲的數據
}
}

if (Store == 0) //保存數值 按鍵的鍵盤處理函數
{
delay(100);
if (Store == 0)
{
st_flag = 1;
}
if (Store == 1 && st_flag == 1)
{
st_flag = 0;
write_24C04(20,val); //向AT24C04中的地址20 寫入存儲的數據
}
}
}
/**********************************************
函數名稱:timer0_init (void)
函數作用:初始化定時器0,并設置
函數參數:無
函數返回值:無
**********************************************/
void timer0_init (void) // timer0中斷初始化函數
{
EA = 0;
TMOD = 0x01;
TR0 = 0;
TL0 = (65536-5000)%256; //設置計數器初值
TH0 = (65536-5000)/256;
PT0 = 1;
ET0 = 1;
EA = 1;
TR0 = 1;
}
/**********************************************
函數名稱:main(void)
函數作用:main主函數入口
函數參數:無
函數返回值:無
**********************************************/
void main(void) //主程序
{
timer0_init(); //初始化定時器0
init_24C04(); //初始化AT24C04
while(1)
{
key_scan(); //調用鍵盤掃描函數
TLC5615_DA(val); //處理鍵盤發送過來的值
}
}

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

P0=0xff; //與j對應,P2輸出數碼管的位選信號
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];
}
 

關閉窗口

相關文章

主站蜘蛛池模板: 天堂久久av| 欧美性生活一区二区三区 | 国产不卡一区 | 性国产xxxx乳高跟 | 视频一区 国产精品 | 久久久久久久一区 | 亚洲视频免费在线 | 色综合99 | 成人无遮挡毛片免费看 | 日本精品在线一区 | 午夜一区二区三区在线观看 | 中文字幕欧美一区二区 | 亚洲精品女人久久久 | 国产精品久久久久av | 色在线免费视频 | 一区二区三区国产视频 | 国产日韩欧美 | 国产精品久久久久久久免费大片 | chinese中国真实乱对白 | 国产成人亚洲精品 | 欧美日韩电影一区 | 亚洲国产一区二区三区在线观看 | 四虎影院在线观看免费视频 | 国产一区在线免费观看视频 | 亚洲人成免费 | 国内精品久久久久久久影视简单 | 午夜影院在线观看免费 | 91精品国产乱码久久久久久久久 | 亚洲成人中文字幕 | 成人福利在线 | 精品免费视频一区二区 | 久久亚洲一区 | 99爱在线免费观看 | 日日夜夜精品视频 | 亚洲成人免费观看 | av电影一区| 在线观看亚洲一区二区 | 有码一区 | 日日操夜夜操天天操 | 成人亚洲性情网站www在线观看 | 在线免费看黄 |