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

📄 z_adda.c

📁 MCS-51单片机实验 39个实用实验和源码
💻 C
字号:
/*-------------------------------------------------------------
**
**  版权:上海航虹高科技有限公司,2002年
**
**  文件名:ADda4.c   //与5196ET相连,数字电位器、
**
**  描述:  本文件是与5196ET实验机配套完成的实验程序。(综合版)
**  更改:  FOR  EAT598实验机
**--------------------------------------------------------------
*/
/*-------------------------------------------------------------
**       文件包括
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
**
*/
#include <reg51.h>          //定义51单片机特殊功能寄存器的值的标准头文件

#define XBYTE ((unsigned char volatile *) 0x020000L)
//#define CBYTE ((unsigned char volatile *) 0x050000L)
//#define DBYTE ((unsigned char volatile *) 0x040000L)
#define z8279 XBYTE[0xf239]   //8279命令/状态口//
#define d8279 XBYTE[0xf238]   //8279数据口//


sbit clk=P1^0;
sbit addr=P1^1;
sbit adcs=P1^2;
sbit eoc=P1^3;
sbit dout=P1^4;

sbit din=P1^5;
sbit sclk=P1^6;
sbit dacs=P1^7;
unsigned int data adData,daData,daIn;
unsigned char data x1,addrD;
unsigned char data step;//用于sine

unsigned char data upDown;

unsigned char data ledWait;
	
unsigned char data disp[5];//显示
unsigned char code led[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                          /*  0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7,  8  ,  9*/
							0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
							//a,b,c,d,e,f
unsigned code sin[128]={
					0x800,0x864,0x8c8,0x92c,0x98c,0x9f0,0xa50,0xab1,
					0xb0f,0xb6b,0xbc5,0xc1c,0xc71,0xcc3,0xd13,0xd5f,
					0xda8,0xded,0xe2f,0xe6c,0xea6,0xedc,0xf0e,0xf3b,
					0xf64,0xf88,0xfa7,0xfc2,0xfd8,0xfe9,0xff6,0xffd,
					0xfff,0xffd,0xff6,0xfe9,0xfd8,0xfc2,0xfa7,0xf88,
					0xf64,0xf3b,0xf0e,0xedc,0xea6,0xe6c,0xe2f,0xded,
					0xda8,0xd5f,0xd13,0xcc3,0xc71,0xc1c,0xbc5,0xb6b,
					0xb0f,0xab1,0xa52,0x9f1,0x98f,0x92c,0x8c8,0x864,
					0x800,0x79b,0x737,0x6d3,0x670,0x60e,0x5ad,0x54e,
					0x4f0,0x494,0x43a,0x3e3,0x38e,0x33c,0x2ec,0x2a0,
					0x257,0x212,0x1d0,0x193,0x159,0x123,0x0f1,0x0c4,
					0x09b,0x077,0x058,0x03d,0x027,0x016,0x009,0x002,
					0x000,0x002,0x009,0x016,0x027,0x03d,0x058,0x077,
					0x09b,0x0c4,0x0f1,0x123,0x159,0x193,0x1d0,0x212,
					0x257,0x2a0,0x2ec,0x33c,0x38e,0x3e3,0x43a,0x494,
					0x4f0,0x54e,0x5ad,0x60e,0x670,0x6d3,0x737,0x79b
					};
/*-------------------------------------------------------------
**       函数定义
**-------------------------------------------------------------
*/

/*-------------------------------------------------------------
**  函数名:adOut
**  格式: void adOut()
**  返回值: 无
**  描述: 模数转换
**  算法:从高位一位位传送,在CLK上升沿有效
**-------------------------------------------------------------
*/	
void adOut()//anolog to digitial (on the rising edge of i/o clk)
{
	unsigned char data i;
	adcs=0;
	adData=0;	
	x1=addrD;
	for(i=0;i<10;i++)
	{
		if(i<4)		//first four write address
		{
			if((x1&0x08)==0)
				addr=0;
			else 
				addr=1;	
			x1=x1<<1;					
		}
		adData=adData<<1;//digital data out
		if(dout==1)
		adData+=0x01;
		clk=1;
		clk=0;	
	}
	adcs=1;	//cs用于1、3、5mode 
}

/*-------------------------------------------------------------
**  函数名:dispLed
**  格式: void dispLed()
**  返回值: 无
**  描述:8279显示方式
**  算法:将10位数据送3个显示缓冲区,送8279数据口
**-------------------------------------------------------------
*/
void dispLed()//改变LED
{
	unsigned char num;	
	disp[0]=adData&0x00f;
	disp[1]=(adData>>4)&0x00f;
	disp[2]=(adData>>8)&0x00f;
	disp[3]=0x10;
	disp[4]=addrD;
	for(num=0;num<5;num++)	
	{
		z8279=0x80+num;   //显示的RAM地址加上位置偏移量n
		d8279=led[disp[num]];  //数据x1送8279数据口地址
	}
}

void sta8279()	//初始化8279
{   
    z8279=0x00; //00表示左键输入,八位字符显示
    z8279=0x2f; //2f表示键盘扫描速率
    z8279=0xc1; //C1清除显示RAM
}

/*-------------------------------------------------------------
**  函数名:da1
**  格式: void da1()
**  返回值: 无
**  描述: 数模转换(12位数据位)
**  算法:从高位一位位传送,在SCLK上升沿写入
**-------------------------------------------------------------
*/
void da1()//将数据写入DA,先高位,上升沿有效
{
	unsigned char data i;
	dacs=0;
	for(i=0;i<12;i++)//12位数据输入,最后两位为0;
	{
		if((daData&0x800)==0)
			din=0;
		else 
			din=1;
		sclk=1;
		sclk=0;
		daData=daData<<1;
	}
	dacs=1;
}

/*-------------------------------------------------------------
**  函数名:zigzap
**  格式: void zigzap()
**  返回值: 无
**  描述: 锯齿波
**  算法:
**-------------------------------------------------------------
*/
void zigzap()
{
	daIn+=64;
	if(daIn>0xffc)daIn=0;
	daData=daIn;
	da1();
}

/*-------------------------------------------------------------
**  函数名:sine
**  格式: void sine()
**  返回值: 无
**  描述: 正弦波
**  算法:
**-------------------------------------------------------------
*/
void sine()
{
	if(step>128) step=0;
	daData=sin[step];
	da1();
	step+=1;
}

/*-------------------------------------------------------------
**函数名:timer0
**格式:void timer0()interrupt 1 using 1
**返回值:无
**描述:定时中断0子程序,定时时间为100us,中断时调用正弦波子程序
**算法:首先重置定时常数, 每次响应中断,都要调用正弦波子程序   
**--------------------------------------------------------------
*/
void timer0()interrupt 1 using 1
{
	
	TR0=0;
	TL0=0xa3;//100us//d1;	//50us
	TH0=0xff;	//	
	TR0=1;
	
//	zigzap();	
	sine();
	if(ledWait!=0) ledWait--;
}

/*---------------------------------------------------------------
**函数名:main
**格式:void main()
**返回值:无
**描述:主程序
**算法:
**--------------------------------------------------------------
*/
void main ()//将数字量转化成模拟量,再将模拟量转换成数字量。
{
	TMOD=0x01;//T0方式1
 	TL0=0xd1;	//50us
 	TH0=0xff;
 	TR0=1;	//T/C0
 	ET0=1;	//T/C0 interrupt
 	EA=1;	// cpu interrupt
 		
	sta8279();//start8279
	adcs=1;//初试化TLC1543
	clk=0;
	
	dacs=1;	
	sclk=0;//初试化TLC5615
	daData=0;
	
	while(1)	
	{
		addrD=0x09;
		while (eoc==0){}
		adOut();
		
		dispLed();
		ledWait=250;
		while(ledWait!=0){}
		ledWait=250;
		while(ledWait!=0){}
		
	}
}

⌨️ 快捷键说明

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