1、基于51单片机的示波器51单片机波形发生器(本程序适用)其中独立按键1、2、3、4按下时会产生四个不同波形(矩形、三角波、梯形波、正弦波)主函数:Main.c #include #include i2c.h#define AddWr 0x90 /写数据地址 #define AddRd 0x91 /读数据地址/*unsigned char code tab= 0,25,50,75,100,125,150,175,200,225,250 /表格数值越多,波形越平滑 ;*/unsigned char code tab1= 0,10,20,30,40,50,60,70,80,90,100,110,12
2、0,130,140,150,160, 170,180,190,200,210,220,230,240,250 ;unsigned char code juchi64=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,2
3、47,251,255;unsigned char code sin64=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;unsigned char code sanjiao64=0,8,16,24,32,
4、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;unsigned char code tixing64=0,13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,208,
5、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;unsigned char code juxing64=255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,2
6、55,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;extern bit ack;bit WriteDAC(unsigned char dat,unsigned char num);/*- 主程序-*/main() unsigned char i; while (1) /主循环 / for(i=0;i26;i+)/ WriteDAC(tab1i,1); while(P1=0xff) for(i=0;i64;i+) WriteDAC(juxingi*6
7、/10,1); if(P1!=0xff)break; while(P1=0xfe) for(i=0;i64;i+) WriteDAC(tixingi*6/10,1); if(P1!=0xfe)break; while(P1=0xfd) for(i=0;i64;i+) WriteDAC(sanjiaoi*6/10,1); if(P1!=0xfd)break; while(P1=0xfb) for(i=0;i64;i+) WriteDAC(sini*6/10,1); if(P1!=0xfb)break; while(P1=0xf7) for(i=0;i64;i+) WriteDAC(juchii*
8、6/10,1); if(P1!=0xf7)break; /*- 写入DA转换数值输入参数:dat 表示需要转换的DA数值,范围是0-255-*/bit WriteDAC(unsigned char dat,unsigned char num) unsigned char i; Start_I2c(); /启动总线 SendByte(AddWr); /发送器件地址 if(ack=0)return(0); SendByte(0x40); /发送器件子地址 if(ack=0)return(0); for(i=0;inum;i+) SendByte(dat); /发送数据 if(ack=0)retur
9、n(0); Stop_I2c(); IIC协议:IIC.C #include i2c.h#define _Nop() _nop_() /定义空指令 bit ack; /应答标志位sbit SDA=P21;sbit SCL=P20;/*- 启动总线-*/void Start_I2c() SDA=1; /发送起始条件的数据信号 _Nop(); SCL=1; _Nop(); /起始条件建立时间大于4.7us,延时 _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /发送起始信号 _Nop(); /起始条件锁定时间大于4 _Nop(); _Nop(); _Nop(); _N
10、op(); SCL=0; /钳住I2C总线,准备发送或接收数据 _Nop(); _Nop();/*- 结束总线-*/void Stop_I2c() SDA=0; /发送结束条件的数据信号 _Nop(); /发送结束条件的时钟信号 SCL=1; /结束条件建立时间大于4 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /发送I2C总线结束信号 _Nop(); _Nop(); _Nop(); _Nop();/*- 字节数据传送函数 函数原型: void SendByte(unsigned char c);功能: 将数据c发送出去,可以是地址,也可以是数
11、据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。-*/void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /要传送的数据长度为8位 if(cBitCnt)&0x80)SDA=1; /判断发送位 else SDA=0; _Nop(); SCL=1; /置时钟线为高,通知被控器开始接收数据位 _Nop(); _Nop(); /保证时钟高电平周期大于4 _Nop(); _Nop(); _Nop
12、(); SCL=0; _Nop(); _Nop(); SDA=1; /8位发送完后释放数据线,准备接收应答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA=1)ack=0; else ack=1; /判断是否接收到应答信号 SCL=0; _Nop(); _Nop();/*- 字节数据传送函数 函数原型: unsigned char RcvByte();功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数。 -*/ /*unsigned char RcvByte() unsigned char ret
13、c; unsigned char BitCnt; retc=0; SDA=1; /置数据线为输入方式 for(BitCnt=0;BitCnt8;BitCnt+) _Nop(); SCL=0; /置时钟线为低,准备接收数据位 _Nop(); _Nop(); /时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL=1; /置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc=retc1; if(SDA=1)retc=retc+1; /读数据位,接收的数据位放入retc中 _Nop(); _Nop(); SCL=0; _Nop(); _Nop();
14、 return(retc);*/*- 应答子函数原型: void Ack_I2c(void); -*/*void Ack_I2c(void) SDA=0; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /时钟低电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; /清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); */*- 非应答子函数原型: void NoAck_I2c(void); -*/*void NoAck_I2c(void) SDA=1; _Nop(); _Nop(); _Nop(); SCL
15、=1; _Nop(); _Nop(); /时钟低电平周期大于4 _Nop(); _Nop(); _Nop(); SCL=0; /清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); */*- 向无子地址器件发送字节数据函数 函数原型: bit ISendByte(unsigned char sla,ucahr c); 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla. 如果返回1表示操作成功,否则操作有误。注意: 使用前必须已结束总线。-*/*bit ISendByte(unsigned char sla,unsigned char c) Start_I2
16、c(); /启动总线 SendByte(sla); /发送器件地址 if(ack=0)return(0); SendByte(c); /发送数据 if(ack=0)return(0); Stop_I2c(); /结束总线 return(1);*/*- 向有子地址器件发送多字节数据函数 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 如果返
17、回1表示操作成功,否则操作有误。注意: 使用前必须已结束总线。-*/*bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) unsigned char i; for(i=0;ino;i+) Start_I2c(); /启动总线 SendByte(sla); /发送器件地址 if(ack=0)return(0); SendByte(suba); /发送器件子地址 if(ack=0)return(0); SendByte(*s); /发送数据 if(ack=0)return(0);
18、Stop_I2c(); /结束总线 DelayMs(1); /必须延时等待芯片内部自动处理数据完毕 s+; suba+; return(1);*/*- 向无子地址器件读字节数据函数 函数原型: bit IRcvByte(unsigned char sla,ucahr *c); 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地 址sla,返回值在c. 如果返回1表示操作成功,否则操作有误。注意: 使用前必须已结束总线。-*/*bit IRcvByte(unsigned char sla,unsigned char *c) Start_I2c(); /启动总线 SendByte(s
19、la+1); /发送器件地址 if(ack=0)return(0); *c=RcvByte(); /读取数据 NoAck_I2c(); /发送非就答位 Stop_I2c(); /结束总线 return(1);*/*- 向有子地址器件读取多字节数据函数 函数原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。 如果返回1表示操作成功,否则操作有
20、误。注意: 使用前必须已结束总线。-*/*bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) unsigned char i; 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;ino-1;i+) *s=RcvByte(); /发送数据 Ack_I2c(); /发送就答位 s+; *s=RcvByte(); NoAck_I2c(); /发送非应位 Stop_I2c(); /结束总线 return(1);*/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1