仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
采用tlc5615进行数模转换将按键的值送给数码管显示
tlc549进行模数转换将输出的实际电压送给数码管显示
单片机源程序如下:
- #include "Tlc549.h"
- #include "kpad.h"
- #include "LCD1602Display.h"
- #include "TLC5615.h"
- #define smgport P0
- #define smgbit P2
- #include<reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code smgdm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar code tab[]={"0123456789:"};
- uchar code tab1[]={" Set_U= mV "};
- uchar code tab2[]={" Rea_U= mV "};
- bit flag_10ms,flag_1ms;
- bit flag_Keyover,flag_swap;
- uchar T0cnt,dispcnt;
- void displcd(uint dd,uchar line);
- /****************************************************************************/
- void timer0(void) interrupt 1 using 1
- {
- TH0=-1000/256;
- TL0=-1000%256;
- T0cnt++;
- flag_1ms=1;
- if(T0cnt==10)
- {
- flag_10ms=1;
- T0cnt=0;
- }
- }
- uint Setv=0;
- uint Trdata=5;
- /****************************************************************************/
- void Key_Process_smg(uchar Kd,bit flag)
- {float tp;
- if(flag)
- {if((Kd!=10)&&(Kd!=12)&&(Kd!=0xff)) Setv=10*Setv+Kd;
- if(Kd==10) Setv=0;
-
- if(Kd==12)
- {tp=19.456*Setv/1024.0;
- Trdata=(uint)tp;
- flag_swap=0;
- }
- }
- }
- /****************************************************************************/
-
- /****************************************************************************/
-
- void dispsmg(uint dd,bit flag_dp)
- {
- unsigned char dispdd[4];
- dispdd[3]=smgdm[dd/1000];
- dispdd[2]=smgdm[dd/100%10];
- dispdd[1]=smgdm[dd/10%10];
- dispdd[0]=smgdm[dd%10];
-
- if(flag_dp)
- {smgport=0;
- smgport=~dispdd[dispcnt];
- smgbit=0xe3&smgbit;
- smgbit=smgbit^(dispcnt<<2);
- }
- dispcnt++;if(dispcnt==4)dispcnt=0;
- }
- uchar add[10],j;
- /****************************************************************************/
- void main(void)
- {
- TMOD=0x01;
- TH0=-1000/256;
- TL0=-1000%256;
- EA=ET0=TR0=1;
-
- while(1)
- { uchar Kval,k;
- uint Rv,tmp;
- float dfp;
- Kval=Kscan(flag_10ms);
- flag_10ms=0;
- Key_Process_smg(Kval,flag_Keyover);
- flag_Keyover=0;
- dac_5615(Trdata);
- if(flag_swap) tmp=Setv;
- else tmp=Rv;
- dispsmg(tmp,flag_1ms);
- flag_1ms=0;
- tmp=0;
- add[j]=TLC549();
- j=++j%10;
- for(k=0;k<10;k++)
- {tmp=tmp+add[k];}
- tmp=tmp/10;
- dfp=2495.0*10.95*tmp/255;
- Rv=(uint)dfp;
-
- }
- }
复制代码
程序有问题:
线性电源.zip
(42.4 KB, 下载次数: 41)
|