51单片机资源吧 关注:22贴子:106
  • 0回复贴,共1

电源(直流交流发生器,数码管,DAC0832)

只看楼主收藏回复

1、输出直流电压,电压范围0-5V,按键设置电压的大小
2、输出交流电压,频率20Hz,振幅0-5V,振幅通过按键调节
3、数码管显示每个通道的电压

#include "reg51.h"
#include "absacc.h"
#define uchar unsigned char
#define uint unsigned int
#define DAC1 XBYTE[0XFEFF]//定义DAC0832地址
#define DAC2 XBYTE[0XFDFF]
sbit smg1=P3^0;//数码管
sbit smg2=P3^1;
sbit smg3=P3^2;
sbit smg4=P3^3;
sbit k1=P2^4;//按钮
sbit k2=P2^5;
sbit k3=P2^6;
sbit k4=P2^7;
uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示0~9,有小数点
uchar code sin[]={128,130,132,134,136,139,141,143,145,148,150,152,154,156,158,161,163,165,167,169,171,173,175,177,180,182,184,186,188,190,191,
193,195,197,199,201,203,204,206,208,210,211,213,215,216,218,220,221,223,224,226,227,228,230,231,232,234,235,236,237,238,239,
240,242,243,243,244,245,246,247,248,249,249,250,251,251,252,252,253,253,254,254,254,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,254,254,254,253,253,252,252,251,251,250,249,249,248,247,246,245,244,244,243,242,241,240,238,237,236,235,
234,232,231,230,228,227,226,224,223,221,220,218,217,215,213,212,210,208,206,205,203,201,199,197,195,194,192,190,188,186,184,
182,180,178,176,174,171,169,167,165,163,161,159,156,154,152,150,148,146,143,141,139,137,134,132,130,128,125,123,121,119,117,
114,112,110,108,105,103,101,99,97,95,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,51,49,47,45,44,42,40,39,
37,36,34,33,31,30,28,27,25,24,23,22,20,19,18,17,16,15,14,13,12,11,10,9,8,7,7,6,5,5,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,9,10,10,11,12,13,14,15,16,18,19,20,21,22,24,25,26,28,29,31,32,34,35,37,38,40,42,43,45,47,48,
50,52,54,56,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,88,90,92,94,96,98,101,103,105,107,109,112,114,116,118,120,123,125};
uint time=0;//系统变量
uchar volt1=25,volt2=25; //电压0-5.0
//延时
void delay(uint i)
{
while(i--);
}
//主函数
void main()
{
uint i;
uchar k=0;
TMOD|=0X02;
TH0=178;
TL0=178;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
i=volt1*255/50;//直流
DAC1=i;
//按键检测
if(!k1 &&(k!=1))
{
k=1;
if(volt1<50)
volt1++;
}
if(!k2 &&(k!=2))
{
k=2;
if(volt1>0)
volt1--;
}
if(!k3 &&(k!=3))
{
k=3;
if(volt2<50)
volt2++;
}
if(!k4 &&(k!=4))
{
k=4;
if(volt2>0)
volt2--;
}
if(k1 && k2 && k3 && k4)
k=0;
//显示
P1=smgduan1[volt1/10];smg1=0;delay(1);
smg1=1;
P1=smgduan0[volt1%10];smg2=0;delay(1);
smg2=1;
P1=smgduan1[volt2/10];smg3=0;delay(1);
smg3=1;
P1=smgduan0[volt2%10];smg4=0;delay(1);
smg4=1;
}
}
//定时器中断
void Timer0() interrupt 1
{
uint i;
if(time<355)
time++;
else
time=0;
i=volt2*sin[time];
DAC2=i/50;//交流
}


IP属地:广东1楼2024-06-24 10:15回复