本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页
最热资讯


描述:Proteus仿真图+源程序
数控稳压电源设计报告
班级:电信10-1班 学号:3100718116 姓名:罗远锋
此次数控稳压电源设计我主要通过51单片机控制输出来控制电源的电压和显示。主流程图如下。
主要输出部分
加减置数部分,通过对4X4矩阵键盘的设置,可任意置数,加减, 自动步进,输出波形。
预置数部分 通过拨码开关来预置。
显示部分 通过单片机对两位数码管进行动态扫描
#include<regx51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
uchar aa,bb,cc,dd,jj,ii,jjj,iii,key,j;
uchar time1=0;
sbit led1=P2^0;
sbit led2=P2^1;
sbit ce=P2^4;
#define timer0_count 0xfc18//定时器初值,设置time0 1/1000秒中断一次
const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的显示
const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小数点的数码管显示
uchar scan1;//用来分别显示2个数码管
uchar scan2;
uchar counter[2]={0xf1,0xf2};
uchar vout=0; //j_片选,vout_电压输出
static void timer0_initialize(void)//timer0的初始化
//定时器的初始化程序
{
EA=0;//中断控制器IE--停止接受中断
TR0=0; //停止计时
TMOD=0x01; //设置工作方式为1
TL0=(timer0_count & 0x00ff);
TH0=(timer0_count>>8); //设置time0 初值
PT0=1; //设置timer0高优先级
ET0=1; //允许timer0中断
TR0=1; //开始计时
EA=1; //开所有中断
}
void delay(uint t) //tms的延时
{
uchar i;
uint j;
for(j=0;j<t;j++)
for(i=0;i<40;i++);
}
void shuc(void)
{
uchar nn;
vout=2*(scan2*10+scan1);//输出的数字量
P1=vout;
for(nn=0;nn<250;nn++)
;
nn=0;//输出是存在D/A转换时间差所以要延时
}
void shaom(void)
{
P3=0x0f;//扫描是否有按键按下
if((P3&0x0f)!=0x0f)
dd=0;
else
dd=1;
}
void zdbj(void) //自动步进
{
uchar rr;
jj=scan2;
ii=scan1;
shaom();
for(;jj<10;jj++)
{
for(;ii<10;ii++)
{
if(dd)
{
scan1=ii;
scan2=jj;
shuc();
for(rr=0;rr<250;rr++)
{
shaom();
if(dd)
delay(70);
else
break;
}
if(jj==9&&ii==9)
{
ii=0;
jj=0;
}
}
else
{
jj=10;
ii=10;
}
}
ii=0;
}
jj=0;
shaom();
for(;dd==0;)
shaom();
}
void sjb(void)//三角波
{
uchar max;
max=vout;
shaom();
for(;dd;)
{
for(iii=0;iii<=max;iii=iii+2)
{
P1=iii;
shaom();
delay(7);
if(dd==0)
break;
}
if(dd==0)
break;
for(;iii>0;iii=iii-2)
{
P1=iii;
shaom();
delay(10);
if(dd==0)
break;
}
if(dd==0)
break;
}
P1=max;
shaom();
for(;dd==0;)
shaom();
}
unsigned char keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(70); //去抖
if((P3&0x0f)!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值 ;;
while((P3&0xf0)!=0xf0);//等待松开并输出
{
time1=time1+1;
return(cord_h+cord_l);//键盘最后组合码值
}
}
}return(0); //返回该值
}
void timer0_isr(void) interrupt 1 //timer0中断
//用于LED数码管的动态显示
{
TR0=0; //停止时钟0
P2=counter[j];
switch(j)
{
case 0:P0=seg[scan1];break;
case 1:P0=seg_point[scan2];break;
default:break;//j为其他情况是跳出循环
}
j++;
if(j==2)
j=0;
TL0=(timer0_count & 0x00ff);
TH0=(timer0_count>>8); //设置time0 初值
TR0=1; //开时钟
}
void main(void)
{
ce=0;
delay(5);
scan1=(P3/2)%10;
scan2=P3/20;
ce=1;
delay(5);
shuc();
timer0_initialize();//定时器初始化用于LED显示
do
{
key=keyscan();
if(time1==1)
switch( key)
{
case 0xee:aa=1;break;//1 按下相应的键显示相对应的码值
case 0xed:aa=2;break;
case 0xeb:aa=3;break;
case 0xe7:aa=4;break;//4
case 0xde:aa=5;break;//5
case 0xdd:aa=6;break;//5
case 0xdb:aa=7;break;//6
case 0xd7:aa=8;break;//7
case 0xbe:aa=9;break;//8
case 0xbd:aa=0;break;//9
case 0xbb:time1--;break;//确认
case 0xb7: //三角波
{
time1=0;
sjb();
}
break;
case 0x7e://加
{
time1=0;
scan1++;
if(scan1==10)
{
scan1=0;
scan2++;
if(scan2==10)
scan2=0;
}
shuc();
}break;//c
case 0x7d://减
{
time1=0;
scan1--;
if(scan1==-1)
{
scan1=9;
scan2--;
if(scan2==-1)
scan2=9;
}
shuc();
}break;
case 0x7b://自动步进
{
time1=0;
zdbj();
}break;//e
case 0x77: time1--;break;
}
if(time1==2)
switch( key)
{
case 0xee:bb=1;break;//0 按下相应的键显示相对应的码值
case 0xed:bb=2;break;//1
case 0xeb:bb=3;break;//2
case 0xe7:bb=4;break;//3
case 0xde:bb=5;break;//4
case 0xdd:bb=6;break;//5
case 0xdb:bb=7;break;//6
case 0xd7:bb=8;break;//7
case 0xbe:bb=9;break;//8
case 0xbd:bb=0;break;//9
case 0xbb://确认
{
scan2=0;
scan1=aa;
time1=0;
shuc();
}break;
case 0xb7://三角波
{
time1=0;
sjb();
}
break;
case 0x7e://加
{
time1=0;
scan1++;
if(scan1==10)
{
scan1=0;
scan2++;
if(scan2==10)
scan2=0;
}
shuc();
}break;//c
case 0x7d://减
{
time1=0;
scan1--;
if(scan1==-1)
{
scan1=9;
scan2--;
if(scan2==-1)
scan2=9;
}
shuc();
}break;
case 0x7b://自动步进
{
time1=0;
zdbj();
}break;//e
case 0x77: time1--;break;
}
;
if(time1>2)
switch( key)
{
case 0xee:time1--;break;//0 按下相应的键显示相对应的码值
case 0xed:time1--;break;//1
case 0xeb:time1--;break;//2
case 0xe7:time1--;break;//3
case 0xde:time1--;break;//4
case 0xdd:time1--;break;//5
case 0xdb:time1--;break;//6
case 0xd7:time1--;break;//7
case 0xbe:time1--;break;//8
case 0xbd:time1--;break;//9
case 0xbb://确认
{
time1=0;
scan2=aa;
scan1=bb;
time1=0;
shuc();
}break;
case 0xb7://三角波
{
time1=0;
sjb();
}
break;
case 0x7e://加
{
scan1++;
if(scan1==10)
{
scan1=0;
scan2++;
if(scan2==10)
scan2=0;
}
shuc();
}break;//c
case 0x7d://减
{
time1=0;
scan1--;
if(scan1==-1)
{
scan1=9;
scan2--;
if(scan2==-1)
scan2=9;
}
shuc();
} break;
case 0x7b://自动步进
{
time1=0;
zdbj();
}break;//e
case 0x77: time1--;break;
}
}
while(1);
}
电路城所有电路均源于网友上传或网上搜集,供学习和研究使用,其版权归原作者所有,对可以提供充分证据的侵权信息,本站将在确认后24小时内删除。对本电路进行投诉建议,点击 投诉本电路 反馈给电路城。
直接使用附件资料或需要对资料PCB板进行打样的买家,请先核对资料的完整性,如果出现问题,电路城不承担任何经济损失!
S10 5G版对比S10+:从拆解看不一样的电路设计方案
2019-07-30
邦克仕小风扇拆解:人人都可以掌握的电路设计方案
2019-07-26
80后工程师独白:我的电子工程师生涯还要一块单片机说起
2017-10-13
基于51系列单片机的智能照明控制系统设计方案
2016-04-06
NXP 礼品闹钟拆解
2014-07-15
[项目演示]给51单片机写的操作系统
2019-07-24
拆解一个COB LED钥匙扣:三脚猫的电路设计方案
2019-08-15
51单片机零基础入门
2020-03-27
小车机器人之一【机器人入门】
2020-03-26
深度掌握51单片机C语言
2019-11-23
购买后评价此方案,将获电路城官方赠送的最高6折折扣码一份,可至您的个人中心-我的折扣码中查看,用于低价购买其他方案内容。
1人评价,平均分5