论坛风格切换切换到宽版
  • 7208阅读
  • 32回复

帮我测试个软件,AD9851/AD9850电脑控制软件,DDs电脑端程序0-45M信号发生器 [复制链接]

上一主题 下一主题
离线梁海
 
发帖
65
只看楼主 倒序阅读 0楼 发表于: 2014-06-09

想把直接数字合成信号源编程问题转移到电脑上来
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线梁海
发帖
65
只看该作者 1楼 发表于: 2014-06-09

这是软件,帮我看看还要考虑哪些问题
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线梁海
发帖
65
只看该作者 2楼 发表于: 2014-06-09

单片机是STC15F104E
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线梁海
发帖
65
只看该作者 3楼 发表于: 2014-06-09
我用的是usb转串口的小模块,网上3块多钱,连线是
sbit RXB = P3^0; //UART TX/RX port
sbit TXB = P3^1;
//
sbit ad9850_w_clk    =P3^2;//接ad9850的w_clk脚/PIN7
sbit ad9850_fq_up    =P3^3;//接ad9850的fq_up脚/PIN8
sbit ad9850_bit_data =P3^4;//接ad9850的D7脚/PIN25
sbit ad9850_rest     =P3^5;//接ad9850的rest脚/PIN12
离线bg7doz
发帖
498
只看该作者 4楼 发表于: 2014-06-09
支持探索,有时间会试一下。
离线梁海
发帖
65
只看该作者 5楼 发表于: 2014-06-10
这是我用到的硬件,网上买的AD模块,20多元钱,整体成本不到30元。
给他焊了一个插座:

本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线bg9ezn
发帖
182
只看该作者 6楼 发表于: 2014-06-10
很不错, 做好核心就可以了, 界面控制部分放到pc或pda上都是一种很好的选择
离线bg4iww
发帖
8690
只看该作者 7楼 发表于: 2014-06-10
感觉界面有点太花哨了,有待改进
BG4IWW
山东日照——蓝天,碧海,金沙滩,太阳升起的地方
离线徐徐2009
发帖
6543
只看该作者 8楼 发表于: 2014-06-10
增加声控输入, 想要多少就喊多少
QQ616710081  旺旺:电源学习网  
ATS20 ATS25 ATS100 收音机
高频假负载
7.023MHZ 晶振    7.050MHZ 晶振
 DIY 6波段电台
25欧功率合成馈线
手动 自动  50w 短波功放  FT-817功放
FM VHF 1.5W 100W  200W 功放套件 1-2KW短波功放变压器
离线梁海
发帖
65
只看该作者 9楼 发表于: 2014-06-10
这是单片机的内核部分代码
  1. #include <REG51.H>
  2. #include <intrins.h>
  3. #define BAUD 0xFD00// 9600bps @ 22.1184MHz
  4. sfr AUXR = 0x8E;
  5. sbit RXB = P3^0; //UART TX/RX port
  6. sbit TXB = P3^1;
  7. //
  8. sbit ad9850_w_clk =P3^2;//接ad9850的w_clk脚/PIN7
  9. sbit ad9850_fq_up =P3^3;//接ad9850的fq_up脚/PIN8
  10. sbit ad9850_bit_data =P3^4;//接ad9850的D7脚/PIN25
  11. sbit ad9850_rest =P3^5;//接ad9850的rest脚/PIN12
  12. //-----------------------------------------------
  13. sfr IAP_DATA = 0xC2;//IAP数据寄存器
  14. sfr IAP_ADDRH = 0xC3;//IAP地址寄存器高字节
  15. sfr IAP_ADDRL = 0xC4;//IAP地址寄存器低字节
  16. sfr IAP_CMD = 0xC5;//IAP命令寄存器
  17. sfr IAP_TRIG = 0xC6;//IAP命令触发寄存器
  18. sfr IAP_CONTR = 0xC7;//IAP控制寄存器
  19. //写入首地址
  20. #define IAP_ADDRESS 0x0400
  21. #define CMD_IDLE 0//空闲模式
  22. #define CMD_READ 1//IAP字节读命令
  23. #define CMD_PROGRAM 2//IAP字节编程命令
  24. #define CMD_ERASE 3//IAP扇区擦除命令
  25. #define ENABLE_IAP 0x81//if SYSCLK<24MHz
  26. //-----------------------------------------------
  27. unsigned char TBUF;//RBUF;
  28. unsigned char TDAT,RDAT;
  29. unsigned char TCNT,RCNT;
  30. unsigned char TBIT,RBIT;
  31. bit TING,RING;
  32. bit TEND,REND;
  33. unsigned char W[6]={0x0f,0x00,0x00,0x00,0x00,0x00};
  34. unsigned char i,j;
  35. void ad_reset();
  36. void ad_write();
  37. void answer();
  38. //---------------EEprom------------------
  39. //void Delay(unsigned char n);
  40. void IapIdle();
  41. unsigned char IapReadByte(unsigned int addr);
  42. void IapWriteByte(unsigned int addr, unsigned char dat);
  43. void IapEraseSector(unsigned int addr);
  44. //-----------------------------------------------
  45. main ()
  46. {
  47. P3=0x03;
  48. TMOD = 0x00;
  49. AUXR = 0x80; //timer0 工作在1T模式
  50. TL0 = BAUD;
  51. TH0 = BAUD>>8;
  52. TR0 = 1;
  53. ET0 = 1;
  54. PT0 = 1;
  55. EA = 1;
  56. //初始化串口设置
  57. TING = 0;
  58. RING = 0;
  59. TEND = 1;
  60. REND = 0;
  61. TCNT = 0;
  62. RCNT = 0;
  63. j=0;
  64. ad_reset();//AD985X芯片复位准备
  65. // ad_write();//ce shi
  66. for (i=1;i<6;i++)
  67. {
  68. W[i]=IapReadByte(IAP_ADDRESS+i);
  69. }
  70. W[0]=0x83;
  71. //使芯片开始工作
  72. while( 1 )
  73. {
  74. while (!REND);
  75. if(j>=6)j=0 ;
  76. switch (W[0])
  77. {
  78. case 0x80://读取
  79. W[0]=0x01;
  80. answer();//向Pc发送数据回答
  81. //j=0;
  82. break;
  83. case 0x81://联机
  84. W[0]=0x02;
  85. answer();
  86. //j=0;
  87. break;
  88. case 0x82://复位
  89. W[0]=0x03;
  90. ad_reset();
  91. answer();
  92. //j=0;
  93. break;
  94. case 0x83://置频
  95. W[0]=0x04;
  96. ad_reset();//AD985X芯片复位准备
  97. ad_write();
  98. answer();
  99. break;
  100. case 0x84://写入
  101. W[0]=0x05;
  102. IapEraseSector(IAP_ADDRESS);//扇区擦除
  103. for (i=1;i<6;i++)
  104. {
  105. IapWriteByte(IAP_ADDRESS+i, W[i]);
  106. }
  107. answer();
  108. //写ISP/IAP/EEPROM数据
  109. break;
  110. case 0x85://扫频
  111. W[0]=0x06;
  112. break;
  113. }
  114. }
  115. }
  116. //发送数据到串口
  117. void answer()
  118. {
  119. for (i=0; i<6; i++)//发6个字节
  120. {
  121. while (!TEND);
  122. TEND = 0;
  123. TBUF = W[i];
  124. TING = 1;//发送数据到串口
  125. }
  126. }
  127. //定时器模拟串口
  128. void tm0() interrupt 1 using 1
  129. {
  130. if (RING)
  131. {
  132. if (--RCNT == 0)
  133. {
  134. RCNT = 3; //复位发送波特率计数器
  135. if (--RBIT == 0)
  136. {
  137. W[j] = RDAT;//保存数据到RBUF
  138. RING = 0; //停止接收
  139. REND = 1; //接收完成标记
  140. j++ ;
  141. }
  142. else
  143. {
  144. RDAT >>= 1;
  145. if (RXB) RDAT |= 0x80;
  146. }
  147. }
  148. }
  149. else if (!RXB)
  150. {//检测接收脚电平
  151. RING = 1; //set start receive flag
  152. RCNT = 4; //初始化波特率计数器
  153. RBIT = 9; //initial receive bit number (8 data bits + 1 stop bit)
  154. }
  155. if (--TCNT == 0)
  156. {
  157. TCNT = 3;
  158. if (TING)
  159. {
  160. if (TBIT == 0)
  161. {
  162. TXB = 0;
  163. TDAT = TBUF;
  164. TBIT = 9;
  165. }
  166. else
  167. {
  168. TDAT >>= 1;
  169. if (--TBIT == 0)
  170. {
  171. TXB = 1;
  172. TING = 0;
  173. TEND = 1;
  174. }
  175. else
  176. {
  177. TXB = CY;
  178. }
  179. }
  180. }
  181. }
  182. }
  183. //***************************************************//
  184. // ad9850复位(串行模式) //
  185. //---------------------------------------------------//
  186. void ad_reset()
  187. {
  188. ad9850_w_clk=0;
  189. ad9850_fq_up=0;
  190. //rest信号
  191. ad9850_rest=0;
  192. ad9850_rest=1;
  193. ad9850_rest=0;
  194. //w_clk信号
  195. ad9850_w_clk=0;
  196. ad9850_w_clk=1;
  197. ad9850_w_clk=0;
  198. //fq_up信号
  199. ad9850_fq_up=0;
  200. ad9850_fq_up=1;
  201. ad9850_fq_up=0;
  202. }
  203. //***************************************************//
  204. // 向ad9850中写命令与数据(串行) //
  205. //---------------------------------------------------//
  206. void ad_write()
  207. {
  208. unsigned char j;
  209. for(j=1;j<6;j++)
  210. {
  211. for(i=0;i<8;i++)//写w数据
  212. {
  213. ad9850_bit_data=(W[j]>>i)&0x01;
  214. ad9850_w_clk=1;
  215. ad9850_w_clk=0;
  216. }
  217. }
  218. ad9850_fq_up=1;//移入始能
  219. ad9850_fq_up=0;
  220. }//完成
  221. /*----------------------------
  222. EEprom 软件延时
  223. ----------------------------*/
  224. /*
  225. void Delay(unsigned char n)
  226. {
  227. unsigned int x;
  228. while (n--)
  229. {
  230. x = 0;
  231. while (++x);
  232. }
  233. }
  234. */
  235. /*----------------------------
  236. 关闭IAP
  237. ----------------------------*/
  238. void IapIdle()
  239. {
  240. IAP_CONTR = 0; //关闭IAP功能
  241. IAP_CMD = 0; //清除命令寄存器
  242. IAP_TRIG = 0; //清除触发寄存器
  243. IAP_ADDRH = 0x80;//将地址设置到非IAP区域
  244. IAP_ADDRL = 0;
  245. }
  246. /*----------------------------
  247. 从ISP/IAP/EEPROM区域读取一字节
  248. ----------------------------*/
  249. unsigned char IapReadByte(unsigned int addr)
  250. {
  251. unsigned char dat; //数据缓冲区
  252. IAP_CONTR = ENABLE_IAP;//使能IAP
  253. IAP_CMD = CMD_READ; //设置IAP命令
  254. IAP_ADDRL = addr; //设置IAP低地址
  255. IAP_ADDRH = addr >> 8; //设置IAP高地址
  256. IAP_TRIG = 0x5a; //写触发命令(0x5a)
  257. IAP_TRIG = 0xa5; //写触发命令(0xa5)
  258. _nop_(); //等待ISP/IAP/EEPROM操作完成
  259. dat = IAP_DATA; //读ISP/IAP/EEPROM数据
  260. IapIdle(); //关闭IAP功能
  261. return dat; //返回
  262. }
  263. /*----------------------------
  264. 写一字节数据到ISP/IAP/EEPROM区域
  265. ----------------------------*/
  266. void IapWriteByte(unsigned int addr, unsigned char dat)
  267. {
  268. IAP_CONTR = ENABLE_IAP;//使能IAP
  269. IAP_CMD = CMD_PROGRAM; //设置IAP命令
  270. IAP_ADDRL = addr; //设置IAP低地址
  271. IAP_ADDRH = addr >> 8; //设置IAP高地址
  272. IAP_DATA = dat; //写ISP/IAP/EEPROM数据
  273. IAP_TRIG = 0x5a; //写触发命令(0x5a)
  274. IAP_TRIG = 0xa5; //写触发命令(0xa5)
  275. _nop_(); //等待ISP/IAP/EEPROM操作完成
  276. IapIdle();
  277. }
  278. /*----------------------------
  279. 扇区擦除
  280. ----------------------------*/
  281. void IapEraseSector(unsigned int addr)
  282. {
  283. IAP_CONTR = ENABLE_IAP;//使能IAP
  284. IAP_CMD = CMD_ERASE; //设置IAP命令
  285. IAP_ADDRL = addr; //设置IAP低地址
  286. IAP_ADDRH = addr >> 8; //设置IAP高地址
  287. IAP_TRIG = 0x5a; //写触发命令(0x5a)
  288. IAP_TRIG = 0xa5; //写触发命令(0xa5)
  289. _nop_(); //等待ISP/IAP/EEPROM操作完成
  290. IapIdle();
  291. }


离线梁海
发帖
65
只看该作者 10楼 发表于: 2014-06-10
回 徐徐2009 的帖子
徐徐2009:增加声控输入, 想要多少就喊多少 (2014-06-10 11:26) 

换现成的语音输入法就可以,而且别人在使劲的更新使其适应不同的方言发音,识别率高的如讯飞语音,IBM的带命令功能
离线梁海
发帖
65
只看该作者 11楼 发表于: 2014-06-10
功能说明
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线BG6KHC
发帖
488
只看该作者 12楼 发表于: 2014-06-10
界面太花了,要简单明了,才好吧。
123
离线梁海
发帖
65
只看该作者 13楼 发表于: 2014-06-10
回 BG6KHC 的帖子
BG6KHC:
界面太花了,要简单明了,才好吧。

是这个样子吗?

[ 此帖被梁海在2014-06-10 17:44重新编辑 ]
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线bigham
发帖
432
只看该作者 14楼 发表于: 2014-06-10
不错,可以开发更多的功能。
:171: 15604521627
建行 4367420991529133465
王波
离线bigham
发帖
432
只看该作者 15楼 发表于: 2014-06-10
我用STC12C5A60S2下载这个,可以用吗?
:171: 15604521627
建行 4367420991529133465
王波
离线梁海
发帖
65
只看该作者 16楼 发表于: 2014-06-10
需要改下代码,STC12C5A60S2有串口,我的那个用模拟串口
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线bigham
发帖
432
只看该作者 17楼 发表于: 2014-06-10
才开始学单片机不会改代码。只是手头有STC12C5A60S2,想试一下。
:171: 15604521627
建行 4367420991529133465
王波
离线梁海
发帖
65
只看该作者 18楼 发表于: 2014-06-10
回 bigham 的帖子
bigham:才开始学单片机不会改代码。只是手头有STC12C5A60S2,想试一下。 (2014-06-10 19:52) 

可以一试,晶振是内部的22.1184M的,写程序时注意调整!
离线梁海
发帖
65
只看该作者 19楼 发表于: 2014-06-10
本主题包含附件,请 登录 后查看, 或者 注册 成为会员