电子实训作业一

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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; //写指令

}

相关文档
最新文档