可控电源,电压可在1.25伏到9伏之间设定,电路涉及到A/D、D/A转换、矩阵键盘和LED显示。PROTEUS仿真图和代码见附件。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- //#include<DAC0832.c>
- //#include<ADC0832.c>
- //#include <absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- //#define DAC0832 XBYTE[0xfffe]
- /************I/O口定义*********/
- sbit CS=P2^3; //ADC0832的片选端
- sbit CLK=P2^2; //时钟端
- sbit DIO=P2^1; //数据输入输出端
- sbit up=P2^7;
- sbit down=P3^0;
- sbit L1=P2^4;
- sbit L2=P2^5;
- sbit L3=P2^6;
- sbit WR2=P2^0;
- sbit LED1=P2^7;
- sbit LED2=P3^7;
- uint cdi=0,dy=0;
- uchar key=12,flag=0,h=0,m=0,l=0;
- uint ge,dian,xiao1,xiao2;
- uchar code table[]={ //共阳数码管显示定义
- 0x03,0x9f,0x25,0x0d,
- 0x99,0x49,0x41,0x1f,
- 0x01,0x09};
- void delay();
- uint A_D();
- void display();
- void DAC();
- void key_test();
- void delay(uchar i) //i=1延迟1ms
- {
- uchar a,b,c;
- for(c=i;c>0;c--)
- for(b=142;b>0;b--)
- for(a=2;a>0;a--);
- }
- void vol_up()
- {
- cdi+=1;
- DAC();
- delay(1);
- dy=A_D()*9/5;
- ge=dy/51; // 计算整数部分
- dian=(dy%51)*100/51; //计算小数部分
- xiao1=dian/10; //取小数点后第一位
- xiao2=dian%10; //去小数点后第二位
- }
- void vol_down()
- {
- cdi-=1;
- DAC();
- delay(1);
- dy=A_D()*9/5;
- ge=dy/51; // 计算整数部分
- dian=(dy%51)*100/51; //计算小数部分
- xiao1=dian/10; //取小数点后第一位
- xiao2=dian%10; //去小数点后第二位
- }
- /*****
- *函数名称: void dispaly1()
- *输入参数: 共0个参数;
- *输出参数: 共0个参数;
- *返回值: 无;
- *需储存的参数: 共0个参数;
- *功能介绍: 显示电压值
- *****/
- void display()
- {
- if(flag==0)
- {
- P1=table[ge]&0xfe;
- P1=table[ge]&0xfe; //显示整数位,与0x01是为了显示小数点
- L1=1;
- delay(1);
- L1=0;
- P1=table[xiao1]; //显示小数点后第一位
- L2=1;
- delay(1);
- L2=0;
- P1=table[xiao2]; //显示小数点后第二位,
- L3=1;
- delay(1);
- L3=0;
- }
- else
- {
- P1=table[h]&0xfe;
- P1=table[h]&0xfe; //显示整数位,与0x01是为了显示小数点
- L1=1;
- delay(1);
- L1=0;
- P1=table[m]; //显示小数点后第一位
- L2=1;
- delay(1);
- L2=0;
- P1=table[l]; //显示小数点后第二位,
- L3=1;
- delay(1);
- L3=0;
- }
- }
- /*****
- *函数名称: uchar A_D()
- *输入参数: 共0个参数;
- *输出参数: 共0个参数;
- *返回值: 有;
- *需储存的参数: 共0个参数;
- *功能介绍: 采集电压
- *****/
- uint A_D()
- {
- uint dat;
- uchar i;
- CS=1; //一个转换周期开始
- CLK=0; //为第一个脉冲准备
- CS=0; //CS置0,片选有效
- DIO=1; //DIO置1,规定起始信号
- CLK=1; //第一个脉冲
- CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
- DIO=1; //DIO置1,通道选择信号
- CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入
- //两位数据用于选择通道,这里选通道CH1
- CLK=0; //第二个脉冲下降沿
- DIO=1;//DI置1,选择通道1
- CLK=1;//第三个脉冲
- CLK=0;//第三个脉冲下降沿
- DIO=1;//第三个脉冲下沉沿之后,输入端DIO失去作用,应置1
- CLK=1;//第四个脉冲
- for(i=0;i<8;i++) //高位在前,循环8次读出8位数据
- {
- CLK=1; //第四个脉冲
- CLK=0;
- dat<<=1; //将下面存储的低位数据右移
- dat|=(uchar)DIO; //将输出数据DIO通过或运算存储在dat最低位
- }
- CS=1;//片选无效
- return dat;
- }
- void DAC()
- {
- P0 = cdi;
- WR2=0;
- WR2=1;
- }
- /*****
- *函数名称: void key_test()
- *输入参数: 共0个参数;
- *输出参数: 共0个参数;
- *返回值: 无;
- *需储存的参数: 共0个参数;
- *功能介绍: 键盘扫描程序,采用行反转法对键盘进行扫描,确定键值
- *****/
- void key_test()
- {
- uchar temp=0;
- delay(10); //去抖
- if((P3&0x0f)!=0x0f)
- {
- temp=P3;
- P3=0x70;
- temp=temp|P3; //将行列值或即可得到每个键的编码
- switch(temp)
- {
- case 0x3e:key=1;break; //1
- case 0x5e:key=2;break; //2
- case 0x6e:key=3;break; //3
- case 0x3d:key=4;break; //4
- case 0x5d:key=5;break; //5
- case 0x6d:key=6;break; //6
- case 0x3b:key=7;break; //7
- case 0x5b:key=8;break; //8
- case 0x6b:key=9;break; //9
- case 0x37:key=10;break; //*
- case 0x57:key=0;break; //0
- case 0x67:key=11;break; //#
- default:key=12;
- }
- while((P3&0x70)!=0x70); //判断松手检测
- }
- }
- void main()
- {
- uint i=0;
- uchar set_ok=0;
- LED1=0;
- DAC();
- delay(1);
- dy=A_D()*9/5;
- ge=dy/51; // 计算整数部分
- dian=(dy%51)*100/51; //计算小数部分
- xiao1=dian/10; //取小数点后第一位
- xiao2=dian%10; //去小数点后第二位
- display();
- while(1)
- {
- P3=0x0f;
- if((P3&0x0f)!=0x0f)
- { key_test();
- if(key==10) //设置键
- { LED1=1;
- flag=1;
- key=12;
- }
- else if(key==11) //确定键
- {
- flag=0;
- LED1=0;
- key=12;
- set_ok=1;
- }
-
- else if(key!=12) //其他数字键
- {
- if(flag==1)
- {
- h=m;
- m=l;
- l=key;
- key=12;
- }
- }
- }
- if(set_ok==1)
- {
- set_ok=0;
- if(h>ge)
- {
- do
- {vol_up();}
- while(h>ge);
- }
- else if(h<ge)
- {
- do
- {vol_down();}
- while(h<ge);
- }
- if(m>xiao1)
- {
- do
- {vol_up();}
- while(m>xiao1);
- }
- else if(m<xiao1)
- {
- do
- {vol_down();}
- while(m<xiao1);
- }
- }
-
- display();
- }
- }
复制代码
所有资料51hei提供下载:
可控电源.zip
(62.27 KB, 下载次数: 59)
|