#include

#include

#define ADDR1 0x2c //MAX5820LEUA

sbit key_sin=P1^0;

sbit key_tran=P1^2;

sbit key_tooth=P1^4;

sbit SCL = P2 ^ 0;

sbit SDA = P2 ^ 1;

unsigned char code sin[256]=     //正弦表

{

0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,

0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,

0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,

0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,

0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,

0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,

0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,

0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,

0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,

0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80

};

bit write_addr(unsigned char,bit);//第一个参数表示地址,第二个参数表示 读:1 写:0

bit write_data(unsigned char);//第一个参数表示数据,第二个参数表示 命令字

void stop();

void Delay(unsigned int);

I2C_Delay(unsigned int I2C_VALUE)

{

while ( --I2C_VALUE!= 0 );

}

/*

函数:I2C_Init()

功能:I2C 总线初始化,使总线处于空闲状态

说明:在 main()函数的开始处,通常应当要执行一次本函数

*/

void I2C_Init()

{

SCL = 1;

I2C_Delay(5);

SDA = 1;

I2C_Delay(5);

}

/*

函数:I2C_Start()

功能:产生I2C 总线的起始状态

说明:

SCL处于高电平期间,当SDA 出现下降沿时启动I2C 总线

不论 SDA 和SCL 处于什么电平状态,本函数总能正确产生起始状态

本函数也可以用来产生重复起始状态

本函数执行后,I2C 总线处于忙状态

*/

void I2C_Start()

{

SDA = 1;

I2C_Delay(5);

SCL = 1;

I2C_Delay(5);

SDA = 0;

I2C_Delay(5);

SCL = 0;

I2C_Delay(5);

}

/*

函数:I2C_Write()

功能:向I2C 总线写1 个字节的数据

参数:

dat:要写到总线上的数据

*/

void I2C_Write(char dat)

{

unsigned char t = 8;

do

{

SDA = (bit)(dat & 0x80);

dat <<= 1;

SCL = 1;

I2C_Delay(5);

SCL = 0;

I2C_Delay(5);

} while ( --t != 0 );

}

bit I2C_GetAck()

{

bit ack;

SDA = 1;

I2C_Delay(5);

SCL = 1;

I2C_Delay(5);

ack = SDA;

SCL = 0;

I2C_Delay(5);

return ack;

}

void I2C_Stop()

{

unsigned int t = 10;

SDA = 0;

I2C_Delay(5);

SCL = 1;

I2C_Delay(5);

SDA = 1;

I2C_Delay(5);

while ( --t != 0 ); //在下一次产生Start 之前,要加一定的延时

}

void Delay(unsigned int I2C_Delay_t)

{

while ( --I2C_Delay_t!= 0 );

}

bit write_addr(unsigned char addr,bit mod)

{

unsigned char address;

address=addr<<1;

if(mod)

address++;

I2C_Start();

I2C_Write(address);

Delay(10);

if(I2C_GetAck())

return 1;

return 0;

}

bit write_data(unsigned char dat)

{

I2C_Write(dat);

if(I2C_GetAck())

return 1;

return 0;

}

void stop()

{

I2C_Stop();

I2C_Init();

}

void main(void)

{

unsigned char i;

loop:

I2C_Init();

while(1)

{

if(key_sin==0)        //产生正弦波

{

while(1)

{

for(i=192;i<255;i++)

{

write_addr(ADDR1,0);

write_data(0);

write_data(sin[i]);

stop();

if(!(key_tran!=0&&key_tooth!=0))

goto loop;

}

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

{

write_addr(ADDR1,0);

write_data(0);

write_data(sin[i]);

stop();

if(!(key_tran!=0&&key_tooth!=0))

goto loop;

}

}

}

if(key_tran==0)        //产生三角波

{

while(1)

{

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

{

write_addr(ADDR1,0);

write_data(0);

write_data(i);

stop();

if(!(key_sin!=0&&key_tooth!=0))

goto loop;

}

for(;i>0;i--)

{

write_addr(ADDR1,0);

write_data(0);

write_data(i);

stop();

if(!(key_sin!=0&&key_tooth!=0))

goto loop;

}

}

}

if(key_tooth==0)  //产生锯齿波

{

while(1)

{

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

{

write_addr(ADDR1,0);

write_data(0);

write_data(i);

stop();

if(!(key_tran!=0&&key_sin!=0))

goto loop;

}

}

}

}

}

三角波c语言编程,51单片机简易波形发生器(正弦波 锯齿波 三角波)仿真+源程序+电路原理图...相关推荐

  1. 基于51单片机的波形发生器(四种波形)(毕业设计资料)

    四种波形的产生,包括锯齿波.三角波.方波.正弦波.通过LCD液晶显示当前波形以及波形的频率.可以通过按键切换波形,并可以通过按键进行设置当前波形的频率大小,也可以设置频率设置不步进值.资料从主页链接中 ...

  2. 呼吸灯51单片机c语言编程,51单片机基于定时器实现呼吸灯(C8051F020单片机)

    一.实现思路 原理:利用PWM信号控制LED灯的亮暗程度,实现LED灯由暗到亮又由亮到暗的渐变过程. 方法:通过定时器设置LED所接引脚的高低电平持续时间,模拟出PWM波. 二.关键问题--PWM的频 ...

  3. pid控制器c51语言编程,51单片机电机pid控制系统程序

    51单片机电机pid控制系统程序 本程序来源网上,小编进行了简单修改,还未验证. /************************* 应用背景:直流电机的额定功率12V,额定转速3000rpm,光码 ...

  4. 51单片机波形发生器51c语言,51单片机实现波形发生器.doc

    word完美格式 精心整理 学习帮手 摘要 这个系统是基于AT89C51单片机的波形信号发生器.使用AT89C51单片机作为控制核心,该系统由数字/模拟转换电路(DAC0832).运放电路(OP07) ...

  5. 基于51单片机的波形发生器proteus仿真数码管LCD12864显示

    仿真图1简介: 本系统采用51单片机作为系统的MCU(具体型号见下图),该系统显示器为四位数码管,可实时显示波形的参数情况 可显示四种波形,分别是方波.正弦波.三角波.锯齿波. 该设计具有电压表功能, ...

  6. 单片机课设基于51单片机的波形发生器(公开资源)(四种波形)(同时输出两种波形)

    单片机课设-波形发生器 前言 一.课设任务是什么? 二.如何解决这几个任务? 三.仿真原理图 四.代码 4.1 LCD1602代码 4.2 波形输出以及8*8点阵显示代码 4.3 波形选择 五.仿真源 ...

  7. 51单片机串行口c语言编程,51单片机串口通信c语言编程

    这只是个模板,参考一下 /*----------------------------------------------- 名称:串口通信 网站:www.doflye.net 编写:shifang 日 ...

  8. 6位密码锁的c语言编程,51单片机4*3矩阵键盘6位密码锁c语言程序

    满意答案 #include #include #define uchar unsigned char uchar key; int i=0; char b[4]={'0','0','0','0'};/ ...

  9. 占空比输出程序c语言,关于51单片机输出频率和占空比可调的PWM波程序问题

    //------------------------------------------------------------------------------------ //程序功能简介:本程序产 ...

  10. 51单片机频率计c语言程序,51单片机简易频率计源代码

    //定时器0 设置定时时间1秒   定时器1 设置计数1秒内的脉冲数量 #include #define uchar unsigned char #define uint unsigned int u ...

最新文章

  1. 编写安装配置DHCP服务脚本
  2. 团队开发——个人工作总结01
  3. 取两堆石子(威佐夫博弈)
  4. 基于Metronic的Bootstrap开发框架经验总结(15)-- 更新使用Metronic 4.75版本
  5. 大象之关于对UML的一些理解
  6. 函数的定义与变量作用域
  7. Windows系统卸载MySQL
  8. matlab控制信号发生器,Matlab 跳频信号发生器
  9. 全栈工程师需要了解掌握的技术栈
  10. 【代理知识】绝对值得珍藏!(转)
  11. python 学习爬取链家武汉二手房市场成交记录
  12. (亲测可行)charles抓包夜神模拟器保姆级教程
  13. STM32添加以太网连接
  14. 在INTEL KABYALAKE平台上运行COREBOOT 记录
  15. android使用popupwindow仿微信点赞功能
  16. 修改远程桌面3389端口批处理
  17. 科技云报道:元宇宙,会是云计算的下一个新战场吗?
  18. Android——跟随手指的小猫咪
  19. 全志T3开发板(4核ARM Cortex-A7)测评合集——从开发板到PLC
  20. Windows Office Word不支持Ctrl多选操作

热门文章

  1. 如何通过组织管理提升团队战斗力?每个CTO都需要了解的三大支柱
  2. FFmpeg进阶:给视频添加文字水印
  3. electron-vue-windows
  4. 我以为我会junit,原来我还不会
  5. android root权限命令行,android在apk中获取root权限,并执行命令
  6. 什么是表压?什么是绝压?表压和绝压什么关系?
  7. POI - 读取Excel2003、Excel2007的兼容性问题
  8. mzy git学习,git推送到远程库(八)
  9. BUUCTF-CRYPTO-强网杯2019 Copperstudy
  10. FPGA2016~2018,FPL2017会议论文整理(持续更新)