03130330郑成达单片机课程设计报告_第1页
03130330郑成达单片机课程设计报告_第2页
03130330郑成达单片机课程设计报告_第3页
03130330郑成达单片机课程设计报告_第4页
03130330郑成达单片机课程设计报告_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 val

9、ue=0;/方波发生器高频模式下的装载值变量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进入中断

10、的次数uint8 timer4_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;/计

11、数器1低8位计数uint32 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)/如果

12、是占空比模式p35=0; /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 = 0

13、x66;/设置定时初值th1 = 0xea;/设置定时初值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)/如果是占空比模式t

14、l1=0;th1=0;duty_count+;else timer1_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) /如果不是占空比模式,且方

15、波发生器为低频模式,则p30产生低频方波interrupt_count_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_f

16、requency=counter0_count*65536+counter_h*256+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

17、 19 /24毫秒33.1776mhz if(set_flag)set_count+;if(set_count>100)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|=0

18、x04;/t0的p3.0输出打开auxr |= 0x10;led7s_displayset(value,led_data);elseif(interrupt_count>128)interrupt_count-=4;else if(interrupt_count>64)interrupt_count-=2;elseinterrupt_count-;led7s_displayset(interrupt_count,led_data);else /粗调+if(interrupt_count!=1) /不是-1if(interrupt_count>128)interrupt_cou

19、nt=128;else if(interrupt_count>64)interrupt_count=64;else if(interrupt_count>32)interrupt_count=32;else if(interrupt_count>16)interrupt_count=16;else if(interrupt_count>8)interrupt_count=8;else if(interrupt_count>4)interrupt_count=4;else if(interrupt_count>2)interrupt_count=2;elsei

20、nterrupt_count=1;led7s_displayset(interrupt_count,led_data);else /是-1lf_flag=0;interrupt_count=0;int_clko|=0x04;/t0的p3.5输出打开auxr |= 0x10;led7s_displayset(value,led_data); else /正数if(p32)/微调+if(value!=65535)if(value<32768)value+=4096;else if(value<49152)value+=768;else if(value<62464)value+=

21、128;else if(value<64512)value+=16;else if(value<65472)value+=2;elsevalue+;led7s_displayset(value,led_data);t2h=value>>8;t2l=value;else /粗调+if(value<16384)value=16384;else if(value<32768)value=32768;else if(value<49152)value=49152;else if(value<53248)value=53248;else if(value&

22、lt;57344)value=57344;else if(value<61440)value=61440;else if(value<62464)value=62464;else if(value<63488)value=63488;else if(value<64512)value=64512;else if(value<64640)value=64640;else if(value<64768)value=64768;else if(value<64832)value=64832;else if(value<64896)value=64896

23、;else if(value<64960)value=64960;else if(value<65024)value=65024;else if(value<65088)value=65088;else if(value<65152)value=65152;else if(value<65216)value=65216;else if(value<65280)value=65280;else if(value<65344)value=65344;else if(value<65408)value=65408;else if(value<65

24、472)value=65472;else if(value<65504)value=65504;elsevalue=65535;led7s_displayset(value,led_data);t2h=value>>8;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_cou

25、nt!=255)if(interrupt_count>128)if(interrupt_count>=251)interrupt_count=255;else interrupt_count+=4;else if(interrupt_count>64)interrupt_count+=2;elseinterrupt_count+;else /粗调-if(interrupt_count<2)interrupt_count=2;else if(interrupt_count<4)interrupt_count=4;else if(interrupt_count<

26、8)interrupt_count=8;else if(interrupt_count<16)interrupt_count=16;else if(interrupt_count<32)interrupt_count=32;else if(interrupt_count<64)interrupt_count=64;else if(interrupt_count<128)interrupt_count=128;elseinterrupt_count=255;int_clko&=0xfb;/t0的p3.0输出关闭auxr&=0xef;lf_flag=1;le

27、d7s_displayset(interrupt_count,led_data);else /正数if(p32) /微调-if(value<32768)if(value<=4096)value=0;elsevalue-=4096;else if(value<49152)value-=768;else if(value<62464)value-=128;else if(value<64512)value-=16;else if(value<65472)value-=2;elsevalue-;led7s_displayset(value,led_data);t2

28、h=value>>8;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(value>65504)value=65504;else if(value>65472)value=65472;else if(value>65408)value=65408;else if(value>65344)value=6534

29、4;else if(value>65280)value=65280;else if(value>65216)value=65216;else if(value>65152)value=65152;else if(value>65088)value=65088;else if(value>65024)value=65024;else if(value>64960)value=64960;else if(value>64896)value=64896;else if(value>64832)value=64832;else if(value>6

30、4768)value=64768;else if(value>64640)value=64640;else if(value>64512)value=64512;else if(value>63488)value=63488;else if(value>62464)value=62464;else if(value>61440)value=61440;else if(value>57344)value=57344;else if(value>53248)value=53248;else if(value>49152)value=49152;els

31、e if(value>32768)value=32768;else if(value>16384)value=16384;elsevalue=0;led7s_displayset(value,led_data);t2h=value>>8;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 led7s_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

温馨提示

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

评论

0/150

提交评论