基于51单片机的示波器.docx

上传人:b****0 文档编号:16929076 上传时间:2023-07-19 格式:DOCX 页数:16 大小:17.19KB
下载 相关 举报
基于51单片机的示波器.docx_第1页
第1页 / 共16页
基于51单片机的示波器.docx_第2页
第2页 / 共16页
基于51单片机的示波器.docx_第3页
第3页 / 共16页
基于51单片机的示波器.docx_第4页
第4页 / 共16页
基于51单片机的示波器.docx_第5页
第5页 / 共16页
基于51单片机的示波器.docx_第6页
第6页 / 共16页
基于51单片机的示波器.docx_第7页
第7页 / 共16页
基于51单片机的示波器.docx_第8页
第8页 / 共16页
基于51单片机的示波器.docx_第9页
第9页 / 共16页
基于51单片机的示波器.docx_第10页
第10页 / 共16页
基于51单片机的示波器.docx_第11页
第11页 / 共16页
基于51单片机的示波器.docx_第12页
第12页 / 共16页
基于51单片机的示波器.docx_第13页
第13页 / 共16页
基于51单片机的示波器.docx_第14页
第14页 / 共16页
基于51单片机的示波器.docx_第15页
第15页 / 共16页
基于51单片机的示波器.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的示波器.docx

《基于51单片机的示波器.docx》由会员分享,可在线阅读,更多相关《基于51单片机的示波器.docx(16页珍藏版)》请在冰点文库上搜索。

基于51单片机的示波器.docx

基于51单片机的示波器

51单片机波形发生器(本程序适用)

其中独立按键1、2、3、4按下时会产生四个不同波形(矩形、三角波、梯形波、正弦波)

主函数:

Main.c

#include

#include"i2c.h"

#defineAddWr0x90//写数据地址

#defineAddRd0x91//读数据地址

/*unsignedcharcodetab[]={

0,25,50,75,100,125,150,175,200,225,250//表格数值越多,波形越平滑

};*/

unsignedcharcodetab1[]={

0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,

170,180,190,200,210,220,230,240,250

};

unsignedcharcodejuchi[64]={

0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,

146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255

};

unsignedcharcodesin[64]={135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,

146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128};

unsignedcharcodesanjiao[64]={

0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,

248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0

};

unsignedcharcodetixing[64]={

0,13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,208,221,234,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,

247,247,247,247,247,247,247,242,229,216,203,190,177,164,151,138,125,112,99,86,73,60,47,34,21,8

};

unsignedcharcodejuxing[64]={

255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,

255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

};

 

externbitack;

bitWriteDAC(unsignedchardat,unsignedcharnum);

/*------------------------------------------------

主程序

------------------------------------------------*/

main()

{

unsignedchari;

while

(1)//主循环

{

//for(i=0;i<26;i++)

//WriteDAC(tab1[i],1);

while(P1==0xff)

{

for(i=0;i<64;i++)

WriteDAC(juxing[i]*6/10,1);

if(P1!

=0xff)break;

}

while(P1==0xfe)

{

for(i=0;i<64;i++)

WriteDAC(tixing[i]*6/10,1);

if(P1!

=0xfe)break;

}

while(P1==0xfd)

{

for(i=0;i<64;i++)

WriteDAC(sanjiao[i]*6/10,1);

if(P1!

=0xfd)break;

}

while(P1==0xfb)

{

for(i=0;i<64;i++)

WriteDAC(sin[i]*6/10,1);

if(P1!

=0xfb)break;

}

while(P1==0xf7)

{

for(i=0;i<64;i++)

WriteDAC(juchi[i]*6/10,1);

if(P1!

=0xf7)break;

}

}

}

/*------------------------------------------------

写入DA转换数值

输入参数:

dat表示需要转换的DA数值,范围是0-255

------------------------------------------------*/

bitWriteDAC(unsignedchardat,unsignedcharnum)

{unsignedchari;

Start_I2c();//启动总线

SendByte(AddWr);//发送器件地址

if(ack==0)return(0);

SendByte(0x40);//发送器件子地址

if(ack==0)return(0);

for(i=0;i

{

SendByte(dat);//发送数据

if(ack==0)return(0);

}

Stop_I2c();

}

 

IIC协议:

IIC.C

#include"i2c.h"

#define_Nop()_nop_()//定义空指令

bitack;//应答标志位

sbitSDA=P2^1;

sbitSCL=P2^0;

/*------------------------------------------------

启动总线

------------------------------------------------*/

voidStart_I2c()

{

SDA=1;//发送起始条件的数据信号

_Nop();

SCL=1;

_Nop();//起始条件建立时间大于4.7us,延时

_Nop();

_Nop();

_Nop();

_Nop();

SDA=0;//发送起始信号

_Nop();//起始条件锁定时间大于4μ

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0;//钳住I2C总线,准备发送或接收数据

_Nop();

_Nop();

}

/*------------------------------------------------

结束总线

------------------------------------------------*/

voidStop_I2c()

{

SDA=0;//发送结束条件的数据信号

_Nop();//发送结束条件的时钟信号

SCL=1;//结束条件建立时间大于4μ

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=1;//发送I2C总线结束信号

_Nop();

_Nop();

_Nop();

_Nop();

}

 

/*----------------------------------------------------------------

字节数据传送函数

函数原型:

voidSendByte(unsignedcharc);

功能:

将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对

此状态位进行操作.(不应答或非应答都使ack=0假)

发送数据正常,ack=1;ack=0表示被控器无应答或损坏。

------------------------------------------------------------------*/

voidSendByte(unsignedcharc)

{

unsignedcharBitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位

{

if((c<

elseSDA=0;

_Nop();

SCL=1;//置时钟线为高,通知被控器开始接收数据位

_Nop();

_Nop();//保证时钟高电平周期大于4μ

_Nop();

_Nop();

_Nop();

SCL=0;

}

_Nop();

_Nop();

SDA=1;//8位发送完后释放数据线,准备接收应答位

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

if(SDA==1)ack=0;

elseack=1;//判断是否接收到应答信号

SCL=0;

_Nop();

_Nop();

}

 

/*----------------------------------------------------------------

字节数据传送函数

函数原型:

unsignedcharRcvByte();

功能:

用来接收从器件传来的数据,并判断总线错误(不发应答信号),

发完后请用应答函数。

------------------------------------------------------------------*/

/*unsignedcharRcvByte()

{

unsignedcharretc;

unsignedcharBitCnt;

retc=0;

SDA=1;//置数据线为输入方式

for(BitCnt=0;BitCnt<8;BitCnt++)

{

_Nop();

SCL=0;//置时钟线为低,准备接收数据位

_Nop();

_Nop();//时钟低电平周期大于4.7us

_Nop();

_Nop();

_Nop();

SCL=1;//置时钟线为高使数据线上数据有效

_Nop();

_Nop();

retc=retc<<1;

if(SDA==1)retc=retc+1;//读数据位,接收的数据位放入retc中

_Nop();

_Nop();

}

SCL=0;

_Nop();

_Nop();

return(retc);

}

*/

 

/*----------------------------------------------------------------

应答子函数

原型:

voidAck_I2c(void);

----------------------------------------------------------------*/

/*voidAck_I2c(void)

{

SDA=0;

_Nop();

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();//时钟低电平周期大于4μ

_Nop();

_Nop();

_Nop();

SCL=0;//清时钟线,钳住I2C总线以便继续接收

_Nop();

_Nop();

}*/

/*----------------------------------------------------------------

非应答子函数

原型:

voidNoAck_I2c(void);

----------------------------------------------------------------*/

/*voidNoAck_I2c(void)

{

SDA=1;

_Nop();

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();//时钟低电平周期大于4μ

_Nop();

_Nop();

_Nop();

SCL=0;//清时钟线,钳住I2C总线以便继续接收

_Nop();

_Nop();

}

*/

 

/*----------------------------------------------------------------

向无子地址器件发送字节数据函数

函数原型:

bitISendByte(unsignedcharsla,ucahrc);

功能:

从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.

如果返回1表示操作成功,否则操作有误。

注意:

使用前必须已结束总线。

----------------------------------------------------------------*/

/*bitISendByte(unsignedcharsla,unsignedcharc)

{

Start_I2c();//启动总线

SendByte(sla);//发送器件地址

if(ack==0)return(0);

SendByte(c);//发送数据

if(ack==0)return(0);

Stop_I2c();//结束总线

return

(1);

}

*/

/*----------------------------------------------------------------

向有子地址器件发送多字节数据函数

函数原型:

bitISendStr(unsignedcharsla,unsignedcharsuba,ucahr*s,unsignedcharno);

功能:

从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件

地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。

如果返回1表示操作成功,否则操作有误。

注意:

使用前必须已结束总线。

----------------------------------------------------------------*/

/*bitISendStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno)

{

unsignedchari;

for(i=0;i

{

Start_I2c();//启动总线

SendByte(sla);//发送器件地址

if(ack==0)return(0);

SendByte(suba);//发送器件子地址

if(ack==0)return(0);

SendByte(*s);//发送数据

if(ack==0)return(0);

Stop_I2c();//结束总线

DelayMs

(1);//必须延时等待芯片内部自动处理数据完毕

s++;

suba++;

}

return

(1);

}

*/

/*----------------------------------------------------------------

向无子地址器件读字节数据函数

函数原型:

bitIRcvByte(unsignedcharsla,ucahr*c);

功能:

从启动总线到发送地址,读数据,结束总线的全过程,从器件地

址sla,返回值在c.

如果返回1表示操作成功,否则操作有误。

注意:

使用前必须已结束总线。

----------------------------------------------------------------*/

/*bitIRcvByte(unsignedcharsla,unsignedchar*c)

{

Start_I2c();//启动总线

SendByte(sla+1);//发送器件地址

if(ack==0)return(0);

*c=RcvByte();//读取数据

NoAck_I2c();//发送非就答位

Stop_I2c();//结束总线

return

(1);

}

*/

/*----------------------------------------------------------------

向有子地址器件读取多字节数据函数

函数原型:

bitISendStr(unsignedcharsla,unsignedcharsuba,ucahr*s,unsignedcharno);

功能:

从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件

地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。

如果返回1表示操作成功,否则操作有误。

注意:

使用前必须已结束总线。

----------------------------------------------------------------*/

/*bitIRcvStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno)

{

unsignedchari;

Start_I2c();//启动总线

SendByte(sla);//发送器件地址

if(ack==0)return(0);

SendByte(suba);//发送器件子地址

if(ack==0)return(0);

Start_I2c();

SendByte(sla+1);

if(ack==0)return(0);

for(i=0;i

{

*s=RcvByte();//发送数据

Ack_I2c();//发送就答位

s++;

}

*s=RcvByte();

NoAck_I2c();//发送非应位

Stop_I2c();//结束总线

return

(1);

}

*/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2