您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页频率发生器设计含程序

频率发生器设计含程序

来源:叨叨游戏网


频率发生器设计

一、设计目的

本次课题设计应用单片机的知识,完成频率发生器的设计,以达到理论与实践更好的结合、进一步提高综合运用能力,达到与实践相结合,更让我们对于所学知识的深一层理解。

通过这次设计的训练,可以使我在基本思路和基本方法上对于基于MCS-51单片机的设计有一个比较感性的认识,并具备一定程度的设计能力。

二、设计要求

在本次要求中主要完成以下功能:

1.通过按键设定频率(默认占空比1:1)并显示 2.通过按键输入占空比并显示 3.输出此频率

本机地址为08H,当接到上位机发的08H时,则回发08H 当接到上位机发的AAH时,则将设定发给上位机 当收到上位机发的55H时,则修改设定频率

三、硬件电路设计

系统硬件电路包括按键输入电路,单片机最小系统电路,显示电路三大部分,结果框图如图3-1所示。

1

图3-1 系统框图

3.1 C52单片机介绍

STCC52是一种带8K字节闪烁可编程可檫除只读存储器的低电压,高性能

COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。 STCC52管脚图如图3-2所示,具体介绍如下:

图3-2 STCC52引脚图

① 主电源引脚(2根)

VCC(Pin40):电源输入,接+5V电源 GND(Pin20):接地线 ② 外接晶振引脚(2根)

XTAL1(Pin19):片内振荡电路的输入端 XTAL2(Pin20):片内振荡电路的输出端

2 2

③ 控制引脚(4根)

RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。

ALE/PROG(Pin30):地址锁存允许信号 PSEN(Pin29):外部存储器读选通信号

EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读 指令,如果接高电平则从内部程序存储器读指令。

可编程输入/输出引脚(32根) STCC52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。P3口为准双向口。可以字节访问,也可以位访问。

P3.0---RXD,串行输入口。 P3.1---TXD,串行输出口。 P3.2---INT0,外部中断0的请求。 P3.3---INT1,外部中断1的请求。

P3.4---T0,定时器/计数器0外部计数脉冲。 P3.5---T1,定时器/计数器,1外部计数脉冲。 P3.6---WR,外部数据存储器写选通。 P3.7---RD,外部数据存储器读选通。

3.2 按键扫描电路

式键盘中,各键相互,每个按键各接一根输入线,每根输入线上的按键工作状态不会影响其他输入线上的工作状态。因此通过检测输入线的电平状态就可以很容易地判断按键是否按下。式键盘电路配置灵活,软件结构简单。但每个按键需占用一根输入线,在按键数量较多时,输入口浪费大,电路结构显得很繁杂,故此种键盘适用于按键较少或操作速度较高的场合。行列式键盘的接法比式键盘的接法复杂,编程实现上也会比较复杂。但是,在

图3-3 键盘扫描电路

占用相同的I/O端口的情况下,行列式键盘的接法会比式接法允许的按键数量多,本设计只需三个按键,数量少,为简单起见故采用式接法键盘。

式键盘的接口方法,查询方式的式键盘工作电路如图3-3所示。按键直接与单片机C52的I/O接口线相接,通过读I/O口判定各I/O口线的电平状态,即可识别出按下的键。

3 3

3.3 振荡电路

单片机必须在时钟的驱动下才能工作。在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。系统所采用的振荡电路如图3-4所示。

Y111.0592MC533PC433PU21234567810111213141516179181920P1P1P1P1P1P1P1P1P3P3P3P3P3P3P3P3.0.1.2.3.4.5.6.7.0/RXD.1/TXD.2/INT0.3/INT1.4/T0.5/T1.6/WR.7/RDP0P0P0P0P0P0P0P0P2P2P2P2P2P2P2P2.0.1.2.3.4.5.6.7.7.6.5.4.3.2.1.03938373635343332282726252423222131302940 RSTXTAL2XTAL1GNDSTCC51RCEAALE/PROGPSENVCC图3-4 振荡电路图

系统选用石英晶体振荡器。此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。电路中两个电容C5,C6的作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调。C5,C6的典型值为33PF。

单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数,常用错误!未找到引用源。表示如时钟频率为11.0592MHZ,即错误!未找到引用源。=11.0592MHZ。

3.4 数码管显示电路

LED数码动态显示的基本做法在于分时轮流选通数码管的公共端,使得各数码管轮流导通,再选通相应的数码管后,即显示字段上得到显示字形码。这种方式数码管的发光效率,而且由于各个数码管的字段线是并联使用的,从而大大简化了硬件线路。 动态扫描显示接口是单片机系统中应用最为广泛的一种显示方式。其接口电路是把所有显示器的8个笔画段A-DP同名端并联在一起,而每个显示器的公共极COM各自地接受I/O线控制,CPU向字段输出口送出字段形码是,所有显示器由于同名端并连接收到相同的字形码,但究竟是哪个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以就可以自行决定何时显示哪一位了。而所谓动态扫描是指采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。 再轮流点亮扫描过程中,每位显示器的点亮时间是极为

4 4

短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上个位显示器并非同时点亮,但只要扫描的速度足够快,给人的影响就是一组稳定的显示数据,不会有闪烁感。

3.5 电路原理图

系统电路原理图如图3-5所示

图3-5 系统接线图

3.6 元件清单

元件名称 电源指示灯

数量 1 备注 符号D11 5 5

USB电源口 电源开关 通讯口 按键 C52芯片 晶振 电容 数码管 电阻 蜂鸣器 74HC573芯片 1 1 1 17 1 1 10 2 3 1 2 型号为9针232 4*4键盘一个,51复位按钮一个 U1 符号Y1,型号12MHz C1:22pF, C2:22pF,C19:0.1uF,C28:104,极性电容C4:1kuF,C13:10pF,C9,C10,C11,C12各1uF LE1,LE2 1K, R9:10K,R16:1K U6,U7 表3-1 原件清单表

四、软件设计

4.1主程序

本次频率发生器的软件设计包括主程序模块、延时子程序模块、系统初始化程序模块、显示子程序模块、按键扫描程序模块、定时器中断子程序模块等子程序模块组成。

主程序是整个系统软件的运行主体,各个子系统的软件程序都必须经过它的调度,才能运行得当。根据设计的功能要求,主程序用来控制整个程序的执行,完成了对系统的初始化,而且它与各子程序紧密相联,共同实现频率发生器各种功能的执行。

主程序流程图如图4-1:

图4-1 主程序流程图

6 6

4.2 中断子程序

图4-2 外部中断子程序图

五、源程序

#include #define uchar unsigned char sbit zk=P0^0; sbit output=P0^1; uchar i=8,j;

void delay1ms(uchar n)

//延时n ms

7 7

{ uchar j; while(n--) for(j=0;j<122;j++) { ; } }

void aabb() interrupt 0

{ EX0=0; j=0xaa; for(i=9;i>0;i--) { if(j&0x80) output=1; else output=0; zk=0; delay1ms(1); zk=1; j=j<<1; } EX0=1; }

void bbaa() interrupt 2 { EX1=0; j=0xbb; for(i=9;i>0;i--)

{ if(j&0x80) output=1; else output=0; zk=0;

8 8

delay1ms(1); zk=1; j=j<<1; } EX1=1; }

void main() {

IT0=1; //选择INT1为下降沿触发方式 IT1=1; EX1=1; EA=1; EX0=1; while(1); }

下位机程序如下: #include #include #define uchar unsigned char #define uint unsigned int

sbit OutPut=P1^7; //矩形波输出口 sbit input=P1^0;

float fosc=12000000; //系统时钟频率 float length=65536; //方式1计数长度 uchar flag,i=8,kz; uchar ZKB;

//状态键标志

//频率

//占空比

uint PL,TT=50,TTT=50; //T0和T1的定时初值 uchar code tabl[11]=

uchar TIMER0_L,TIMER0_H,TIMER1_L,TIMER1_H;

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0}; //LED共阴极代码

/*****************************************

9 9

延时子程序

*****************************************/ void delay1ms(uint n) { uchar j; while(n--) for(j=0;j<122;j++) { ; } }

/***************************************** 系统初始化

*****************************************/ void system_init(void ) {

SCON=0x00; flag=0; PL=20; ZKB=50; TL0=0xb0; TH0=0x3c; TL1=0x58; TH1=0x9e;

TMOD=0x11; //T0和T1为工作方式1的定时模式 IT0=1; //选择INT0为下降沿触发方式 IT1=1; //选择INT1为下降沿触发方式 EX0=1;

EX1=1; //外部中断0允许

ET0=1; //定时器1和定时器0中断允许 ET1=1;

EA=1; //系统中断允许

TR0=1; //定时器1和定时器0开始定时 TR1=1;

TIMER0_L=0xb0; TIMER0_H=0x3c;

//初始占空比50定时0.025s

//初始频率20Hz定时0.05s

//延时n ms

10

TIMER1_L=0x58; TIMER1_H=0x9e; }

/***************************************** 显示子程序

*****************************************/ void display(uint PL,uchar ZKB) {

uchar b,f,d,e,m,n,k; b=PL/10000; PL=PL%10000; f=PL/1000; PL=PL%1000; d=PL/100; PL=PL%100; e=PL/10; k=PL%10;

m=ZKB/10;

n=ZKB%10; if(PL==0) b=f=d=e=k=10; if(ZKB==0)

m=n=10;

P2=~0x01; P0=tabl[b]; delay1ms(2); P2=~0x02; P0=tabl[f]; delay1ms(2); P2=~0x04; P0=tabl[d]; delay1ms(2); P2=~0x08;

//分离频率的各位数值 //分离占空比各位数值11

P0=tabl[e]; delay1ms(2); P2=~0x10; P0=tabl[k]; delay1ms(2); P2=~0x40; P0=tabl[m]; delay1ms(2); P2=~0x80; P0=tabl[n]; delay1ms(2); }

/***************************************** 键盘扫描

*****************************************/ void Key_Scan() { float TC0,TC1; flag++; if(flag==3) { flag=0; }

void Key_Scan1() {

TIMER0_H=(uint)TC0/256; //计算T0和T1的初值 TIMER0_L=(uint)TC0%256; TIMER1_H=(uint)TC1/256; TIMER1_L=(uint)TC1%256;

//清状态标志位

TC0=(length-(fosc*(100-ZKB))/(12*100*PL));

TC1=(length-(fosc*ZKB)/(12*100*PL)); //占空比定时初值

//状态返回,正常工作

}

12

if(flag==1) {

PL+=10; //按键频率加5 if(PL>10000) PL=50; }

if(flag==2)

//状态2下对占空比进行调整

display(PL,ZKB);

{

ZKB+=5;

if(ZKB>99) ZKB=5;

} if(flag==3)

{

flag=0;

display(PL,ZKB);

}

display(PL,ZKB); }

void ccdd() interrupt 0 { EX0=0; kz=kz<<1; i--; if(input) kz=kz|0x01; if(~input) kz=kz&0xfe; if(~i) {

if(kz==0xaa) Key_Scan(); if(kz==0xbb) Key_Scan1();

//按键占空比加5 //状态2下对占空比进行调整

13

i=8; } }

/***************************************** 定时器中断子程序

*****************************************/

void Timer0_PL() interrupt 1 //频率T0中断 {TR0=0; TR1=1;

//启动T1,占空比定时

TL0=TIMER0_L; TH0=TIMER0_H; OutPut=1; }

void Timer1_PL() interrupt 3 //占空比T1中断 {TR0=1; TR1=0;

//T1停止

TL1=TIMER1_L; TH1=TIMER1_H; OutPut=0; }

/***************************************** 主函数

*****************************************/ void main() {

uint PL0=0; uchar ZKB0=0;

system_init(); while(1) {

if(flag==0) //状态0时,正常显示频率和占空比 display(PL,ZKB);

if(flag==1) //状态1时,频率调整状态,频率闪烁

//系统初始化

//死循环,显示频率和占空比

//输出高电平

//输出高电平

EX0=1;

14

{

display(PL0,ZKB); TT--; if(TT==0) { {

display(PL,ZKB); } TT=50; } }

if(flag==2) //状态2时,占空比调整状态,占空比闪烁 {

display(PL,ZKB0); TTT--; if(TTT==0) { {

display(PL,ZKB); } TTT=50; } } }

TTT=50;

while(TTT--)

TT=50;

while(TT--)

六、设计总结

这次单片机课程设计不仅巩固了以前所学过的知识,而且学到了很多在书本上没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远

15

远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和思考的能力。同时在设计的过程中发现了自己的不足之处,例如对C52芯片的引脚,在使用Protel画图时,有了更加深刻的了解。

经过我们的努力,顺利的完成了单片机设计。这是一个磨练意志的过程,从课题的选择开始,频率发生器的设计、硬件和软件系统的设计到最后实验验收结束,这其中经历了很多困难,但是更重要的是在这个过程中我得到了很大的锻炼。通过C51单片机等一些器件的设计让我学习和掌握了单片机技术的基础知识和技术要点,也使以前学的很多知识都得到了运用。

在此我特别感谢我的指导老师和帮助过我的同学们,是老师的耐心指导和同学们的细心讲解才使得我更好的完成了这次小学期。

七、参考文献

[1] 高峰.单片微型计算机原理与接口技术.科学出版社,2007.

[2] 李勋.单片机微型计算机大学读本.北京航空航天大学出版社,2002. [3] 张毅刚.单片机原理及应用 .高等教育出版社,2004.

16

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务