03130330郑成达单片机课程设计报告

上传人:仙*** 文档编号:36584291 上传时间:2021-10-31 格式:DOC 页数:32 大小:6.77MB
收藏 版权申诉 举报 下载
03130330郑成达单片机课程设计报告_第1页
第1页 / 共32页
03130330郑成达单片机课程设计报告_第2页
第2页 / 共32页
03130330郑成达单片机课程设计报告_第3页
第3页 / 共32页
资源描述:

《03130330郑成达单片机课程设计报告》由会员分享,可在线阅读,更多相关《03130330郑成达单片机课程设计报告(32页珍藏版)》请在装配图网上搜索。

1、吉林大学珠海学院单片机课程设计报告基于STC15单片机的频率计及方波发生器设计专业: 电子信息科学与技术 学生姓名: 郑成达 班级: 13级电子信息科学与技术(3班) 学号: 03130330 指导教师: 刘立勋 完成日期: 2015年11月29日 目 录一、课程设计性质1(1)基础部分2(2)发挥部分2三、课程设计的进度及安排3四、设计思路及原理分析4(1)方波发生器4(2)数字频率计5(3)电路原理图6(4)程序资源分配与按键说明图7(5)程序流程图8五、课程设计实物与调试8(1)IAP15W4K58S4开发板9(2)程序运行调试图9五、心得与体会10五、参考文献11附录1 IAP15W4

2、K58S4开发板原理图12附录2 程序源代码13一、课程设计性质和目的单片机课程设计是单片机原理及接口技术课程与实验结束后的一门综合性实践课。设计一种基于STC15单片机的频率计及方波发生器。该程序能实现可调频率的方波输出,并通过不同按键实现频率的粗调和微调,以及正弦波或方波的频率和占空比的检测功能。介绍电路接口原理图,给出相应的软件设计流程图和程序。课程设计题目基于STC15单片机的频率计及方波发生器设计紧密结合所学的主要内容,加深巩固所学知识,同时对所学内容进行扩展,有一定的深度和广度,能充分发挥学生的能动性和想象力。通过电路设计、安装、调试等一系列环节的实施,提高学生的单片机应用系统的设

3、计能力。 相信本次的设计一定能够使我们电子设计能力得到很好的锻炼,使我们的理论和现实生活联系起来!二、课程设计的内容及要求 (1)基础部分 数字频率计设计要求:被测信号为正弦波或方波,频率范围为1Hz5MHz;1) 测量相对误差的绝对值不大于百分之一;2) 门限电压2V-5V;3) 测量数据刷新时间不大于2s,测量结果稳定。方波发生器设计要求:1) 方波发生器可以分为低频和高频2个端口产生,频率范围1Hz-6MHz;2) 通过不同按键实现频率的粗调和微调。(2)发挥部分1) 频率计范围为 大于5MHz;2) 测量相对误差的绝对值不大于 千分之一;3) 增加脉冲信号占空比的测量功能。三、课程设计

4、的进度及安排项目时 间1集中讲授第11周 周六1-4节2绘制原理图及程序流程图第11周周六5、6节3部分同学上台讲解设计思路第11周周日1-2节4方波发生器程序设计及验证第11周周日3-6节5频率计基本功能程序设计第11周周日7-10节6频率计程序设计及验证第12周周六1-4节7程序联合调试及优化第12周周六5-8节8课程设计报告撰写第12周周六9-10节9作品测试,教师检测第12周周日1-4节10针对检测结果进行修改第12周周日5-6节11答辩并给出成绩第12周周日7-10节四、设计思路及原理分析(1)方波发生器如下图4-1,由于15系列单片机定时器/计数器有一个时钟输出TnCLKO允许控制

5、位,当定时器/计数器溢出时,对应的一个管脚的电平会产生跳变,通过这个原理,就能产生方波,频率最大能达到主时钟频率的二分之一,本次课程设计,本人设定的单片机主时钟是33.1776MHz,理论上能产生16.5888MHz的方波,满足课程设计方波发生器最高5MHz的要求。由于定时器溢出时间不能做到很长,定时器时钟输出的不能做到很低甚至是1Hz的频率,所以要产生低频的方波,可在定时器中断服务程序里取反某个管脚,以达到产生低频方波的目的,因此方波发生器分为了高频和低频部分。图4-1(2)数字频率计数字频率计的功能实现,同样可以利用定时器完成。由于定时器可以充当计数器,当用作计数器时,当外部管脚来一个脉冲

6、后,由THn和TLn组成的16位寄存器就会加1,1秒内统计其增加的次数便是所要测得的频率。占空比的检测,也可以利用定时器/计数器完成。如图4-1,当定时器/计数器的GATE位为1的时候,只有在INT0管脚为高电平的时候,定时器/计数器才开始计数,因此,可以确定INT0高电平的时间。再用另一个定时器你记录总时间,两者一相除,即是所要测得的占空比。(3)电路原理图(4)程序资源分配与按键说明图(5)程序流程图No No Yes No 开始程序初始化(定时器、外部中断、引脚等)显示LED数码管占空比模式?定时器0定时器1定时器2定时器3定时器4计数产生高频方波每秒输频率计频率低频模式?产生低频方波频

7、率计计数测占空比:当INT0=1时计数外部中断1设置模式LED数码管显示按键检测设置模式?每秒输出占空比数值测占空比/非测试占空比模式切换分配各个定时器的资源调度各个定时器的状态While(1) Yes Yes 开 启 中 断 五、课程设计实物与调试(1)IAP15W4K58S4开发板(2)程序运行调试图五、心得与体会结束为期两周的单片机课程设计,让我加深了对新型15单片机的理解,由与单片机控制系统可以应用到生活中的很多地方,解决生活和学习中的一些简单的用电子控制的问题,使我意识到了单片机的重要性。编程的过程中,发现要考虑很多个细节的问题,这样程序才会完美,一些细微的差错,会让程序产生许多意想

8、不到的bug。总结经验的时候我得出这样的结论:学习应该学以致用,有目的的去学习,如果学了不用等于没学。其次,要理论联系实际,这样才会取得事半功倍的效果。最后,感谢老师在课程设计中给我提供的帮助。五、参考文献STC单片机原理及应用-清华大学出版社2015年6月第一版 何宾 姚永附录1 IAP15W4K58S4开发板原理图 附录2 程序源代码#include STC15Fxxxx.h#define uint8 unsigned char#define uint16 unsigned int#define uint32 unsigned long int uint16 value=0;/方波发生器高

9、频模式下的装载值变量uint8 led_data_length=0;/LED数码管显示字数的长度uint8 led_data8;/LED数码管显示的字数uint8 led_table10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/LED数码管显示各个数字的代码uint8 interrupt_count=0;/方波发生器低频模式下应该进入定时中断的次数uint8 interrupt_count_data=0;/方波发生器低频模式下实际进入定时中断的次数uint16 timer1_count=0;/定时器1进入中断的次数uint8 tim

10、er4_count=0;/定时器4进入中断的次数uint8 set_count=0;/退出设置模式时,所需要进入中断的次数uint32 counter0_count=0; /计数器0溢出次数uint32 counter_frequency=0;/频率1(用于频率计和占空比)uint8 counter_h=0;/计数器0高8位计数uint8 counter_l=0;/计数器0低8位计数uint32 duty_count=0;/计数器1溢出次数(用于测占空比)uint8 duty_counter_h=0;/计数器1高8位计数uint8 duty_counter_l=0;/计数器1低8位计数uint

11、32 counter_duty=0;/频率2(用于占空比)bit lf_flag=0;/是否为低频模式bit set_flag=0;/是否为设置模式bit duty_flag=0;/是否为占空比模式void LED7s_DisplaySet(uint32 iNum,uint8 led_data8);/设置数码管显示的数字void Delay1ms(uint8 x);/33.1776MHz 1ms延时/* 外部中断1服务程序 */void Interrupt_int1() interrupt 2duty_flag=!duty_flag;if(duty_flag=1)/如果是占空比模式P35=0;

12、 /LED2亮TR0=0;TMOD|=0x08; /GATE=1TMOD&= 0xfb;/计数器改为定时器TL0=0;TH0=0;counter0_count=0;TR1=0;AUXR |= 0x40;/T1 12倍速度TMOD |= 0x10;/T1工作在模式1TL1 = 0x00;/设置定时初值TH1 = 0x00;/设置定时初值T4T3M |= 0x80;/定时器4开始计时TR1=1;TR0=1;else /如果不是占空比模式TR1=0;AUXR &= 0xBF;/T1 非12倍速度TMOD &= 0xef;/T1工作在模式0TL1 = 0x66;/设置定时初值TH1 = 0xEA;/设

13、置定时初值TR1=1;P35=1;/LED2灭TR0=0;TMOD&=0xf7;/GATE=0TMOD |= 0x04;/定时器改为计数器TR0=1;T4T3M &= 0x7f;/定时器4关闭计时/* 计数器0中断服务程序 */void Interrupt_counter0() interrupt 1TL0=0;TH0=0;counter0_count+;/* 定时器1中断服务程序 */void Interrupt_timer1() interrupt 3 /2毫秒33.1776MHzif(duty_flag)/如果是占空比模式TL1=0;TH1=0;duty_count+;else time

14、r1_count+;if(timer1_count=500) /如果不是占空比模式,则频率计每秒计算一次频率并显示 counter_h=TH0;counter_l=TL0;counter_frequency=counter0_count*65536+counter_h*256+counter_l;counter0_count=0;TL0=0;TH0=0; LED7s_DisplaySet(counter_frequency,led_data);timer1_count=0;if(lf_flag) /如果不是占空比模式,且方波发生器为低频模式,则P30产生低频方波interrupt_count_

15、data+;if(interrupt_count_data=interrupt_count)P30=!P30;interrupt_count_data=0;/* 定时器4服务程序 */void Interrupt_timer4() interrupt 20 /20毫秒33.1776MHztimer4_count+;if(timer4_count=50) /1scounter_h=TH0;counter_l=TL0;duty_counter_h=TH1;duty_counter_l=TL1;counter_frequency=counter0_count*65536+counter_h*256+

16、counter_l;counter_duty=duty_count*65536+duty_counter_h*256+duty_counter_l;duty_count=0;counter0_count=0;TL1=0;TH1=0;TL0=0;TH0=0; LED7s_DisplaySet(counter_frequency*100)/counter_duty,led_data);timer4_count=0;/* 定时器3中断服务程序 */void Interrupt_timer3() interrupt 19 /24毫秒33.1776MHz if(set_flag)set_count+;i

17、f(set_count100)TR1=1;/定时器1开启计时set_count=0;set_flag=0;if(!P54) /Key3,增加频率T4T3M &= 0xf7;/定时器3关闭计时TR1=0;set_flag=1;set_count=0;Delay1ms(10);if(!P54)P2=0;while(!P54) ;if(lf_flag)/负数if(P32)/微调+if(interrupt_count=1)lf_flag=0;interrupt_count=0;INT_CLKO|=0x04;/T0的P3.0输出打开AUXR |= 0x10;LED7s_DisplaySet(value,

18、led_data);elseif(interrupt_count128)interrupt_count-=4;else if(interrupt_count64)interrupt_count-=2;elseinterrupt_count-;LED7s_DisplaySet(interrupt_count,led_data);else /粗调+if(interrupt_count!=1) /不是-1if(interrupt_count128)interrupt_count=128;else if(interrupt_count64)interrupt_count=64;else if(inte

19、rrupt_count32)interrupt_count=32;else if(interrupt_count16)interrupt_count=16;else if(interrupt_count8)interrupt_count=8;else if(interrupt_count4)interrupt_count=4;else if(interrupt_count2)interrupt_count=2;elseinterrupt_count=1;LED7s_DisplaySet(interrupt_count,led_data);else /是-1lf_flag=0;interrupt

20、_count=0;INT_CLKO|=0x04;/T0的P3.5输出打开AUXR |= 0x10;LED7s_DisplaySet(value,led_data); else /正数if(P32)/微调+if(value!=65535)if(value32768)value+=4096;else if(value49152)value+=768;else if(value62464)value+=128;else if(value64512)value+=16;else if(value8;T2L=value;else /粗调+if(value16384)value=16384;else if

21、(value32768)value=32768;else if(value49152)value=49152;else if(value53248)value=53248;else if(value57344)value=57344;else if(value61440)value=61440;else if(value62464)value=62464;else if(value63488)value=63488;else if(value64512)value=64512;else if(value64640)value=64640;else if(value64768)value=647

22、68;else if(value64832)value=64832;else if(value64896)value=64896;else if(value64960)value=64960;else if(value65024)value=65024;else if(value65088)value=65088;else if(value65152)value=65152;else if(value65216)value=65216;else if(value65280)value=65280;else if(value65344)value=65344;else if(value65408

23、)value=65408;else if(value65472)value=65472;else if(value8;T2L=value;else if(!P55) /Key4,降低频率T4T3M &= 0xf7;/定时器3关闭计时TR1=0;set_flag=1;set_count=0;Delay1ms(10);if(!P55)P2=0;while(!P55) ;if(value=0) /负数或value等于0if(P32) /微调-if(interrupt_count!=255)if(interrupt_count128)if(interrupt_count=251)interrupt_c

24、ount=255;else interrupt_count+=4;else if(interrupt_count64)interrupt_count+=2;elseinterrupt_count+;else /粗调-if(interrupt_count2)interrupt_count=2;else if(interrupt_count4)interrupt_count=4;else if(interrupt_count8)interrupt_count=8;else if(interrupt_count16)interrupt_count=16;else if(interrupt_count

25、32)interrupt_count=32;else if(interrupt_count64)interrupt_count=64;else if(interrupt_count128)interrupt_count=128;elseinterrupt_count=255;INT_CLKO&=0xfb;/T0的P3.0输出关闭AUXR&=0xef;lf_flag=1;LED7s_DisplaySet(interrupt_count,led_data);else /正数if(P32) /微调-if(value32768)if(value=4096)value=0;elsevalue-=4096

26、;else if(value49152)value-=768;else if(value62464)value-=128;else if(value64512)value-=16;else if(value8;T2L=value;else /粗调-if(value=0)INT_CLKO&=0xfb;/T0的P3.0输出关闭AUXR&=0xef;lf_flag=1;interrupt_count+;LED7s_DisplaySet(interrupt_count,led_data);elseif(value65504)value=65504;else if(value65472)value=65

27、472;else if(value65408)value=65408;else if(value65344)value=65344;else if(value65280)value=65280;else if(value65216)value=65216;else if(value65152)value=65152;else if(value65088)value=65088;else if(value65024)value=65024;else if(value64960)value=64960;else if(value64896)value=64896;else if(value6483

28、2)value=64832;else if(value64768)value=64768;else if(value64640)value=64640;else if(value64512)value=64512;else if(value63488)value=63488;else if(value62464)value=62464;else if(value61440)value=61440;else if(value57344)value=57344;else if(value53248)value=53248;else if(value49152)value=49152;else if

29、(value32768)value=32768;else if(value16384)value=16384;elsevalue=0;LED7s_DisplaySet(value,led_data);T2H=value8;T2L=value;T4T3M |= 0x08;/定时器3开始计时/* 1ms延时函数 */void Delay1ms(uint8 x)/33.1776MHzunsigned char i, j;while(x-)_nop_();_nop_();i = 33;j = 66;dowhile (-j); while (-i);/* 32位整型转数码管代码索引函数 */void L

30、ED7s_DisplaySet(uint32 lNum,uint8 led_data8)if(lNum=0)led_data0=0;led_data_length=1;elseint i=0;while(lNum!=0) led_datai=lNum%10;lNum/=10;i+;led_data_length=i; /* 主函数 */void main()uint8 tmp=0x01;uint8 i=0;P3M1=0x00; /P3M0=0x00; /P0M1=0x00; /P0M0=0xff; /P2M1=0x00; /P2M0=0xff; /CLK_DIV&=0xf8;/系统时钟不分频/

31、* 外部中断1 */IT1=1;/外部中断1下降沿触发EX1=1;/外部中断1开启/* 计数器0 */AUXR|=0x80; /12倍TMOD |= 0x04;/设置定时器0为计数器,P34输入/TMOD &= 0xfc;/设置定时器0工作模式0TMOD |= 0x01;/设置定时器0工作模式1TMOD &= 0xfd;TL0 = 0x00;/设置定时初值TH0 = 0x00;/设置定时初值TR0 = 1;/定时器0开始计时TF0=0;/清空标志位ET0=1;/* 定时器1 */2毫秒33.1776MHzAUXR &= 0xBF;/T1 非12倍速度TMOD &= 0x0F;/T1作为定时器使

32、用,T1工作在模式0TL1 = 0x66;/设置定时初值TH1 = 0xEA;/设置定时初值ET1= 1;/定时器1中断启动TR1 = 1;/定时器1暂停计时/* 定时器2 */AUXR |= 0x04;/定时器时钟1T模式T2L = 0x00;/设置定时初值T2H = 0x00;/设置定时初值AUXR |= 0x10;/定时器2开始计时INT_CLKO|=0x04;/T0的P3.0输出打开/* 定时器3 */24毫秒33.1776MHzT4T3M &= 0xFD;/定时器时钟12T模式T3L = 0x00;/设置定时初值T3H = 0x00;/设置定时初值T4T3M |= 0x08;/定时器

33、3开始计时IE2|=0x20; /定时器3中断开启/* 定时器4 */20毫秒33.1776MHzT4T3M &= 0xDF;/定时器时钟12T模式T4L = 0x00;/设置定时初值T4H = 0x28;/设置定时初值IE2|=0x40; /定时器4中断开启EA=1;LED7s_DisplaySet(value,led_data);while(1) for(i=0;iled_data_length;i+)P2=0;P0=1;P0=led_tableled_datai;P2=tmpi;Delay1ms(1);if(lf_flag&set_flag) /如果为设置模式,并且方波发生器为低频模式P2=0;P0=1;P0=0xbf;P2=tmpi;Delay1ms(1);

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!