📄 wavegen.c
字号:
/***************************PROGRAM FUNCTION*******************************/
// TLV5618产生从0-5V变化的电压(锯齿波),DA数据每次变化1位,即电压增量=1.22mV //
// 数码管显示预期电压值 //
// 预期电压值和万用表测得的电压值有出入 //
// 待改进:小数显示时的四舍五入问题,尝试其它小数显示的算法 //
// 模式设置:R1=1,SPD=1,PWR=0,R0=0--使用OUTPUT A进行输出 //
#include<reg52.h>
#define uCHAR unsigned char
#define uint unsigned int
sbit DACS1 = P2^5; //5618/5617 CHIP SELECT
sbit DASDA = P1^1;
sbit DASCL = P1^0;
sbit seg_latch=P2^6;
sbit bit_latch=P2^7;
uCHAR code table[]={0x3f,0x03,0x6D,0x67,
0x53,0x76,0x7E,0x23,
0x7F,0x77,0x7B,0x5E,
0x3C,0x4F,0x7C,0x78};//my code
void SendDA(uCHAR data0,uCHAR data1,bit data2); //发送待进行DA转换的数据
void delay(uint z);
void SendDA(uCHAR data0,uCHAR data1,bit data2) //bit变量只取0或1
{
unsigned char i;
DASDA=1;
DASCL=1;
DACS1 = 0;
if(data2)
{
data0|=0x40; //SPD=1:fast mode
}//data2决定工作模式
else
{
data0|=0xc0; //R1=1,SPD=1
}
//data0中高四位为模式设置位,低四位为数据位
for (i=0;i<8;i++)
{
DASDA=(bit)(data0&0x80);//给一位数据
DASCL=1;
DASCL=0; //给一个脉冲
data0<<=1;//移到下一位
}
//data1为12位数据的低8位
for (i=0;i<8;i++)
{
DASDA=(bit)(data1&0x80);
DASCL=1;
DASCL=0;
data1<<=1;
}
DASDA= 1; //为下次作准备
DACS1= 1; //为下次作准备
}
void DA(uint outputa)
{
SendDA(outputa/256,outputa%256,0);//输出a
//sendda(outputb/256,outputb%256,1);//输出b
}
void display(unsigned int num) //显示程序 1024->1.25V
{
float temp;
uCHAR qianwei,baiwei,shiwei,gewei;
temp=(5.0/4096)*1000;//放大1000倍,基本量1.22mV
temp*=num;
num=(uint)(temp); //强制类型转换
qianwei=num/1000;
baiwei=num%1000/100;
shiwei=num%100/10;
gewei=num%10;
P0=table[qianwei]|0x80; //添加小数点
seg_latch=1;
seg_latch=0;
P0=0xfe; //led1有效,显示千位
bit_latch=1;
bit_latch=0;
delay(5);
P0=table[baiwei];
seg_latch=1;
seg_latch=0;
P0=0xfd; //led2有效,显示百位
bit_latch=1;
bit_latch=0;
delay(5);
P0=table[shiwei];
seg_latch=1;
seg_latch=0;
P0=0xfb; //led3有效,显示十位
bit_latch=1;
bit_latch=0;
delay(5);
P0=table[gewei];
seg_latch=1;
seg_latch=0;
P0=0xf7; //led4有效,显示个位
bit_latch=1;
bit_latch=0;
delay(5);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=113;y>0;y--);
}
void main()
{
while(1)
{
unsigned int i;
uCHAR k;
for(i=0;i<4096;i++)
{
DA(i);//12位的,范围0-4096
for(k=0;k<20;k++)
{
display(i); //显示预期电压值
}
}
//delay(10); //这儿不用延时,不然会造成显示闪烁
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -