标题:
单片机可控电源Proteus仿真程序 电路涉及到A/D、D/A转换
[打印本页]
作者:
zjlei88
时间:
2020-2-14 15:24
标题:
单片机可控电源Proteus仿真程序 电路涉及到A/D、D/A转换
可控电源,电压可在1.25伏到9伏之间设定,电路涉及到A/D、D/A转换、矩阵键盘和LED显示。PROTEUS仿真图和代码见附件。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
键控稳压电源.png
(56.16 KB, 下载次数: 39)
下载附件
2020-2-14 15:19 上传
单片机源程序如下:
#include<reg51.h>
//#include<DAC0832.c>
//#include<ADC0832.c>
//#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
//#define DAC0832 XBYTE[0xfffe]
/************I/O口定义*********/
sbit CS=P2^3; //ADC0832的片选端
sbit CLK=P2^2; //时钟端
sbit DIO=P2^1; //数据输入输出端
sbit up=P2^7;
sbit down=P3^0;
sbit L1=P2^4;
sbit L2=P2^5;
sbit L3=P2^6;
sbit WR2=P2^0;
sbit LED1=P2^7;
sbit LED2=P3^7;
uint cdi=0,dy=0;
uchar key=12,flag=0,h=0,m=0,l=0;
uint ge,dian,xiao1,xiao2;
uchar code table[]={ //共阳数码管显示定义
0x03,0x9f,0x25,0x0d,
0x99,0x49,0x41,0x1f,
0x01,0x09};
void delay();
uint A_D();
void display();
void DAC();
void key_test();
void delay(uchar i) //i=1延迟1ms
{
uchar a,b,c;
for(c=i;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void vol_up()
{
cdi+=1;
DAC();
delay(1);
dy=A_D()*9/5;
ge=dy/51; // 计算整数部分
dian=(dy%51)*100/51; //计算小数部分
xiao1=dian/10; //取小数点后第一位
xiao2=dian%10; //去小数点后第二位
}
void vol_down()
{
cdi-=1;
DAC();
delay(1);
dy=A_D()*9/5;
ge=dy/51; // 计算整数部分
dian=(dy%51)*100/51; //计算小数部分
xiao1=dian/10; //取小数点后第一位
xiao2=dian%10; //去小数点后第二位
}
/*****
*函数名称: void dispaly1()
*输入参数: 共0个参数;
*输出参数: 共0个参数;
*返回值: 无;
*需储存的参数: 共0个参数;
*功能介绍: 显示电压值
*****/
void display()
{
if(flag==0)
{
P1=table[ge]&0xfe;
P1=table[ge]&0xfe; //显示整数位,与0x01是为了显示小数点
L1=1;
delay(1);
L1=0;
P1=table[xiao1]; //显示小数点后第一位
L2=1;
delay(1);
L2=0;
P1=table[xiao2]; //显示小数点后第二位,
L3=1;
delay(1);
L3=0;
}
else
{
P1=table[h]&0xfe;
P1=table[h]&0xfe; //显示整数位,与0x01是为了显示小数点
L1=1;
delay(1);
L1=0;
P1=table[m]; //显示小数点后第一位
L2=1;
delay(1);
L2=0;
P1=table[l]; //显示小数点后第二位,
L3=1;
delay(1);
L3=0;
}
}
/*****
*函数名称: uchar A_D()
*输入参数: 共0个参数;
*输出参数: 共0个参数;
*返回值: 有;
*需储存的参数: 共0个参数;
*功能介绍: 采集电压
*****/
uint A_D()
{
uint dat;
uchar i;
CS=1; //一个转换周期开始
CLK=0; //为第一个脉冲准备
CS=0; //CS置0,片选有效
DIO=1; //DIO置1,规定起始信号
CLK=1; //第一个脉冲
CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
DIO=1; //DIO置1,通道选择信号
CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入
//两位数据用于选择通道,这里选通道CH1
CLK=0; //第二个脉冲下降沿
DIO=1;//DI置1,选择通道1
CLK=1;//第三个脉冲
CLK=0;//第三个脉冲下降沿
DIO=1;//第三个脉冲下沉沿之后,输入端DIO失去作用,应置1
CLK=1;//第四个脉冲
for(i=0;i<8;i++) //高位在前,循环8次读出8位数据
{
CLK=1; //第四个脉冲
CLK=0;
dat<<=1; //将下面存储的低位数据右移
dat|=(uchar)DIO; //将输出数据DIO通过或运算存储在dat最低位
}
CS=1;//片选无效
return dat;
}
void DAC()
{
P0 = cdi;
WR2=0;
WR2=1;
}
/*****
*函数名称: void key_test()
*输入参数: 共0个参数;
*输出参数: 共0个参数;
*返回值: 无;
*需储存的参数: 共0个参数;
*功能介绍: 键盘扫描程序,采用行反转法对键盘进行扫描,确定键值
*****/
void key_test()
{
uchar temp=0;
delay(10); //去抖
if((P3&0x0f)!=0x0f)
{
temp=P3;
P3=0x70;
temp=temp|P3; //将行列值或即可得到每个键的编码
switch(temp)
{
case 0x3e:key=1;break; //1
case 0x5e:key=2;break; //2
case 0x6e:key=3;break; //3
case 0x3d:key=4;break; //4
case 0x5d:key=5;break; //5
case 0x6d:key=6;break; //6
case 0x3b:key=7;break; //7
case 0x5b:key=8;break; //8
case 0x6b:key=9;break; //9
case 0x37:key=10;break; //*
case 0x57:key=0;break; //0
case 0x67:key=11;break; //#
default:key=12;
}
while((P3&0x70)!=0x70); //判断松手检测
}
}
void main()
{
uint i=0;
uchar set_ok=0;
LED1=0;
DAC();
delay(1);
dy=A_D()*9/5;
ge=dy/51; // 计算整数部分
dian=(dy%51)*100/51; //计算小数部分
xiao1=dian/10; //取小数点后第一位
xiao2=dian%10; //去小数点后第二位
display();
while(1)
{
P3=0x0f;
if((P3&0x0f)!=0x0f)
{ key_test();
if(key==10) //设置键
{ LED1=1;
flag=1;
key=12;
}
else if(key==11) //确定键
{
flag=0;
LED1=0;
key=12;
set_ok=1;
}
else if(key!=12) //其他数字键
{
if(flag==1)
{
h=m;
m=l;
l=key;
key=12;
}
}
}
if(set_ok==1)
{
set_ok=0;
if(h>ge)
{
do
{vol_up();}
while(h>ge);
}
else if(h<ge)
{
do
{vol_down();}
while(h<ge);
}
if(m>xiao1)
{
do
{vol_up();}
while(m>xiao1);
}
else if(m<xiao1)
{
do
{vol_down();}
while(m<xiao1);
}
}
display();
}
}
复制代码
所有资料51hei提供下载:
可控电源.zip
(62.27 KB, 下载次数: 59)
2020-2-14 15:23 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1