1、基于单片机的多频信号源设计单 片 机 课 程 设 计 题 目 基于单片机的多频信号源设计姓 名 _ 学 号 _ _指导教师 _ _成 绩 _ _ _摘要随着电子技术的不断发展,单片机的应用领域更加广阔。单片机诞生30多年以来,其品种,功能和应用技术都得到飞速的发展,本次课程设计的目的主要是培养学生综合运用所学的知识,完成一个单片机应用系统设计。本系统采用单片机89C51为中心器件来设计,系统使用性强,操作简单,扩展性强。在现有的单片机仿真机系统上掌握相关软硬件设计与调试知识,根据仿真系统,焊好硬件电路,正确进行元器件的测试与调试。正文着重给出软硬件设计的思路和各部分功能的扩展增强,以及其具体实
2、现。关于多频信号源设计,从单片机引脚里发出213,212,211,再从213引脚接cd4060芯片发出210,29,28,27,26,25,24,22,21,20再从210引脚接第二个cd4060芯片,从该芯片里发出23 关键词:AT89C51单片机、cd4060芯片、频率、晶振目录摘要 i目录 i第一章 系统功能要求 - 1 -1.1、系统的设计任务 - 1 -1.2、设计所需要的用具 - 1 -第二章 设计方案论证 - 2 -第三章 系统硬件电路的设计 - 3 -3.1主要芯片简介 - 3 -1、AT89C51简介 - 3 -2、主要特性 - 3 -3、管脚说明 - 3 -4、振荡器特性
3、- 4 -5、芯片擦除 - 5 -6、结构特点 - 5 -3.2 STC89C51基本电路 - 5 -1、复位电路 - 5 -2、晶振电路 - 6 -第四章 系统程序的设计 - 7 -第五章 调试及性能分析 - 10 -第六章 结束语 - 11 - 参考文献 - 12 -附录 - 13 -附全局电路仿真图 - 13 -附源程序 - 14 -第一章 系统功能要求1.1、系统的设计任务设计单片机主电路、多频信号源。1.2、设计所需要的用具电烙铁,锡丝,89C51单片机,晶振,各种不同阻值电阻,各种型号电容,导线,杜邦线等等第二章 设计方案论证 软硬件开发环境 硬件选择:选择89c51作为单片机芯片
4、。 软件开发环境: 用Proteus 7 Professional软件画电路图 、Keil uVision4软件进行程序编写。第三章 系统硬件电路的设计3.1主要芯片简介1、AT89C51简介89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM-Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯
5、片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2、主要特性与MCS-51 兼容 ,4K字节可编程闪烁存储器,寿命:1000写/擦循环, 数据保留时间:10年,全静态工作:0Hz-24Hz ,三级程序存储器锁定,128*8位内部RAM ,32可编程I/O线, 两个16位定时器/计数器, 5个中断源 ,可编程串行通道,低功耗的闲置和掉电模式,片内振荡器和时钟电路 。 3、管脚说明VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一
6、次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写1时,其管脚被内部上拉电阻拉高,且作
7、为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址1时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入1后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口
8、,如下表所示:口管脚 备选功能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(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正
9、脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间为外部程序存储器(0000H-FFFFH),不管是否有内部程序
10、存储器读取外部ROM数据。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,单片机读取内部程序存储器。(扩展有外部ROM时读取完内部ROM后自动读取外部ROM)。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。4、振荡器特性 XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。由于输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必
11、须保证脉冲的高低电平要求的宽度。 5、芯片擦除整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 6、结构特点8位CPU;片内振荡器和时钟电路;32根I/O线;外部存贮器寻址范围ROM、RAM64K;2个16位的定时器/计数器;5个中断源,两个中断优先级;全双工串行口;布尔
12、处理器。3.2 STC89C51基本电路STC89C51单片机要正常工作,必须有基本电路:晶振电路及复位电路。1、复位电路复位是使单片机处于某种确定的初始状态。单片机工作从复位开始。在单片机RST引脚引入高电平并保持2个机器周期,单片机就执行复位操作。复位操作有两种基本方式:一种是上电复位,另一种是上电与按键均有效的复位。复位电路如图3.1所示。图3.1 复位电路开机瞬间RST获得高电平,随着电解电容C3的充电,RST引脚的高电平将逐渐下降。若该高电平能保持足够2个机器周期,就可以实现复位操作。根据经典电路选择参数,选取C3=10F,R1=10K。2、晶振电路单片机的时钟信号通常有两种产生方式
13、:一是内部时钟方式,二是外部时钟方式。内部时钟方式是利用单片机内部的振荡电路产生时钟信号。外部时钟方式是把外部已有的时钟信号引入到单片机内。本次设计中,采用的是12MHz晶振,配上30pF的电容,构成谐振,这样有助于输出稳定的波形。如图3.2所示。 图3.2晶振电路在单片机的XTAL1和XTAL2引脚外接石英晶体(简称晶振),作为单片机内部振荡电路的负载,构成自激振荡器,可在单片机内部产生时钟脉冲信号。C1和C2的作用是稳定振荡频率和快速起振。根据经典电路选择参数,本电路选用晶振12 MHz, C1=C2=30PF。其中晶振周期(或外部时钟信号周期)为最小的时序单位。第四章 系统程序的设计程序
14、思路说明: 用led灯的闪烁代表高低电频的输出#include /#include#include reg51.h#define u8 unsigned char#define u16 unsigned int #define u32 unsigned long sbit led=P20;/定义按输出波形IO与单片机的相连sbit led1=P21;/定义按输出波形IO与单片机的相连sbit led2=P22;void delay_ms(unsigned int a) /子程序-延时 unsigned int b; for(;a0;a-) for(b=100;b0;b-);void Timer
15、0Init(void) /x毫秒12.000MHz TMOD &= 0xF0; /设置定时器模式 TMOD |= 0x01; /设置定时器模式 TL0 = 0xF1; /设置定时初值 TH0 = 0xFF; /设置定时初值 TF0 = 0; /清除TF0标志 TR0 = 1; /定时器0开始计时 ET0=1;/打开定时0中断 EA=1;/开启总中断void Delay15us() /12.000MHz unsigned char i; i = 4; while (-i);void main() u8 num; /Timer0Init(); while(1) _nop_(); _nop_();
16、_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /_nop_(); led=!led; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); led1=!led1; led=!led; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(
17、); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /_nop_(); led=!led; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); led1=!led1; led=!led;led2=!led2; void T0_int() interrupt 1 TL0 = 0xF1; /设置定时初值 TH0 = 0xFF; /设置定时初值 /led=!led;第五章 调试及性能分析 第六章
18、 结束语本次课程设计所应用到的软件有:KEIL,PROTEUS这两个软件,两个软件结合起来用对这个设计有着至关重要的作用。软件调试是通过s进行的,此软件不多介绍了,功能强大,是学习电路的好帮手。但进行软件仿真的时候,却一直没有出现结果。这就要我们进行错误的排查,这就包括各个端口的检查和分析。由于网上下载了中文补丁,因此对于我们初学者来说难度降低了不少,仿真软件proteus仿真时按键数码管老是加二,最后发现是个按键的延时太短了,增加延时后才实现加一,不仅要看电路是否有问题,c语言编程也要检查。在实物的制作过程中遇到的麻烦更大,其中锻炼动手能力还是很好的,首先对于那些硬件都不怎么熟悉,这得就需要
19、我们去查阅书籍资料,一个元器件的接口有什么功能、在哪里,平常我们在书本上只能想象一下,现在拿到硬件了又该如何是好,大部分的硬件只有一个名字,其余的引脚全部要查阅相关资料。还有在焊接的过程中对于东西的使用也是很有讲究和技巧的。了解助焊剂与焊锡丝的关系,如何使用,怎么用得安全对于我们动手少的人来说是很有难度的。因此在第一次做的时候,线路极其混乱,出现了很多错误,没办法只有一次次的检查,重新排版、焊接,找到错误的地方。通过这个实物的制作,可以知道理想和现实的差距是很大的,在电脑上用软件绘制图形的时候能做得很轻松,但在动手做实物的时候必须一丝不苟,这还要足够的心思,花足够的精力才能够做好一件事情! 参
20、考文献1、康光华:电子技术基础(模拟部分 第五版)高等教育出版社2、康光华:电子技术基础(数字部分 第五版)高等教育出版社3、李朝青:单片机原理及接口技术 北京航空航天大学出版附录附全局电路仿真图附源程序 #include /#include#include reg51.h#define u8 unsigned char#define u16 unsigned int #define u32 unsigned long sbit led=P20;/定义按输出波形IO与单片机的相连sbit led1=P21;/定义按输出波形IO与单片机的相连sbit led2=P22;void delay_ms
21、(unsigned int a) /子程序-延时 unsigned int b; for(;a0;a-) for(b=100;b0;b-);void Timer0Init(void) /x毫秒12.000MHz TMOD &= 0xF0; /设置定时器模式 TMOD |= 0x01; /设置定时器模式 TL0 = 0xF1; /设置定时初值 TH0 = 0xFF; /设置定时初值 TF0 = 0; /清除TF0标志 TR0 = 1; /定时器0开始计时 ET0=1;/打开定时0中断 EA=1;/开启总中断void Delay15us() /12.000MHz unsigned char i;
22、i = 4; while (-i);void main() u8 num; /Timer0Init(); while(1) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /_nop_(); led=!led; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); le
23、d1=!led1; led=!led; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /_nop_(); led=!led; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); led1=!led1; led=!led;led2=!led2; void T0_int() interrupt 1 TL0 = 0xF1; /设置定时初值 TH0 = 0xFF; /设置定时初值 /led=!led;