⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sin.c

📁 用单片机16F877A外接MAX518实现正弦波输出
💻 C
字号:
	#include	<pic.h>
//本程序将通过PIC16F877的I2C方式驱动D/A转换器MAX518,使其D/A0通道输出
//一个连续的正弦波形(注:本程序并没对正弦波的频率进行控制)
const  char  table[ ] = {0X80,0X86,0X8D, 0X93,0X99,0X9F,0XA5,0XAB,
0XB1,0XB7,0XBC,0XC2,0XC7,0XCC,0XD1,0XD6,0XDA,0XDF,0XE3,0XE7,0XEA,0XEE,0XF1,0XF4,0XF6,0XF8,0XFA,0XFC,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFB,0XF9,0XF7,0XF5,0XF2,0XEF,0XEC,0XE9,0XE5,0XE1,0XDD,0XD8,0XD4,0XCF,0XCA,0XC5,0XBF,0XBA,0XB4,0XAE,0XA8,0XA2,0X9C,0X96,0X90,0X89,0X83,0X80,0X79,0X72,0X6C,0X66,0X60,0X5A,0X55,0X4E,0X48,0X43,0X3D,0X38,0X33,0X2E,0X29,0X25,0X20,0X1C,0X18,0X15,0X11,0X0E,0X0B,0X09,0X07,0X05,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X04,0X06,0X08,0X0A,0X0D,0X10,0X13,0X16,0X1A,0X1E,0X22,0X27,0X2B,0X30,0X35,0X3A,0X40,0X45,0X4C,0X51,0X57,0X5D,0X63,0X69,0X6F,0X76,0X7C};
//以上的数组用于存放正弦表,在定义数组时,前面应该加上 const,
//以使数组存放于ROM中,而不至于占用太多的RAM
unsigned  	char  i;
unsigned 		char 	j;
unsigned 		char 	n;
//I2C初始化子程序
void		i2cint()
{
	SSPCON = 0X08;			//初始化SSPCON寄存器
	TRISC3 =1;				//设置SCL为输入口
	TRISC4 =1;				//设置SDA为输入口
	TRISA4 = 0;
	SSPSTAT=0X80;			//初始化SSPSTAT寄存器
	SSPADD=0X02;			//设定I2C时钟频率
	SSPCON2=0X00;			//初始化SSPCON2寄存器
	di();					//关闭总中断
	SSPIF=0;				//清SSP中断标志
	RA4=0;					//关掉74HC165的移位时钟使能,以免74HC165
							//移位数据输出与I2C总线的数据线发生冲突
	SSPEN=1;				//SSP模块使能
}
//I2C总线输出数据子程序
void		i2cout()
{
	SEN=1;					//产生I2C启动信号
	for(n=0x02;--n;)	continue;//给予一定的延时,保证启动
    while(SSPIF==0)
    {
     RSEN=1;
     }
			                 //产生I2C启动信号
		                    //如果没能启动,则反复启动,直到启动为止
	SSPIF=0;				//SSPIF标志清0
	SSPBUF=0X58;			//I2C总线发送地址字节
do	{
		;
	}while(SSPIF==0);		//等待地址发送完毕
	SSPIF=0;				//SSPIF标志清0
	SSPBUF=0X01;			//I2C总线发送命令字节
do	{
		;
	}while(SSPIF==0);		//等待命令发送完毕
	SSPIF=0;				//SSPIF标志清0
	SSPBUF=j;				//I2C总线发送数据字节
do	{
		;
	}while(SSPIF==0);		//等待数据发送完毕
	SSPIF=0;				//SSPIF标志清0
	PEN=1;					//产生停止条件
do	{
		;
	}while(SSPIF==0);		//等待停止条件产生
	SSPIF=0;				//SSPIF标志清0	
}
//主程序
main ()
{
	i2cint();					//I2C初始化
while(1){
		for(i=0x00;i<=127;++i)
		{	
			j=table[i];		//从数组中得到需要传输的数据量
			i2cout();		//利用I2C总线方式送出数据
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -