基于51的数控直流稳压电源的设计资料全套 分享给大家
仿真原理图如下(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(10);
- if(dd==0)
- break;
- }
- if(dd==0)
- break;
- for(;iii>0;iii=iii-2)
- {
- P1=iii;
- shaom();
- delay(5);
- 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://三角波
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
proteus数控稳压电源.zip
(489.83 KB, 下载次数: 106)
|