三角波发生器
三角波发生器 程序设计
序产生且送DA进行转换,T1插孔输出波形,用示波器测量,且数据源送到PC机显示, 256点/周。短路块J6插上,短路块J7插右,双刀双掷SW3掷上,T1对T6测DA输出,8位数 据在左边5个数码管显示(仅用右3个),T1插孔输出电压的理论值在右边5个数码管显示*/ #include
#include
#define u8c unsigned char code//存放于代码中的无符号8位字符型缩写定义
#define u8 unsigned char //无符号8位字符型缩写定义
#define u16 unsigned int //无符号16位整型缩写定义
#define Displayseg XBYTE[0x7FFF]//数码管段码锁存器写端口地址(A15=0)
#define Displaybit XBYTE[0xBFFF]//数码管位码锁存器写端口地址(A14=0)
#define DA XBYTE[0xDFFF]//DA转换数据输入端口地址(A13=0)
u8 r_kT,i; //SW1给定DA数据源和整数部分变量定义
u16 Axx; //要显示的DA电压数据的100倍
u8 dispbuf[10]; //10个数码管显示段码缓存区数组定义
int m_kT; //输出电压的100倍,-1100~+1091
u16 temp1; //计算时的中间变量
int temp2; //计算时的中间变量
float Vx9; //DA输出电压变量定义-11.0V~+10.914V
u8 M=0,J; //扫描显示位计数和波形点数计数变量定义 bit new_cycle_flag=0; //DA刷新周期标志(扫描显示一周),1要刷新
sbit LSIGN=P1^6; //左边的符号位数码管公共端连接引脚,=0可能亮 sbit RSIGN=P1^7; //右边的符号位数码管公共端连接引脚,=0可能亮 u8c
SG[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F段码表
u8c BT[10]={0xfe,0xfd,0xfb,0xf7,0xff,0xef,0xdf,0xbf,0x7f,0xff};//位码表
u8c disp1[16]={'I','n','P','u','t',':',' ',' ',' ',' ',' ',' ',' ',' ',' ','H'};//
u8c disp2[16]={'O','u','t','P','u','t',':',' ',' ',' ',' ',' ','.',' ',' ','V'};//
/***********T0T1初始化***********/ //256点/2秒,换算成7.8125ms/点
void T0T1_init(void) //10个数码管扫描1周7.8125ms,每个0.78125ms
{ TMOD=0x20; //T0方式0,16位自动重装定时,T1方式2定时(8位自动重装)
AUXR &= 0x3F; //T0x12=T1x12=0,T0和T1时钟均为Fosc/12,即12T AUXR &= 0xFE; //S1ST2=0,串口1选择定时器1为波特率发生器
SCON=0x40; //串口1的SM0SM1=01为方式1即8位UART(2^1*T1溢出率/32)
PCON=0x80; //第8位SMOD=1,
TL0=0x30; //定时周期1/1280=0.00078125s=0.78125ms TH0=0xfd; //T0频率11059200/12/(65536-0xfd30)=1280Hz TH1=0xfd; //T1溢出率=(11059200/12)/(256-253)=307200Hz TL1=0xfd; //波特率=2*307200/32=19200bps
EA=1; //允许中断
ES=0; //禁止串行发送结束中断
ET0=1; //允许T0申请中断
TR0=1; //启动T0定时器工作
TR1=1; //启动T1定时
}
/*****DA数据显示缓存区的更新******/
void disp_g(void) //DA数据显示缓存区的更新
{ dispbuf[9]=0x00; //送不显示段码
dispbuf[8]=0x00; //送不显示段码
dispbuf[5]=0x76; //后缀位送十六进制后缀H的段码
i=(r_kT&0xf0)>>4; //取8位DA数据的十六进制高位
dispbuf[7]=SG[i]; //查段码表更新十六进制高位段码
i=r_kT&0x0f; //取8位DA数据的十六进制低位
dispbuf[6]=SG[i]; //查段码表更新十六进制低位段码
}
/***DA输出电压显示缓存区的更新****/
void disp_f(void) //DA输出电压显示缓存区的更新
{ if(m_kT
{ Axx=-m_kT; //取绝对值
dispbuf[4]=0x40; //符号位数码管对应送负号的段码
}
else //输出电压的100倍是正数
{ Axx=m_kT; //取要显示的输出电压的100倍
dispbuf[4]=0x00; //符号位数码管对应送正号的段码
}
i=(u8)(Axx/1000); //计算电压伏特十位
dispbuf[3]=SG[i]; //电压伏特十位数码管显示缓存更新段码 i=(u8)(Axx/100%10); //计算电压伏特个位
dispbuf[2]=SG[i]|0x80; //电压伏特个位数码管显示缓存更新段码 i=(u8)(Axx/10%10); //计算电压伏特小数后第1位
dispbuf[1]=SG[i]; //电压伏特小数后第1位数码管显示缓存更新段码 i=(u8)(Axx%10); //计算电压伏特小数后第2位
dispbuf[0]=SG[i]; //电压伏特小数后第2位数码管显示缓存更新段码 }
/*************主程序*************/
void main(void)
{ DA=0x80; //DA输出零伏
T0T1_init(); //T0初始化程序(11.0592MHz)
do
{ if(new_cycle_flag==1) //DA刷新周期标志为1的话
{ DA=r_kT; //DA刷新;Iout1=(Vref/R)*(N/256)
temp1=(u16)r_kT
temp2=(int)temp1; //有符号2*N;Vx9=-(R4/R2)*Vs5-(R4/R3)*Vref
temp2-=256; //2*N-256;=(220/50)*5*(N/256)-(220/100)*5 Vx9=(float)temp2*4.296875;//1100/256=4.296875;100Vx9=(2*N-256)*1100/256 m_kT=(int)Vx9; //则N=0,100Vx9=-1100.0;N=255,100Vx9=1091.4 SBUF =r_kT; //异步通信发送波形数据值
disp_g(); //对采样的8位数对应显示缓存区更新显示信息 disp_f(); //对DA输出电压对应显示缓存区更新显示信息 new_cycle_flag=0; //DA刷新周期标志清0
}
}while(1); //永远循环
}
/*********T0中断服务程序*********/
void t0() interrupt 1 using 1 //0.78125ms中断,自动重装,每次均要进行显示处理
{ if(M==10) //7.8125ms到了吗?因为0.78125ms*10=7.8125ms { if(J>=128) //
{ r_kT=J^0xff; //下降阶段,128~255--->127~0
r_kT254~0
}
else r_kT=J0~254
J+=1; //J最小为0,最大为255,
new_cycle_flag=1; //DA刷新周期标志置1(扫描显示一周)
M=0; //M清0
}
RSIGN=1; //关闭右边符号位显示
LSIGN=1; //关闭左边符号位显示
Displaybit=0xff; //关闭8个数码管的显示
Displayseg=dispbuf[M]; //查显示缓存表送数显的段端口
Displaybit=BT[M]; //查位码表送数显的位端口
if(M==4) RSIGN=0; //扫描到右边符号位则该位显示
if(M==9) LSIGN=0; //扫描到左边符号位则该位显示
M++; //修改下一次的显示位
}