边,还不如把基本的技术记在心里。不要被一些专用词汇所迷惑,最根本的是先了解最基础的知识。掌握单片机的应用开发,入门并不难,难的是长期坚持和不遗余力的学习和实践。
致 谢
在课题完成之际,我首先要向指导老师杨录老师表示深深的感谢。在课题制作期间,我经历了不知从何下手的无助和设计过程中遇到的各种技术困难,都是靠杨老师在百忙之中抽出时间来对我悉心指导,为我们提出了各方面的指导意见,为我们提供各方面的重要资料以及元器件,他是我学习工作进程中的中坚力量。同时也要感谢老师给了我一次锻炼的机会,当然也给了我一次成功的机会。
附录
附录一 系统程序代码
/****************************************************************** //总体电路设计采用总线控制方式
//对外围器件的访问统一采用地址编码方式 //2011-02-18
******************************************************************/ #include
#define ADC XBYTE[0x7FF0] //ADC 0通道地址 #define ADC_CTRL 0xFD //ADC 控制信号 #define DAC XBYTE[0x6FFF] //DAC 地址
#define DAC_CTRL 0xFC //DAC 控制信号
//RAM地址范围为 0x8000~0xffff (共4页) //ADC的地址范围为 0x7ff0~0x7ff7 (共8个通道) //DAC的地址范围为 0x6fff (只要低2位为 ff 即可) static unsigned int RAM_address; //RAM 地址变量,起始地址0x8000 unsigned char count,m,n=1,key = 0xff;
//显示字符编码
unsigned char code zifu[]={0x7e, /*0*/ 0x30, /*1*/ 0x6d, /*2*/ 0x79, /*3*/ 0x33, /*4*/
36
0x5b, /*5*/ 0x5f, /*6*/ 0x70, /*7*/ 0x7f, /*8*/ 0x7b, /*9*/ 0x0e, /*L*/ 0x47, /*F*/
0x00, /*无显示*/ };
//ZLG7289接口定义
sbit ZLG7289CS = P1^5; //片选信号,低电平有效 sbit ZLG7289CLK = P1^6; //时钟信号,上升沿有效 sbit ZLG7289DIO = P1^7; //数据信号,双向
sbit ZLG7289INT = P3^2; //键盘中断请求信号,低电平(负边沿)有效
sbit ADCEOC = P3^3;
void delay_us(unsigned char n) //执行一次约为14us { for(;n--;n>0) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } }
//************************************************************************ //短延时
void nNop(unsigned char i) { for(;i>0;i--) ; } //长延时
void LDelay(unsigned int i) { unsigned int j; for(;i>0;i--) { for(j=1000;j>0;j--);} }
//************************************************************************
37
//函数功能:ZLG7289复位指令 #define ZLG7289_Reset() ZLG7289_Instruc(0xa4)
//***********************************************************************
//函数:SPI_WriteOneByte() //功能:向SPI总线写数据
//说明:写入的数据长度为1字节
void SPI_WriteOneByte(unsigned char Wdata) { unsigned char i; for(i=0;i<8;i++) { ZLG7289DIO = (bit)(Wdata&0x80); ZLG7289CLK = 1; Wdata <<= 1; nNop(1); ZLG7289CLK = 0; nNop(1); } }
//函数:SPI_ReadOneByte() //功能:从SPI总线读数据 //说明:返回1字节数据
unsigned char SPI_ReadOneByte() { unsigned char i,temp;
ZLG7289DIO = 1; //将I/O切换到输入状态 for(i=0;i<8;i++) { ZLG7289CLK = 1; nNop(5); temp <<= 1; if(ZLG7289DIO) temp++; ZLG7289CLK = 0; nNop(5); } return temp; }
//函数:ZLG7289_Instruc()
38
//功能:执行ZLG7289纯指令 //说明:指令长度为1字节
void ZLG7289_Instruc(unsigned char Instruc) { unsigned char i; i = IE; IE &= 0xfa; //禁止外部中断;
ZLG7289CS = 0; nNop(5); SPI_WriteOneByte(Instruc); ZLG7289CS = 1; nNop(5); IE = i;
}
//函数:ZLG7289_Instruc_Data //功能:执行ZLG7289带数据指令
//说明:指令长度以及数据长度均为1字节
void ZLG7289_Instruc_Data(unsigned char Instruc,unsigned char Data) { unsigned char i; i = IE; IE &= 0xfa; ZLG7289CS = 0; nNop(5); SPI_WriteOneByte(Instruc); nNop(5); SPI_WriteOneByte(Data); ZLG7289CS = 1; nNop(5); IE = i; }
//函数:ZLG7289_ReadKey()
//功能:执行ZLG7289读键盘指令 //说明:返回1字节的按键号 // 按键号的范围为:0 ~ 63(即0x0 ~ 0x3f) // 若没有按按键被按下了,返回255(即0xff) unsigned char ZLG7289_ReadKey() { unsigned char Key; ZLG7289CS = 0;
39
nNop(10);
SPI_WriteOneByte(0x15); nNop(5);
Key = SPI_ReadOneByte(); nNop(1);
ZLG7289CS = 1; nNop(5); return Key;
}
//函数:ZLG7289_Download //功能:下载数据
//说明:将要显示的数据下载到ZLG7289内,并译码显示 //参数:数码管编号x,要显示的数据dat
void ZLG7289_Download(unsigned char x,unsigned char dat) { x |= 0x90; //以自己编码的方式进行译码 1001 0xxx ZLG7289_Instruc_Data(x,dat);
}
//ZLG7289初始化函数 void ZLG7289_Init() { LDelay(20); //延时一定时间,以使系统电源稳定 //ZLG7289 I/O 口初始化 ZLG7289CS = 1; ZLG7289CLK = 0; ZLG7289DIO = 1; ZLG7289INT = 1; }
//********************普通录音函数************************* void Record() { unsigned char temp,page,page_ctrl; unsigned int i; for(page=0;page<4;page++) //分4页存储 { switch(page) { case 0:page_ctrl=0xF8;break;//RAM 第一页控制信号 case 1:page_ctrl=0xF9;break;//RAM 第二页控制信号 case 2:page_ctrl=0xFA;break;//RAM 第三页控制信号 case 3:page_ctrl=0xFB;break;//RAM 第四页控制信号
40