新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一個(gè)簡單的單片機(jī)直流可調(diào)穩(wěn)壓電源設(shè)計(jì)

一個(gè)簡單的單片機(jī)直流可調(diào)穩(wěn)壓電源設(shè)計(jì)

作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏

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 }; //各個(gè)數(shù)碼管對應(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是用于判斷是不是長按的
uint cp; //計(jì)數(shù)的變量
uchar key_stat;
ucharadd_stat,sub_stat;
uchar st_flag,pre_flag;

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

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

/**********************************************
函數(shù)名稱:TL549_AD()
函數(shù)作用:返回AD的返回值
函數(shù)參數(shù):無
函數(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ù)名稱:TLC5615_DA(uint da)
函數(shù)作用:TLC5615_DA 將da轉(zhuǎn)換后模擬輸出
函數(shù)參數(shù):da
函數(shù)返回值:無
**********************************************/
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ù)名稱:key_scan()
函數(shù)作用:處理那些獨(dú)立鍵盤
函數(shù)參數(shù):無
函數(shù)返回值:無
**********************************************/
void key_scan()
{
if (ADD == 0) // ADD 按鍵的鍵盤處理函數(shù)
{
delay(10);
if (ADD == 0)
{
add_stat = 1;
num ++;
}
else
{
add_stat = 0;
num = 0;
}
//此處判斷是不是長按,長按的話 使其步進(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 按鍵的鍵盤處理函數(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ù)的 鍵盤處理函數(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ù)值 按鍵的鍵盤處理函數(shù)
{
delay(100);
if (Store == 0)
{
st_flag = 1;
}
if (Store == 1 && st_flag == 1)
{
st_flag = 0;
write_24C04(20,val); //向AT24C04中的地址20 寫入存儲(chǔ)的數(shù)據(jù)
}
}
}
/**********************************************
函數(shù)名稱:timer0_init (void)
函數(shù)作用:初始化定時(shí)器0,并設(shè)置
函數(shù)參數(shù):無
函數(shù)返回值:無
**********************************************/
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ù)名稱:main(void)
函數(shù)作用:main主函數(shù)入口
函數(shù)參數(shù):無
函數(shù)返回值:無
**********************************************/
void main(void) //主程序
{
timer0_init(); //初始化定時(shí)器0
init_24C04(); //初始化AT24C04
while(1)
{
key_scan(); //調(diào)用鍵盤掃描函數(shù)
TLC5615_DA(val); //處理鍵盤發(fā)送過來的值
}
}

/**********************************************
函數(shù)名稱:timer0_isr(void) interrupt 1
函數(shù)作用:定時(shí)器0,方式1,的中斷服務(wù)子程序
函數(shù)參數(shù):無
函數(shù)返回值:無
**********************************************/
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對應(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];
}


上一頁 1 2 下一頁

評論


技術(shù)專區(qū)

關(guān)閉