电子实训作业一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AT89S52单片机电源设计
一:设计要求
(1)输出电压:范围0~+9.9V,精度0.01V;
(2)输出电流:0~1A;精度1mA;
(3)输出电压、电流值及设置的输出电压、电流
值可视;
(4)输出电压、电流的增减可通过面板进行
设置;
(5)过流过压保护作用。
二:系统设计
采用AT89S52单片机作为整机的控制单元,经过整流滤波后,一路电压经过7805稳压得到一个+5v电压,该电压作为单片机的工作电源,另外一路电压直接作为开关变换电路的输入电压。单片机根据键盘输入值和取样值之间的差值,修改脉冲占空比,并输出控制功率开关管,以便得到期望的输出电压值,并根据模/数转换器所采样的电压和键盘输入比较,根据差值调用PID算法再次修改脉宽使输出电压稳定。通过ADC0832进行模数转换,间接用单片机实时对电压进行采样,然后进行数据处理及显示。此系统比较灵活,采用软件方法来解决数据的预置以及电压的步进控制,使系统硬件更加简洁,各类功能易于实现,能很好地满足题目的要求。
三:单元电路的设计
1.稳压直流
基于LM7805CT三端稳压器,输出直流+5V给单片机、A/D转换提供工作电压。
2.采样电路
①电流采样:靠近接地端为1k欧姆。
②电压采样
3.A/D转换电路
4.显示电路
四:原理图
五:程序设计
1.软件流程
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit cs=P3^0;//对ADC0832进行位定义
sbit DI=P3^2;
sbit DO=P3^2;
sbit clk=P3^1;
uchar readad[2];
void adc0832(unsigned char channel);
void adc0832(uchar channel)//对0832的操作:首先进行传输数据前的定义,严格按照时序,
{ // 其次开始传数据,如果达到了8位,从新开始传
uchar i=0; //最后开始收数据,不管是传数据还是收数据,都要有一个完整的时钟脉冲
uchar j;//对数据值的定义 //数据每次只能传输一位
uint dat=0; //传数据是从最高位开始将寄存器的数据发送完,接着从低位开始发,比较2次发送的数据是否一样
uchar ndat=0; //如果一样则接收如果不一样则淘汰
if(channel==0)channel=2;
if(channel==1)channel=3;
DI=1;
_nop_();
_nop_();
cs=0;//拉低cs端
_nop_();
_nop_();
clk=1; //拉高clk
_nop_();
_nop_();
clk=0; //拉低clk形成下降沿1 _nop_();
_nop_();
clk=1;
DI=channel&0x1;
_nop_();
_nop_();
clk=0; //形成下降沿2
_nop_();
_nop_();
clk=1;
DI=(channel>>1)&0x1;
_nop_();
_nop_();
clk=0; //形成下降沿3
DI=1; //控制指令结束
_nop_();
_nop_();
dat=0; //将dat初始化
for(i=0;i<8;i++) //从高位开始发数据
{
dat|=DO;//接收数据
clk=1;
_nop_();
_nop_();
clk=0;
_nop_();
_nop_();//形成一次时钟脉冲,数据传一位
dat<<=1;//将所收到的数据进行左移一位
if(dat==7) //如果所收到的数据达到了8位。
dat|=DO;//接着收数据
}
for(i=0;i<8;i++) //从低位开始发数据
{
j=0;
j=j|DO;//或者是j|=DO....开始收数据
clk=1;
_nop_();
_nop_();
clk=0; //形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(j<7)
ndat>>=1;//得到的这位数据向左移7位
}
cs=1;
clk=0;
DO=1; //回到初始状态
readad[0]=dat;
readad[1]=ndat;
}
#include #define REG0 XBYTE[0x0000]//通过宏定义将液晶的初始化设置,写指令,写数据
#define REG1 XBYTE[0x0001]//读指令,读数据代替,可以直接调用#define REG2 XBYTE[0x0002]
#define REG3 XBYTE[0x0003] uchar bdata busyflag;
uchar dat,datn,count;
uchar word1[16]={"CH="};
code uchar word2[16]={"liushuai"};
code uchar word3[16]={"19901001"};
sbit busyflag_7=busyflag^7; //液晶的初始化//
void busy()
{ do
{
busyflag=REG1;
}while(busyflag_7);
}
void wrc( uchar wcon)
{
busy();//检测液晶是否处于工作状态
REG0=wcon; //写指令
}