|
楼主 |
发表于 2021-6-6 14:27:08
|
显示全部楼层
单片机与上位机串口的通信程序,单片机接收数据为中断方式,连续接收12字节,向上位机发送数据为随机方式。
- /**********************************************************************
- * USART异步通信
- * 数据位8、停止位1、比特率38400,CPU主频16MHZ
- ***********************************************************************/
- #include<avr/interrupt.h>
- #include "ad9850.h"
- unsigned char control; //仪器控制码(外部可以使用)
- unsigned long f_start=407000; //扫频开始频率4字节(默认407Khz扫频开始, 返回PC480字节)
- unsigned long step=200; //步进2字节(默认频率间隔200Hz, 扫频结束503Khz)
- unsigned int delay=700; //步进延时(默认700us)
- unsigned char db=97; //衰减倍率1字节(默认增益"a","b","c","d","e")
- unsigned char p=50; //A/D通道选择(PC0:频谱仪、PC1:5.12v档、PC2:2.56v档、PC3:Q表)
- /*********************************************************************
- * USART 初 始 化
- **********************************************************************/
- void uart_init(void) //波特率38400(不可调),fosc=16M
- {
- UCSRC = 0x86; //异步,8位加1位停止,无校验位
- UBRRL = 0x19;
- UBRRH = 0x0; //波特率设置
- UCSRB = 0x98; //RXC发送使能
- }
- /*********************************************************************
- * 发 送 函 数
- **********************************************************************/
- void uart_send(unsigned char data)
- {
- while (!(UCSRA & (1<<UDRE))); //="0",等待(=1表示空)
- UDR = data;
- while (!(UCSRA & (1<<TXC))); //="1",发完跳出
- UCSRA |= (1<<TXC); //发送完毕,手动置位(如果是中断发送 会自动置位)
- }
- /*********************************************************************
- * USTAR 中 断 函 数
- * 接受数据结束中断请求
- **********************************************************************/
- unsigned char m; //扫频设置接收字节数
- unsigned long n;
- unsigned long a1,a2,a3; //接收字节缓存
- ISR(USART_RXC_vect)
- {
- UCSRB &=~ (1<<7); //关串口中断
- n=UDR;
- if(m==0)
- {
- if(n==56) //扫频参数传输头"8"标记判断?
- {
- m=10; //连续接收10字节
- f_start=0; //清除以前的设置值
- step=0;
- delay=0;
- control=n; //仪表功能选择
- }
- else
- {
- control=n; //设别码暂存("0"扫频仪,"1,2"频率计,"3"高频Q表,"4"简易声谱仪,"5"频率发生器DDS设置,"6"扫频设置/暂停,"8"扫频参数传输头标记,"9"有载Q表)
- if((control==49)|(control==50))
- ad9850_wr_serial(0x0,1000); //输出1000赫兹标准频率,供频率计标定
- if(control==53)
- ad9850_wr_serial(0x0,f_start); //同步修改DDS频率发生器
- }
- }
- else
- {
- switch(m) //扫频参数传输
- {
- case 10: a1=n; break;
- case 9: a2=n; break;
- case 8: a3=n; break; //缓存在a1:3
- case 7:
- f_start+=a1;
- f_start+=a2<<8;
- f_start+=a3<<16;
- f_start+=n<<24; //合并开始频率f_start
- break;
- case 6: a1=n; break;
- case 5:
- step+=a1;
- step+=n<<8; //合并步进step
- break;
- case 4: a1=n; break;
- case 3:
- delay+=a1;
- delay+=n<<8; //合并步进延时delay
- break;
- case 2: db=n; break; //衰减倍率
- case 1: p=n; break; //A/D通道选择
- }
- m--;
- }
- UCSRB |= (1<<7); //使能串口中断
- }
复制代码 |
|