完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`项目概述: 本设计以深联华高可靠性,高安全性8位单片机“安芯一号”为主控核心,结合ADI公司先进的DDS芯片AD9850,配合LCD液晶及其他外围芯片,搭建一套廉价,高性能,高灵活性的信号发生器系统。主要指标包括: 1.信号频率:0到20MHz无级可调且显示 2.信号幅度:0到5V无级可调 3.信号类型:正弦波,方波双输出 4.高定制性的扫频功能 5.产生数字调制信号:PSK,FSK(这四种结合AD9850比较方便,其他AM,ASK视情况而定)及PWM信号,脉冲,阶跃等信号。 系统框图如下: ![]() 主要有以下创新点: 1.采用编码器对信号频率和幅度进行无级调节,并且加入"飞棱"(转速快,变化幅度大)设计 2.争取达到市面上主流信号发生器的频率性能和噪声性能 3.采用触摸键盘设计,为系统增加亮点。 时间安排: 2013.11.01-2013.11.10 设计方案确定,包括主控,核心外围器件,输入输出元件,显示器件,通讯器件等 2013.11.10-2013.11.17 确定电路原理图,做第一个PCB版本。 2013.11.23-2013.12.10 进行PCB打样,对硬件进行评估与测试,寻找硬件BUG和不足。 2013.12.11-2013.12.20 进行软件设计,在软件开发过程中进一步改善并优化硬件。 2013.12.20-2013.12.31 决定是否进行第二次打样,完成最终作品的设计和调试。` |
|
相关推荐
8 个讨论
|
|
论坛提示无法上传附件了。那就不传附件了,把核心代码贴一下吧:AD9850模块驱动程序,包括两个函数,DDS_Init()初始化,和串行写入函数。
void DDS_Init(void) { DDS_WCLK=0; DDS_PQUD=0; DDS_REST=0; DDS_REST=1; DDS_REST=0; } void ad9850_write(unsigned char w0,float frequence) { unsigned char i,w; long int y; y=(u32)(34.36f*frequence); w=(y>>=0); for(i=0;i<8;i++) { DDS_DATA=(w>>i)&0x01; DelayHard(5); DDS_WCLK=1; DelayHard(5); DDS_WCLK=0; DelayHard(5); } //?w3?? w=(y>>8); for(i=0;i<8;i++) { DDS_DATA=(w>>i)&0x01; DelayHard(5); DDS_WCLK=1; DelayHard(5); DDS_WCLK=0; DelayHard(5); } //?w2?? w=(y>>16); for(i=0;i<8;i++) { DDS_DATA=(w>>i)&0x01; DelayHard(5); DDS_WCLK=1; DelayHard(5); DDS_WCLK=0; DelayHard(5); } //?w1?? w=(y>>24); for(i=0;i<8;i++) { DDS_DATA=(w>>i)&0x01; DelayHard(5); DDS_WCLK=1; DelayHard(5); DDS_WCLK=0; DelayHard(5); } //?w0?? w=w0; for(i=0;i<8;i++) { DDS_DATA=(w>>i)&0x01; DelayHard(5); DDS_WCLK=1; DelayHard(5); DDS_WCLK=0; DelayHard(5); } //???? DDS_PQUD=1; DelayHard(5); DDS_PQUD=0; DelayHard(5); } |
|
|
|
|
|
本帖最后由 stars9999 于 2014-1-13 10:15 编辑
按键扫描函数(编码器判断不是很理想,旋转快了左右转会判错,有待改进): bdata u8 KeyStatus=0; ***it K1 = KeyStatus^0; ***it S1A= KeyStatus^1; ***it S1B= KeyStatus^2; ***it K2= KeyStatus^3; ***it S2A= KeyStatus^4; ***it S2B= KeyStatus^5; bdata u8 KeyStatusOld=0; ***it K1Old = KeyStatusOld^0; ***it S1AOld= KeyStatusOld^1; ***it S1BOld= KeyStatusOld^2; ***it K2Old= KeyStatusOld^3; ***it S2AOld= KeyStatusOld^4; ***it S2BOld= KeyStatusOld^5; void KeyInit(void) { KeyStatus=P2&0x3F; KeyStatusOld=P2&0x3F; } /********************* 0: 没有键按下 1: K1按下 2: S1左转 3: S1右转 4: K2按下 5: S2左转 6: S2右转 ************************/ u8 key_scan(void) { u8 key=0; KeyStatus=P2&0x3F; while(KeyStatus !=KeyStatusOld) { if(S1A!=S1AOld) { while(S1B!=S1A) KeyStatus=P2&0x3F; S1AOld=S1A; S1BOld=S1A; key=3; } if(S1B!=S1BOld) { while(S1B!=S1A) KeyStatus=P2&0x3F; S1BOld=S1B; S1AOld=S1B; key=2; } if(S2A!=S2AOld) { while(S2B!=S2A) KeyStatus=P2&0x3F; S2AOld=S2A; S2BOld=S2A; key=5; } if(S2B!=S2BOld) { while(S2B!=S2A) KeyStatus=P2&0x3F; S2BOld=S2B; S2AOld=S2B; key=6; } if(K1==0) { while(K1==0)KeyStatus=P2&0x3F; key=1; } if(K2==0) { while(K2==0)KeyStatus=P2&0x3F; key=4; } } return key; } |
|
|
|
|
|
液晶已经用烂了,应该参考价值不大,也贴上吧: /*----------------------------------------------------------------------- LcdWriteByte : 使用SPI接口写数据到LCD 输入参数:data :写入的数据; command :写数据/命令选择; 编写日期 :2004-8-10 最后修改日期 :2004-8-13 -----------------------------------------------------------------------*/ void LcdWriteByte(u8 dat, u8 command) { u16 i; LCD_CE = 0; // 使能LCD if (command == 0) LCD_DC = 0; // 传送命令 else LCD_DC = 1; // 传送数据 SpiSendByte(dat); for(i=0;i<10;i++); /****************************************************************************** 使用硬件SPI总线后,需要在每次发送一个字节之后进行延时,延时时间根据clk速率而变化, 否则液晶屏无法响应,数据出现错误。这个应该和液晶屏特性有关系。 延时时间和一帧数据的长度有关系 ******************************************************************************/ LCD_CE= 1; } void LcdInit(void) { SpiInit(SSIG|MSTR);//|CPOL|CPHA LCD_RST = 0; // 产生一个让LCD复位的低电平脉冲 _nop_(); LCD_RST = 1; LcdWriteByte(0x21, 0); // 使用扩展命令设置LCD模式 0 0 1 0 PD(掉电模式) V(垂直寻址) H(扩展指令) LcdWriteByte(0xb9, 0); // 设置偏置电压0xc8 0x40--0xff 越小,对比度越浅,无法看清,越大,变得漆黑一片。合适的值在0xb0---0xc8 LcdWriteByte(0x06, 0); // 温度校正 设置低的话,漆黑一片,什么也看不到 0x04————0x07 LcdWriteByte(0x13, 0); // 1:48 设置偏置电平 BS2 BS1 BS0 设置越小,对比度越大,但是越黑 0x10--0x17 LcdWriteByte(0x20, 0); // 使用基本命令 LcdClearAll(); // 清屏 LcdWriteByte(0x0c, 0); // 设定显示模式,正常显示 0 0 0 0 1 D() 0 E() 00空白 10普通 01开所有段 11反转映像 LCD_CE = 1;// 关闭LCD } /*----------------------------------------------------------------------- LCD_clear : LCD清屏函数 编写日期 :2004-8-10 最后修改日期 :2004-8-10 -----------------------------------------------------------------------*/ void LcdClearBmp(void) { u16 i; LCD_CE= 1; LcdWriteByte(0x22, 0); // 使用扩展命令设置LCD模式 0 0 1 0 PD(掉电模式) V(垂直寻址) H(扩展指令) LcdWriteByte(0x0c, 0); LcdWriteByte(0x80, 0); for (i=0; i<288; i++) LcdWriteByte(0, 1); LcdWriteByte(0x20, 0); // 使用扩展命令设置LCD模式 0 0 1 0 PD(掉电模式) V(垂直寻址) H(扩展指令) LCD_CE=0; } void LcdClearAll(void) { u16 i; LcdWriteByte(0x22, 0); // 使用扩展命令设置LCD模式 0 0 1 0 PD(掉电模式) V(垂直寻址) H(扩展指令) LcdWriteByte(0x0c, 0); LcdWriteByte(0x80, 0); for (i=0; i<504; i++) LcdWriteByte(0, 1); LcdWriteByte(0x20, 0); // 使用扩展命令设置LCD模式 0 0 1 0 PD(掉电模式) V(垂直寻址) H(扩展指令) } /*----------------------------------------------------------------------- LCD_set_XY : 设置LCD坐标函数 输入参数:X :0-83 Y :0-5 编写日期 :2004-8-10 最后修改日期 :2004-8-10 -----------------------------------------------------------------------*/ void LcdSetXY(u8 X, u8 Y) { LcdWriteByte(0x40 | Y, 0); // column LcdWriteByte(0x80 | X, 0); // row } /*----------------------------------------------------------------------- LCD_write_char : 显示英文字符 输入参数:c :显示的字符; 编写日期 :2004-8-10 最后修改日期 :2004-8-10 -----------------------------------------------------------------------*/ void LcdWriteChar(u8 c) { u8 line; c -= 32; for (line=0; line<6; line++) LcdWriteByte(font6x8[c][line], 1); //LcdWriteByte(0xf8, 1); } /*----------------------------------------------------------------------- LCD_write_english_String : 英文字符串显示函数 输入参数:*s :英文字符串指针; X、Y : 显示字符串的位置,x 0-83 ,y 0-5 编写日期 :2004-8-10 最后修改日期 :2004-8-10 -----------------------------------------------------------------------*/ void LcdWriteEnglishStr(u8 X,u8 Y,u8 *s) { LcdSetXY(X,Y); do{ LcdWriteChar(*s); s++; } while((*s)!=' |