已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
哈尔滨理工大学认 识 实 习 姓 名: 谷允捷 班 级: 通信13-1 学 号: 130503105 评阅教师: 成 绩: 说 明: 2016年 1月 8日内 容: 识实习具体内容:使用stm8单片机系统设计一款可调式数字收音机,指定应用芯片为stm8s103和rda5807,要求使用按键进行电台频率搜索,指定频率进行播放调频广播内容,使用数码管显示当前调频频率,并能进行音量控制。成绩标准: 1.优秀:(1)报告完整清晰。 (2)实验基本功能完成良好,并且增加两个以 上模块的功能,运行正确。 (3)答辩考核回答基本正确。 2.良好:(1)报告基本完整。 (2)实验基本功能完成,并能够增加部分功能。 (3)答辩考核回答部分正确。 3.中、及格:(1)报告基本完整。 (2)实验部分功能完成。 (3)答辩考核回答部分正确。 4.不及格:(1)多次无假条缺勤。 (2)无报告,不参加考核。 (3)报告及实验演示效果严重雷同。 (4)实验无现象。 (5)答辩考核不合格。 实习要求1. 实习目的 使用stm8单片机系统设计一款可调式数字收音机,指定应用芯片为stm8s103和rda5807,要求使用按键进行电台频率搜索,指定频率进行播放调频广播内容,使用数码管显示当前调频频率,并能进行音量控制。2. 实习内容本次实习要求使用配发stm8单片机实现数字接收机功能,使是收音机能接收到一定频率信号,并且在答辩调试过程中不能出现差错,要求收台清晰,不得出现自动跳台,声音混杂程度过高等现象。调整音量时,要能实现从115音量连续跳变,不得出现漏掉音量以及不受控制就使音量跳变等情况,将课堂上学到的理论知识与实际应用结合起来,对电子电路、 电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、 相关仪器设备的使用技能等方面得到较全面的锻炼和提高。3. 实习要求(1) 实现实习要求,做出调频收音机(2) 了解iic协议的书写方式(3) 掌握本次实习的所需要的部分硬件电路,及其在整体电路中所起的作用。(4) 充分了解本次实习所用到的程序,了解每一部分的作用(5) 分析程序流程,画出主程序,子程序的流程图了解每一部分应用(6) 实现按键的充分利用,在没有使用的按键上添加可以使用的成分,以实现电路的4. 实习器材(1) stm8单片机: 提供硬件电路与各种器材(2) pc: 用于下载程序(3) st-link: 用于连接 pc 和学习板,将编码程序下载到单片机中。(4) 电源线: 用于给单片机学习板上电,电压为 5v。(5) 耳机: 用于接收机输出放音(6) 橡胶按键: 因为单片机上的键盘为电容键盘,所以我们要借助橡胶按键控制(7) 直流电机: 用于对本次实习的扩展三.关键程序分析#include /头文件#includetm1628.h/1628 /控制数码管芯片#define u8 unsigned char /宏定义#define u16 unsigned int /宏定义#define u32 unsigned long /宏定义u16table110=0xeb,0x28,0xb3,0xba,0x78,0xda,0xdb,0xa8,0xfb,0xfa; /数码管显示地址 不带小数点数组u16 table210=0xef,0x2c,0xb7,0xbe,0x7c,0xde,0xdf,0xac,0xff,0xfe; /数码管显示数据 带小数点数组unsigned int tempp=0;unsigned int flag=0;int main() unsigned int temp=0x9088; /起作用的是最后一位将初始音量设置为8 unsigned int r_key; /定义存储按键位置的变量 unsigned int sound; /定义储存声音字符的变量 unsigned int shang1,shang2,shang3; /定义数码管字符变量 unsigned char yu1,yu2,yu3; /定义用于储存余数的变量 clk_config(); /时钟初始化函数 tm_init(); /tm1628初始化设置函数 radio_init(); /radio初始化设置函数tm_w_command(0x03); /设置显示模式,7位10段模式,这是对数码管的设置 tm_w_command(0x44); /设置固定地址模式,写数据到寄存器 while(1) /此语句在函数运行的过程中一直在执行,不断重复扫描 r_key=tm_r_key(); /扫描按键函数,用于确定哪个按键被按下 if(r_key=1) /按键1按下 while(tm_r_key()=1); /等待按键1抬起(防抖)消抖作用 seek_up(); /向上跳台,此函数包括把频点存到tempp中 yu1=tempp%100; /计算频率百位数后的余数 shang1=(tempp-yu1)/100; /计算频率百位数 yu2=yu1%10; /计算频率十位数后的余数 shang2=(yu1-yu2)/10; /计算频率十位数 yu3=yu2%1; /计算频率个位数后的余数 shang3=(yu2-yu3)/1; /计算频率个位数 tm_w_data(0x08,table1shang1); /百位数数码管显示频率百位数 tm_w_data(0x0a,table2shang2); /十位数数码管显示频率带点十位数 tm_w_data(0x0c,table1shang3); /个位数数码管显示频率个位数 tm_w_command(0x8e); /设置显示开,小灯亮暗程度 0x08代表grid5的高八位,也就是位选百位数码管,并将不带小数点百位数字的shang1对应的数码管字符写进该位置,实现百位数码管显示 if(r_key=2) /按键2按下 while(tm_r_key()=2); /等待按键2抬起 seek_down(); /向下调台 yu1=tempp%100; /计算频率百位数后的余数 shang1=(tempp-yu1)/100; /计算频率百位数 yu2=yu1%10; /计算频率十位数后的余数 shang2=(yu1-yu2)/10; /计算频率十位数 yu3=yu2%1; /计算频率个位数后的余数 shang3=(yu2-yu3)/1; /计算频率个位数 tm_w_data(0x08,table1shang1); /百位数数码管显示 tm_w_data(0x0a,table2shang2); /十位数数码管显示 tm_w_data(0x0c,table1shang3); /个位数数码管显示 tm_w_command(0x8e); /设置显示开,小灯亮暗程度 if(r_key=3) /按键3按下(音量增大功能) if(temp&0x000f)0x0000) /判断音量是否大于0 temp-; /音量递减1 standard_w_word(0x05,temp); /写数据到05寄存器 sound=temp&0x000f; /取出音量的后四位 if(sound=0x0000) /如果音量为0 tm_w_data(0x0c,0xeb); /数码管个位显示音量0 tm_w_data(0x0a,0x00); /数码管十位全灭 tm_w_data(0x08,0x00); /数码管百位全灭 。 if(sound=0x000f) /判断后四位是否为15 tm_w_data(0x0c,0xda); /数码管个位显示5 tm_w_data(0x0a,0x28); /数码管十位显示1 tm_w_data(0x08,0x00); /数码管百位灭 tm_w_command(0x8e); /设置显示开,小灯亮暗程度 delay_nms(5000); /延时5毫秒 if(r_key=5) /按键5按下 tm_w_data(0x08,table1shang1); /数码管个位显示当前频率个位 tm_w_data(0x0a,table2shang2); /数码管十位显示当前频率十位 tm_w_data(0x0c,table1shang3); /数码管百位显示当前频率百位 tm_w_command(0x8e); /设置显示开,小灯亮暗程度 delay_nms(5000); /延时5毫秒 四.电路原理分析1电源供电电路 vdd/vss:主电源(3v到5.5v) vdd/vss引脚用于给内部主电压调节器(mvr)和内部低功耗电压(lpvr)调节器供电。这两个调节器的输出连接在一起,向mcu的核(cpu, flash和ram)提供1.8v电源(v18)。usb窜口提供5v电源,asm1117 是用于交换式电源 5v 至 3.3v 的线性稳压器。通过此电路可以将 5v 的电源电压转换成 3.3v。 在本电路中使用3.3v的电压对stm8 vdd引脚供电,并且在以后使用的各种芯片上也都是有3.3v电压供电的,如:ch340,tm1628,rda5807具体详情可以参考电路原理图。2.usb转串口:ch340通信硬件电路 低端的单片机是不支持 usb 的, 只有串口, 所以 ch340 芯片的作用就是连接了单片机和上位机, 以完成通信。usb 接口上的 dm 和 dp 是通信的两个 接 口。uart-usb-dp 连 接 到 usb 总 线 的 d+ 数 据 线, uart-usb-dm 连接到 usb 总线的 d-数据线,它们是 ch340 芯片(usb 转串口芯片) 的输入。 3.stm8芯片 本次实习使用到了stm8的以下引脚.vdd,通过asm1117提供了3.3v的供电。.通信引脚:rxd_stm 与txd_stm,通过板子上的跳帽与ch340芯片的txd_stm与rxd_stm链接,以实现stm8的串口通信。led cs,led clk,led dio三个与tm1628连接的引脚,用以实现对按键的检测以及对数码管的控制iic sda ,iic scl,这两个引脚与rda芯片相连,以实现对iic通信协议的模式调整4tm1628芯片由3.3v电压控制,dio,clk 与stb一起实现对指定地址的写入与对模式的选择。1 grid14 是用来控制 led 灯的, 2 grid57 是用来控制数码管的,3的 k1、k2 是用来控制按键的,至于 seg110 在所用功能中复用。 stm8 单片机通过led-dio、 led-clk、 led-cs 这三个引脚来控制 tm1628 芯片, 从而对 led、 按键和数码管进行控制。5.共阴数码管: 共阴极数码管就是发光二极管的所有的阴极连接到一块,当 grid 置 0 时, 选定当前的数码管, seg18 任意一位或多位置 1,则可点亮相应的段。 让第三位数码管显示数字 0,则需要段 a,b,c,d,e,f亮, 这 几段由 seg1,seg3,seg4,seg6,seg7,seg8 和 grid7控制, 所以应 向 0ch 里 写 0xeb , 因 此 我 们 可 以 编 出 以 下 16 进 制 码 ,0xeb,0x28,0xb3,0xba,0x78,0xda,0xdb,0xa8,0xfb,0xfa 分别表示数字 09, 因为小数 点是第 s3 位,若要带小数点,则加 0x04 就可以了也就是0xef,0x2c,0xb7,0xbe,0x7c,0xde,0xdf,0xac,0xff,0xfe。6.按键硬件电路共有九个按键,通过seg17与k1,k2和tm1628相连,并由这两个编号实现了对按键的扫描s1 由 k2、 seg2 控制,以此类推应该注意的是按键硬件电路必须在使用过程实现消抖,否则将会影响使用,以及将来在调频,调音量过程中数码管显示是否稳定。7. rda5807sp内置接收机芯片调谐器采用cmos工艺,包装尺寸是sop16 仅支持iic通信协议。.支持最大供电电压为3.3v.提供50-108mhz,全球频率范围,频道间隔本次实习为50khziic scl与iic sda是与stm8相连接的引脚,最右侧的接口是耳机接口。本芯片可使用自带晶振电路提供计时器,单独给 rda5807n 供 32.768khz 晶振时,需要执行上电操作。8.天线电路 引脚j28提供了外接天线电路,1脚为接地端,2脚为天线端,当天线接在1脚上时可以使收台效果更好各器件具体电路请参看电路原理图。五子程序功能分析1.rda5807sp编程要求(一)rda芯片的编程步骤工作收台设置频点复位初始化开始(1) 复位及初始化 (2)设置频点rda fm 系列芯片的初始操作顺序: rda设置频点流程图 (2) 收台rda收台流程图如下是是否否将频率加( 向上搜) 或减( 向下搜) 步进频率,写入03h寄存器中( tune位写1)(二)iic通信协议我们使用了rda5807sp芯片,对该芯片的寄存器读写均要遵循iic通信协议的书写方式,下面我们分析该通信方式:iic 接口,包含 2 个信号: sclk 和sdio。 i2c 接口是由 start,命令字节,数据字节,及每个字节后的 ack 或 nack比特,和 stop 组成,命令字节包 括一个 7 比特的 chip 地址( 0010000b)和一个读写 r/w 命令比特。 ack(或 nack)由接收器发出。在该接口下, 有两中读写方式 ,分别是连续读写方式和带寄存器地址的标准 i2c 方式(1)连续读写方式:在该模式下, 寄存器的地址是不可见的 ,即有一个固定的起始寄存器地址(写操作时为 02h,读操作时为 0ah),并有一个内部递增计数器, i2c 器件地址为 0010000b,加上读写标志,即 i2c 器件地址为0x20(写操作) 和 0x21(读操作)写操作:写操作默认起始寄存器为 02h,即所有写操作都是默认从02h 开始,即使只写如 03h 或者 05h,都必须从 02h 写起, mcu 写入寄存器的顺序如下: 02h 的高字节, 02h 的低字节, 03h 的高字节,直到结束。芯片 在 mcu 写入每个字节后都会返回一个 ack。 mcu 会给出 stop 来结束操作。、读操作: 读操作默认起始寄存器为 0ah,即所有写操作都是默认从0ah 开始。 在对芯片进行读操作时, mcu 给出命令字节后, rda5807n 会送出数据字节,顺序如下: 0ah 高字节, 0ah 低字节, 0bh 高字节,直到 芯片接收到从 mcu 发出的 nack, mcu 送出 stop,读操作结束。除了最后一个字节,mcu 在读到每个字节后都要给出 ack,在读到最后一个字节后, mcu 给出 nack,使芯片 把总线交给 mcu,然后 mcu 发出 stop,结束整个操作。(2)标准读写方式标准 i2c 读写方式: 该模式是与标准 i2c 读写方式一致,即带寄存器地址的方式, i2c 器件地址为 0010001b,加上读写标志位,即为 0x22(写操作)和 0x23(读操作)iic初始化程序流图 标准读写方式(此处以写为例):六实习总结:1, 本次实习重点考察的是对程序的理解,针对单片机的收音机程序有很多种类型,这是我们第一次接触到stm8的程序。2, 在硬件方面,我们学到了如何使用rda5807与stm8配合使用构建收音机电路3, 在软件方面,我们学会了如何点亮数码管,如何向固定芯片里编写程序以实现接收机功能,以及如何通过按键控制各种功能。4, 关于专业知识方面,对于通信工程专业,我首次接触并掌握了iic通信协议,该协议在原理上讲非常简单,但在编程过程中却成为了重点,因为每次发送数据都要严格准守协议要求,发送起始位,发送寄存器地址,发送数据,产生应答信号,产生结束位。这样才能让固定芯片实现固定的效果。5, 学会了如何使用designer explorer来画电路原理图,这种方式能够更好地让我理解单片机对应单个模块的应用原理。6, 通过程序流程图的方式,更好的理解了主函数与子函数之间的关系,并借助这种方式,理解了如何向芯片写入命令。7, 对于本次实习,遇到的问题是芯片资料问题,网上只能提供英文资料,难以对芯片构成及作用起到透彻的理解。 附录各模块程序#include/头文件#includetm1628.h/1628控制数码管芯片#define u8 unsigned char/宏定义#define u16 unsigned int/宏定义#define u32 unsigned long/宏定义u16 table110=0xeb,0x28,0xb3,0xba,0x78,0xda,0xdb,0xa8,0xfb,0xfa; /数码管显示地址 不带小数点数组u16 table210=0xef,0x2c,0xb7,0xbe,0x7c,0xde,0xdf,0xac,0xff,0xfe; /数码管显示数据 带小数点数组unsigned int tempp=0;unsigned int flag=0;void clk_config(void)/时钟函数 clk_ckdivr = 0x00; /系统时钟1分频 while(!(clk_ickr & 0x02); /等待hsi准备好 void delay_nms(unsigned int n) /设置延时函约440us unsigned int i,j; while(n -) for(i = 0;i 14;i +) for(j = 0;j 10;j +); void iic_init(void) i2c_freqr |= 0x01; /输入外设时钟频率为1mhz,iic总线时序要求配置的标准模式为1mhz i2c_cr1 = 0x00; /禁止i2c外设,只有在iic被禁用时才能对trise寄存器进行配置,用以设计最大上升时间 i2c_triser = 0x02; /最大上升时间:当i2c_freqr设置为1mhz时,tpclk为1000ns,将i2c_triser = 0x02,也就是把最大上升时间设置为1000ns, i2c_ccrl = 0x10; ccr时钟控制器设置 thigh = ccr tck tlow = ccr tck i2c_ccrh = 0x00; i2c_cr1 |= 0x01; /使能iic模块 i2c_cr2 |= 0x04; / ack:应答使能 第二位置高,决定了1 :收到一个字节后(匹配的地址字节或者数据字节)后返回应答。 i2c_cr2 &= 0x08; 0: ack位控制被移位寄存器正在接收的这个当前字节的应答或者不应答;void continues_rw_bytes(unsigned char a,unsigned char number1)/子函数入口存储器地址,写入数据数组,写入数据个数 unsigned char temp,i; while(i2c_sr3 & 0x02); /等待总线空闲,没有通信时,该位为零 i2c_cr2 |= 0x01; start:起始位产生 ,由从模式进入主模式 while(!(i2c_sr1 & 0x01); /等待start发送完 i2c_sr1 sb:起始位(主模式)(7) temp = i2c_sr1; ev5 /通过读iic-sr1并且将地址写入数据寄存器可以将sb=1清除 i2c_dr=0x20; /从设备地址 00100000 while(!(i2c_sr1 & 0x02); /等待7位器件地址发送完addr置高:地址已被发送(主模式) temp = i2c_sr1; temp = i2c_sr3; /通过读i2c_sr1 i2c_sr3,清addr位 for(i=0;i8; 把高八位的data数据写入数据寄存器中 while(!(i2c_sr1 & 0x80); /等待txe=1 数据寄存器为空 temp = i2c_sr1; i2c_dr=data&0xff; 把高八位的data数据写入数据寄存器中 while(!(i2c_sr1 & 0x80); 等待txe=1 数据寄存器为空 i2c_cr2 |= 0x02; /产生停止位 while(!(i2c_sr1 & 0x04); i2c_sr1 btf:字节发送结束(6)(7),1 :数据字节发送结束。 delay_nms(30);/*标准读方式*/*向reg里读数据y*unsigned int standard_r_word(unsigned char reg) unsigned char temp; unsigned int y; while(i2c_sr3 & 0x02); /等待总线空闲 没有通信时,该位为零 i2c_cr2 |= 0x01; /产生起始位 由从模式进入主模式 while(!(i2c_sr1 & 0x01); /等待start发送完 temp = i2c_sr1; i2c_dr=0x22; /从设备地址 00100010 while(!(i2c_sr1 & 0x02); /等特7位器件地址发送完 temp = i2c_sr1; temp = i2c_sr3; /通过读i2c_sr1 i2c_sr3,清addr位 while(!(i2c_sr1 & 0x80); /等待txe=1 i2c_dr=reg; /存储器地址 while(!(i2c_sr1 & 0x84); i2c_cr2 |= 0x01; /产生重复起始位 由从模式进入主模式 while(!(i2c_sr1 & 0x01); /等待start发送完, temp = i2c_sr1; i2c_dr = 0x23; while(!(i2c_sr1 & 0x02); /等特7位器件地址发送完 temp = i2c_sr1; temp = i2c_sr3; 7位器件地址发送完addr置高:地址已被发送(主模式) 通过读i2c_sr1 i2c_sr3,清addr位 while(!(i2c_sr1 & 0x40); 数据寄存器非空 temp = i2c_sr1; y=i2c_dr8; i2c_cr2 &= 0x04; /不返回应答 i2c_cr2 |= 0x02; /产生停止位 while(!(i2c_sr1 & 0x40); 数据寄存器非空 temp = i2c_sr1; y|=i2c_dr; i2c_cr2 |= 0x04; i2c_cr2 &= 0x08; /为下一次接收使能应答 delay_nms(1); return y; /返回数据yvoid seek_up(void) standard_w_word(0x02,0xc301); /写向上调台命令到寄存器 0x02是芯片寄存器地址,0xc301是1010,0011,0001,通过读取寄存器各位可以理解这是写向上调台命令while(standard_r_word(0x0b)&0x100)=0) /等待fm true; while(tempp&0x4000)=0) /等待stc置1(收到台后,fm true与stc都被置1) delay_nms(20); tempp=standard_r_word(0x0a); /读取0a寄存器 while(tempp&0x2000)=0x2000); /等待sf置0,代表成功收到了台 tempp=(tempp&0x3ff)/2+760; /频率计算 (frequency)*10 =(channel spacing (khz) x chan + 76.0 mhz)*10注意,这里的tempp是以mhz为单位的,实际计算公式为/ 频 率 计 算 (frequency)*10 =(channel spacing (khz) x chan + 76.0 mhz)*10,但tempp以mhz为单位时,需要/2代表*500khzvoid seek_down(void) standard_w_word(0x02,0xc101); /写向下调台命令到寄存器0x02是芯片寄存器地址,0xc101是1010,0001,0001,通过读取寄存器各位可以理解这是写向上调台命令 while(standard_r_word(0x0b)&0x100)=0) /等待fm true;the current channel is a station while(tempp&0x4000)=0) /等待stc置1 delay_nms(20); tempp=standard_r_word(0x0a); /读取0a寄存器 while(tempp&0x2000)=0x2000); /等待sf置0,置0时代表成功收到了频道 tempp=(tempp&0x3ff)/2+760; /频率计算 注意,这里的tempp是以mhz为单位的,实际计算公式为/ 频 率 计 算 (frequency)*10 =(channel spacing (khz) x chan + 76.0 mhz)*10,但tempp以mhz为单位时,需要/2代表*500khzrda fm系列芯片的初始操作顺序:复位 读取芯片 id 上电 写初始化数据。void radio_init(void) unsigned int temp; iic_init(); standard_w_word(0x02,0x0002); /软复位 temp=standard_r_word(0x0e); /读取芯片id standard_w_word(0x02,0xc001); /电源使能;音频正常 temp=standard_r_word(0x0a); /读0a寄存器 standard_w_word(0x03,(temp&0x03ff)*64+0x1a); /0a寄存器的后十位保存了目前接收机接收到的信号temp&0x03ff代表取出了该频点,*64代表temp值左移6位,目的是存到0x03寄存器并将最后2位设置为00011010也就是设置band=10(76108mhz);channel spaci
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安徽电子信息职业技术学院单招职业适应性测试必刷测试卷带答案解析
- 2026年云南锡业职业技术学院单招综合素质考试题库及答案解析(名师系列)
- 2026年浙江警官职业学院单招职业适应性测试必刷测试卷附答案解析
- 2026年四川工业科技学院单招职业技能考试必刷测试卷及答案解析(名师系列)
- 地震损伤木结构评估
- 房屋搬迁平移协议书
- 房屋沁水调解协议书
- 房屋翻新易合同范本
- 房屋装修包工协议书
- 房屋转卖合同协议书
- 2024届高考英语考前【词汇语法题型】精练突破含解析专题01 教材词汇温故知新(语法填空易错精练100题)
- 传染病上报制度培训
- 2025年AHA心肺复苏与心血管急救指南解读
- 江苏省公务员2025年公安基础知识测试卷
- 2025至2030胶原蛋白行业项目调研及市场前景预测评估报告
- 超声科甲状腺超声检查要点指导
- 2025二手货车买卖合同书
- 临时消防阀门井砌筑施工方案
- 佳木斯大学招聘考试真题2024
- 老年医学进修汇报
- 税务风险培训课件
评论
0/150
提交评论