标题: 基于51单片机数字示波器的设计 波形电路 [打印本页]
作者: Nyx影 时间: 2017-5-11 19:05
标题: 基于51单片机数字示波器的设计 波形电路
本帖最后由 Nyx影 于 2017-5-11 20:50 编辑
[size=13.3333px] AD574A AT89C52单片机 19264液晶屏 来实现输入信号波形显示[size=13.3333px]proteus仿真不成功 请问前辈们,程序错在了哪里。单片机完全无法驱动AD
#include <absacc.h>
#include <math.h>
#include <reg51.h>
sfr AUXR=0x8e ; /*允许读写STC89C52RD+片内扩展RAM*/
sfr AUXR1=0xa2 ;
char xdata caiyangdata[200] ; /*采样值存储变量,数组,相邻两
个存储一个12位的采样值,
前为高8位,后为低四位*/
char xdata Vin[100]; /*采样点处输入信号的电压值*/
int gao4,zhong4,di4,di8;
float dv;
int COM,DAT; /*COM为液晶显示的代码入口地址,
DAT为数据入口地址*/
int b,n,p,d;
int i,j;
sbit C3=P2^5; /*右屏片选*/
sbit C2=P2^4; /*中屏片选*/
sbit C1=P2^3; /*左屏片选*/
sbit E=P2^2; /*使能信号线*/
sbit RW=P2^1; /*读写信号线*/
sbit RS=P2^0; /*寄存器选择信号线*/
sbit CS=P2^7;
sbit A0=P2^6;
sbit RC=P3^4;
sbit CEWR=P3^6;
sbit CERD=P3^7;
void chushiint0() ; /*初始化INT0程序*/
void caiyang(); /*采样子程序*/
void zhongduanint0(); /*INT0中断服务程序*/
void AD574A(); /*启动AD574A*/
void gao4ANDdi8(); /*采样值高四位和低八位分离子程序*/
void DAC(); /*数字值到模拟值转换 */
void yejingxianshi(); /*液晶显示子程序*/
void chushiyejing(); /*液晶显示初始设置子程序*/
void wrtDDRAM();
void prcode(); /*写指令代码子程序*/
void prcwdata(); /*写显示数据子程序*/
void prcrdata(); /*读显示数据子程序*/
void pbusy(); /*判忙子程序*/
void main()
{
chushiint0(); /*调用初始化INT0程序*/
AD574A(); /*启动AD574A*/
caiyang(); /*调采样子程序*/
gao4ANDdi8(); /*采样值高四位和低八位分
离子程序,数字值到模拟值转换*/
yejingxianshi(); /*调液晶显示程序*/
}
void chushiint0()
{
IT0=1;
EX0=1;
EA=1;
}
/*ad启动*/
void AD574A()
{
AUXR=0X01;
CEWR=0;
CERD=0;
CS=0;
A0=0;
RC=0;
}
/*ad采样*/
void caiyang()
{
for(i;i<200;)
{
if(IE0==1) /*采用中断查询方式*/
{
zhongduanint0();
}
}
}
/*ad读取AD采样值*/
void INT0() interrupt 0 using 1
{
CEWR=0; /*读取A/D转换值高8位*/
CERD=0;
CS=0;
A0=0;
RC=1;
caiyangdata=P0;
i++;
CEWR=0; /*读取A/D转换值高4位*/
CERD=0;
CS=0;
A0=1;
RC=1;
caiyangdata=P0; /*读取低4位*/
i++;
}
void gao4ANDdi8() /*采样值高四位和低八位分离子程序*/
{
for(i=0,j=0;i<200,j<100;i+2,j++)
{
gao4= caiyangdata&0xf0;
gao4=gao4 >> 4;
zhong4=caiyangdata&0x0f;
zhong4=zhong4 << 4;
di4=caiyangdata[i+1] >> 4;
di8=zhong4+di4;
DAC();
}
}
void DAC() /*数字值到模拟值转换 */
{
int VFS=10;
Vin[j]=((gao4*256+di8)/2048-1)*VFS/2 ;
}
void yejingxianshi() /*调液晶显示程序*/
{
chushiyejing();
for(j=0;j<100;j++)
{
dv=5.0/60.0; /*相邻两行的电压差*/
n=62-Vin[j]/dv; /*显示点所在行数*/
p=n/8; /*显示点所在页数*/
b=n%8; /*显示点在第P页的第J个单元的第B位*/
d=1; /*第P页第J个单元的值*/
i=B;
for(i;i>0;i--)
{
d*=2;
}
wrtDDRAM();
}
}
void chushiyejing() /*液晶显示设置*/
{
C1=1; /*左区设置*/
C2=0;
C3=0;
COM=0xc0; /*设置显示起始行为第一行*/
prcode();
COM=0x3f; /*开显示设置*/
prcode();
COM=0x40; /*列地址设置为0*/
prcode();
C1=0; /*中区设置*/
C2=1;
C3=0;
COM=0xc0;
prcode();
COM=0x3f;
prcode();
COM=0x40;
prcode();
}
void wrtDDRAM()
{
if(j<64)
{
C1=1; /*左区显示数据写入*/
C2=0;
C3=0;
COM=P||0xb8 ; /*或页面地址*/
prcode();
DAT=d;
prcwdata(); /*写入待显示数据*/
}
else if((j>64)&&(j<100))
{
C1=0; /*右区显示数据写入*/
C2=1;
C3=0;
COM=P||0xb8; /*或页面地址*/
prcode();
DAT=d;
prcwdata(); /*写入待显示数据*/
}
}
void prcode() /*写指令代码子程序*/
{
pbusy();
RW=0;
P1=COM; /*写指令代码*/
E=1;
E=0;
}
void prcwdata() /*写显示数据子程序*/
{
pbusy();
RS=1;
RW=0;
P1=DAT;
E=1;
E=0;
}
void prcrdata() /*读显示数据子程序*/
{
pbusy();
RS=1;
P1=0xff;
E=1;
DAT=P1;
E=0;
}
void pbusy()
{RW=1;
while(ACC^7) /*判“忙“标志为0否,否再读*/
{
P1=0xff;
E=1;
ACC=P1;
E=0;
}
}
Rebuild target 'Target 1'
assembling STARTUP.A51...
compiling boxing.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?PRCRDATA?BOXING
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: ZHONGDUANINT0
MODULE: boxing.obj (BOXING)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: ZHONGDUANINT0
MODULE: boxing.obj (BOXING)
ADDRESS: 0D68H
Program Size: data=37.0 xdata=300 code=1517
creating hex file from "boxing"...
"boxing" - 0 Error(s), 3 Warning(s).
-
QQ图片20170511190220.png
(49.03 KB, 下载次数: 65)
作者: 666562323 时间: 2017-5-12 10:59
#include<reg52.h>
#include<intrins.h>//循环函数的头文件
#define uint unsigned int
#define uchar unsigned char
uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//从低位往高位移一个灯
uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//从高位往低位移一个灯
uchar code table2[]={0xfe,0xfa,0xf8,0xf0,0xe0,0xa0,0x80,0x00};//从低位到高位逐步全部点亮
uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//从高位到低位逐步全部点亮
uchar code table4[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//从低位到高位逐步全部熄灭
uchar code table5[]={0x80,0xa0,0xe0,0xf0,0xf8,0xfa,0xfe,0xff};//从高位到低位逐步全部熄灭
uchar code table6[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//从低位到高位,灭一个灯移动
uchar code table7[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//从高位到低位,灭一个灯移动
uchar i;
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=314;y>0;y--);
}
///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
void deng123()//
{
for(i=0;i<8;i++)
{
P2=table1[i];
P0=table1[i];
delay(25);
}
}
/***********************************************
************************************************/
void deng0()//所有灯亮一会儿
{
P0=0x00;P1=0x00;P2=0x00;P3=0x00;
delay(150);
}
/////////////////////////////////
void deng0_1()//所有灯灭一会儿
{
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
delay(150);
}
//////////////////////////////////////
void deng1()//两列灯顺时针旋转2遍,然后逐渐降低
{
uchar c;
P1=0x00;P3=0x00;
for(c=2;c>0;c--)
{
deng123();
}
////////////////
P1=0x03;
deng123();
/////////////////
P1=0x0f;
deng123();
////////////////
P1=0x3f;
deng123();
///////////////
P1=0xff;
deng123();
////////////////////////
P3=0x03;
deng123();
//////////////
P3=0x0f;
deng123();
//////////////
P3=0x3f;
deng123();
/////////////
P3=0xff;
deng123();
P2=0xff;P0=0xff;
}
///////////////////////////////////////////////
void deng2()//四列灯顺时针旋转2遍
{
uchar a;
uchar b;
b=0x77;
P2=b;
P0=b;
P1=0x00;P3=0x00;
for(a=4;a>0;a--)
{
for(i=0;i<8;i++)
{
b=_cror_(b,1);//循环左移
delay(25);
P2=b;
P0=b;
}
}
P2=0xff;P0=0xff;P1=0xff;P3=0xff;
}
//////////////////////////////////////////////
void deng3()//单层,向上升
{
P0=0x00;
P2=0x00;
for(i=0;i<8;i++)
{
P3=table1[i];
delay(25);
}
P3=0xff;
/*----------------------*/
for(i=0;i<8;i++)
{
P1=table1[i];
delay(25);
}
P1=0xff;
}
/////////////////////////////////////////
void deng4()//单层,向下降
{
P2=0x00;P0=0x00;
for(i=0;i<8;i++)
{
P1=table0[i];
delay(25);
}
P1=0xff;
/*----------------------*/
for(i=0;i<8;i++)
{
P3=table0[i];
delay(25);
}
P3=0xff;P1=0xff;P0=0xff;P2=0xff;
}
/////////////////////////////////////////
void deng5()//从上到下,逐层全部点亮】
{
P0=0x00;P2=0x00;
for(i=0;i<8;i++)
{
P1=table2[i];
delay(25);
}
for(i=0;i<8;i++)
{
P3=table2[i];
delay(25);
}
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
}
////////////////////////////////////////
void deng6()//从上到下,逐层全部熄灭】
{
P0=0x00;P2=0x00;
P1=0x00;P3=0x00;
for(i=0;i<8;i++)
{
P1=table4[i];
delay(25);
}
P1=0xff;
for(i=0;i<8;i++)
{
P3=table4[i];
delay(25);
}
P3=0xff;
P0=0xff;P2=0xff;
}
///////////////////////////////////
void deng7()//四组灯,交替两次
{
for(i=2;i>0;i--)
{
P1=0x00;P2=0x00;//上左
delay(40);
P1=0xff;P2=0xff;
delay(40);
/////////////
P3=0x00;P0=0x00;//下右
delay(40);
P3=0xff;P0=0xff;
delay(40);
/////////////
P3=0x00;P2=0x00;//下左
delay(40);
P3=0xff;P2=0xff;
delay(40);
/////////////
P1=0x00;P0=0x00;//上右
delay(40);
P1=0xff;P0=0xff;
delay(40);
}
}
void deng8()//上半先逐步列点亮,然后再向下点点亮
{
P0=0xff;P2=0xff;P3=0xff;
P1=0x00;
for(i=0;i<8;i++)
{
P0=table3[i];
P2=table3[i];
delay(25);
}
delay(70);
P1=0x00;P2=0x00;P0=0x00;
for(i=0;i<8;i++)
{
P3=table2[i];
delay(25);
}
}
//////////////////////////////////////
void deng9()//从中间向上、下点亮,再熄灭
{
P0=0x00;P2=0x00;
for(i=0;i<8;i++)
{
P1=table3[i];
P3=table2[i];
delay(25);
}
for(i=0;i<8;i++)
{
P1=table4[i];
P3=table5[i];
delay(25);
}
}
///////////////////////////////////////////
void deng10()//从中间向上、下熄灭
{
P0=0x00;P2=0x00;
for(i=0;i<8;i++)
{
P1=table5[i];
P3=table4[i];
delay(25);
}
P1=0xff;P3=0xff;
}
void deng11()//逆时针逐列点亮所有灯
{
P1=0x00;P3=0x00;
P0=0xff;P2=0xff;
for(i=0;i<8;i++)
{
P0=table2[i];
delay(25);
}
for(i=0;i<8;i++)
{
P2=table2[i];
delay(25);
}
P0=0xff;P2=0xff;P3=0xff;P1=0xff;
}
///////////////////////////////////////////
void deng12()//闪烁
{
uchar i;
uchar b;
b=0xaa;
P2=b;
P0=b;
P1=b;
P3=b;
for(i=0;i<8;i++)
{
b=_cror_(b,1);//循环左移
delay(50);
P2=b;
P0=b;
P1=b;
P3=b;
}
P0=0xff;P1=0xff;P2=0xff;P3=0xff;
}
void deng13()//两层灯,分别从中间向上、下移动
{
P2=0x00;P0=0x00;
for(i=0;i<8;i++)
{
P1=table1[i];
P3=table0[i];
delay(25);
}
P2=0xff;P0=0xff;P1=0xff;P3=0xff;
}
void deng14_1()//点满一圈的小函数(限内部用)
{
P2=0xff;P0=0xff;
for(i=0;i<8;i++)
{
P2=table2[i];
delay(15);
}
for(i=0;i<8;i++)
{
P0=table2[i];
delay(15);
}
P2=0xff;P0=0xff;
}
///////////////////////////
void deng14()//从下开始,点满一圈后,灭,再上升点亮第二圈
{
P1=0xff;
P3=0x7f;//1层
deng14_1();//点满一圈的小函数(限内部用)
P3=0xbf;//2层
deng14_1();//点满一圈的小函数(限内部用)
P3=0xdf;//3层
deng14_1();//点满一圈的小函数(限内部用)
P3=0xef;//4层
deng14_1();//点满一圈的小函数(限内部用)
P3=0xf7;//5层
deng14_1();//点满一圈的小函数(限内部用)
P3=0xfb;//6层
deng14_1();//点满一圈的小函数(限内部用)
P3=0xfd;//7层
deng14_1();//点满一圈的小函数(限内部用)
P3=0xfe;//8层
deng14_1();//点满一圈的小函数(限内部用)
//////////////////
P3=0xff;
P1=0x7f;//1层
deng14_1();//点满一圈的小函数(限内部用)
P1=0xbf;//2层
deng14_1();//点满一圈的小函数(限内部用)
P1=0xdf;//3层
deng14_1();//点满一圈的小函数(限内部用)
P1=0xef;//4层
deng14_1();//点满一圈的小函数(限内部用)
P1=0xf7;//5层
deng14_1();//点满一圈的小函数(限内部用)
P1=0xfb;//6层
deng14_1();//点满一圈的小函数(限内部用)
P1=0xfd;//7层
deng14_1();//点满一圈的小函数(限内部用)
P1=0xfe;//8层
deng14_1();//点满一圈的小函数(限内部用)
P1=0xff;
}
/*====================================================
===================主函数君===========================
======================================================*/
void main()
{
while(1)
{
deng0_1();//所有灯灭一会儿
deng0_1();//所有灯灭一会儿
deng14();//从下开始,点满一圈后,灭,再上升点亮第二圈
deng4();//单层,向下降
deng5();//从上到下,逐层全部点亮
deng6();//从上到下,逐层全部熄灭】
deng8();//上半先逐步点亮,然后再向下点亮
deng0();//所有灯亮一会
deng6();//从上到下,逐层全部熄灭】
deng9();//从中间向上、下点亮,再熄灭
deng9();//从中间向上、下点亮,再熄灭
deng0_1();//所有灯灭一会儿
deng11();//逆时针逐列点亮所有灯
deng10();//从中间向上、下熄灭
deng0_1();//所有灯灭一会儿
deng13();//两层灯,分别从中间向上、下移动
deng3();//单层,向上升
deng5();//从上到下,逐层全部点亮
deng12();//闪烁
deng12();//闪烁
deng2();//四列灯顺时针旋转2遍
deng1();//两列灯顺时针旋转2遍,然后逐渐降低
deng0_1();//所有灯灭一会儿
}
}
作者: bayga456 时间: 2017-5-12 11:35
之前想过用51做示波器,看了我又想起来了。
作者: Nyx影 时间: 2017-5-12 13:20
您好。。这个和我的有关系么~如果我没猜错的话,前面看出来这是点亮数码管的程序吧~
作者: wsz_wsz 时间: 2017-5-12 15:04
虽然很长 但也看完了
作者: Nyx影 时间: 2017-5-12 17:43
经过修改,最后发现 void prcrdata() 函数 没有被程序调用。。。请问前辈们,这个函数应该插入到哪里呢?
作者: HUANGHFS 时间: 2017-5-12 21:39
很好,做得借鉴。
作者: Nyx影 时间: 2017-5-13 15:40
sad,没有一个人解答 。。。。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |