📄 z_adda.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 + -