范文一:方波信号发生器
/****************************************************************
** 程序:方波信号发生器
** 功能描述:基于51单片机的简易方波信号发生器。频率范围为1Hz~5KHz的方波发生器,
占空比1~5可调,可按键输入发生频率。
**设计硬件接口资源使用情况:
P0:数码管段码(8位)。连接方式:P0^7~P0^0-->dp、g、f、e、d、c、b、a。
P1:4X4矩阵按键。P0^0~P0^3-->行0~行3,P0^4~P0^7-->列0-列3。按键按下时为低电平。
P2:数码管位码(共八个共阳极数码管)。P2^0~P2^7-->S1~S7。注:本设计仅使用前五个数码管。
每个显示分别代表S1~S5-->频率千位、百位、十位、个位,占空比
P3^0:PWM波输出。
** 软件程序设计说明:
程序可以实现1~5000Hz可调占空比1~5(占空比算法: 高电平时间:低电平时间=1:1(或者2...5))
的方波信号输出。可以实现频率和占空比连续可调。循环扫描按键,并将频率和占空比的数组值送数码管
显示。按键有按下时重新计算频率和占空比,并依据预处理算法(程序详见函数Precond())预先计算出定
时定时的初值。其中对频率为10Hz~5000Hz的方波,使用一个定时循环定时高电平持续时间和低电平持续时
间。(程序详见315行至335行)当频率为1Hz~9Hz时,采用对1000Hz频率分频的方法实现。(程序详见337
行至359行)
按键部分。按键0-->频率千位加1;按键1-->频率千位减1;按键2-->频率百位加1;按键3-->频率百位减1;
按键4-->频率十位加1;按键5-->频率十位减1;按键6-->频率个位加1;按键7-->频率个位减1;
按键8-->占空比加1;按键9-->占空比减1。
按键处理,按键扫描使用线反转法,有软件去抖动部分。按键按下一次执行一次按键操作,即是按键弹起
时才执行一次按键操作。
数码管显示。数码管为8位共阳极数码管。使用动态扫描法显示。
注:使用晶振为12MHz
**作者:kach
**建立时间:2014.7.6
*****************************************************************/
#include
#include //调用该库可以使用_crol_()和_cror_()
#define uchar unsigned char
#define uint unsigned int
uchar P0led[]={1,0,0,0,1}; //P0led[]--频率及占空比数组。频率初始值为1000Hz,P0led[0]->千位,
//P0led[1]->百位,P0led[2]->十位,
//P0led[3]->个位,P0led[4]->占空比
uchar KeyNo,DutyRatio; //KeyNo--键值(取值0~15,16为无效态) ;DutyRatio--占空比(取值1~5)
uint couter=0,set1HTH0,set1HTL0,set1LTH0,set1LTL0,set2TH0,set2TL0,couterH,couterL;
//couter--定时器内计数器变量;set1HTH0,set1HTL0,set1LTH0,set1LTL0,
//set2TH0,set2TL0,couterH,couterL--不同频率时初值
uint Frequence; //Frequence--频率值
sbit PWM = P3^0;
uchar DSY_CODE[]= //共阳极数码管段码
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90 //9
};
/****************************************************************
**函数名:inituart()----串口初始化程序
**输入:--
**输出:--
**功能描述: 串口程序,调试使用
*****************************************************************/
/*void inituart()
{
SCON= 0x40; //串口方式1
PCON=0; //SMOD=0
REN=1; //允许接收
TMOD= 0x20; //定时器1定时方式2
TH1= 0xfd; //11.0592M 9600波特率
TL1= 0xfd;
TR1= 1; //启动定时器
} */
/****************************************************************
**函数名:delay_ms----延时函数
**输入:
xms----延时时间
**输出:
**功能描述:延时x ms.
*****************************************************************/
void delay_ms(uint xms)
{
uint t;
for(;xms>0;xms--)
for(t=0;t
}
/****************************************************************
**函数名: seg7leddisplay()
**输入:
P0led[]---- 共5位,0~3,每位分别表示频率的千,百,十,个位值;4,占空比值
**输出: --
**功能描述:用数码管显示当前的频率值。采用动态扫描的显示方式
*****************************************************************/
void seg7leddisplay()
{
uchar i,temp;
P2=0xfe;
for(i=0;i
{
P0=0xff; //数码管消隐
P2=_crol_(P2,1);
temp=P0led[i];
P0=DSY_CODE[temp]; delay_ms(1);
}
}
/****************************************************************
**函数名: keyscan() -----按键扫描函数
**输入:
外部按键:0~15(只支持一个按键被按下)
**输出:
KeyNo----按键键值0~15,16为无效态
DutyRatio----占空比值1~5
P0led[]---- 共5位,0~3,每位分别表示频率的千,百,十,个位值,4为占空比
**功能描述:扫描按键有无按下,若有按键按下时读取键值并处理按键操作,若无按键按下时键值KeyNo=16(无效状态)
*****************************************************************/
void keyscan()
{
uchar Tmp;
P1=0x0f;
if((P1&0x0f)!=0x0f)
{
delay_ms(10);
if((P1&0x0f)!=0x0f) //软件去抖动
{
Tmp=P1^0x0f; //按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值 switch(Tmp) //判断按键发生于0~3列的哪一行 ,对0~3行分别加起始值0,4,8,12
{
case 1 : KeyNo=0;break;
case 2 : KeyNo=4;break;
case 4 : KeyNo=8;break;
case 8 : KeyNo=12;break;
default : break; //无键按下
}
P1=0xf0; //高4位置0,放入4行
Tmp=P1>>4^0x0f; //按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或(^)把3个1变为0,唯一的0变为1 switch(Tmp) //对0~3列分别加值0,1,2,3
{ case 1 : KeyNo+=0;break; case 2 : KeyNo+=1;break; case 4 : KeyNo+=2;break; case 8 : KeyNo+=3;break; default: break; } } } else KeyNo=16; //当没有按键按下时默认将按键值设定为16(不存在的按键)
P1=0x0f;
while(P1!=0x0f);
if(KeyNo!=16)
{
switch(KeyNo)
{
case 0 :
if(P0led[0]==4)
P0led[0]=0;
else
P0led[0]+=1;
break;
case 1 :
if(P0led[0]==0)
P0led[0]=4;
else
P0led[0]-=1;
break;
case 2 :
if(P0led[1]==9)
P0led[1]=0;
else
P0led[1]+=1;
break;
case 3 :
if(P0led[1]==0)
P0led[1]=9;
else
P0led[1]-=1;
break;
case 4:
if(P0led[2]==9)
P0led[2]=0;
else
P0led[2]+=1;
break;
case 5 :
if(P0led[2]==0)
P0led[2]=9;
else
P0led[2]-=1;
break;
case 6 :
if(P0led[3]==9)
P0led[3]=0;
else
P0led[3]+=1;
break;
case 7 :
if(P0led[3]==0)
P0led[3]=9;
else
P0led[3]-=1;
break;
case 8 :
if(DutyRatio==5) //等待按键弹起,防止按一次键加多个值。缺陷:会造成按键时数码管闪烁一次 //有按键时执行按键操作 //频率的千位加1,0->1->..->4->0 //频率的千位减1,0->4->3->..->1->0 //频率的百位加1,0->1->2->..->9->0 //频率的百位减1,0->9->8->..->1->0 //频率的十位加1,0->1->2->..->9->0 //频率的十位减1,0->9->8->..->1->0 //频率的个位加1,0->1->2->..->9->0 //频率的个位减1,0->9->8->..->1->0 //占空比调节,加1,1—>2->..->5->1
DutyRatio=1;
else
DutyRatio+=1;
P0led[4]=DutyRatio;
break;
case 9 : //占空比调节,减1,1—>5->4->..->2->1
if(DutyRatio==1)
DutyRatio=5;
else
DutyRatio-=1;
P0led[4]=DutyRatio;
break;
default : break;
}
}
}
/****************************************************************
**函数名:init()----程序初始化程序函数
**输入:
**输出:
P0led[]---- 共4位,0~3,每位分别表示频率的千,百,十,个位值
KeyNo----按键键值0~15,16为无效态
DutyRatio----占空比值1~5
**功能描述: 初始化频率、键值、占空比、发光二极管状态、定时器T0(初始化为方式1)并开启中中断
**全局变量: P0led[],KeyNo,DutyRatio
*****************************************************************/
void init()
{
P1=0xff; //初始化矩阵按键接口
KeyNo=16; //初始化键值变量为16(即为无效状态)
DutyRatio=1; //初始化占空比为1
TMOD=0x02; //定时器T0中断工作在方式1
TH0=0xfe;
TL0=0xfe;
ET0=1;
EA=1;
TR0=1;
}
/****************************************************************
**函数名:CountFrequnce()----频率值计算程序
**输入:
P0led[]---- 共4位,0~3,每位分别表示频率的千,百,十,个位值
**输出:
Frequence----频率值
P1^(7~3)----占空比值指示
**功能描述:由数组P0led各位的值计算出频率值;占空比的值的状态用与P1^(7~3)相连的发光二极管指示
**全局变量:P0led[],Frequence
*****************************************************************/
void CountFrequnce()
{
uchar i;
Frequence=0;
for(i=0;i
Frequence=Frequence*10+P0led[i];
//说明:Frequence={ { [ (P0led[0]+0) *10+P0led[1]] *10+P0led[2]} *10+P0led[3]}
}
/****************************************************************
**函数名:Precond()--中断预处理程序
**输入:
Frequence--频率值,1到4999Hz
DutyRatio--占空比,1到5
**输出:
1.频率大于10Hz时送定时器的初值,分高电平定时时间和低电平定时时间初值:
set1HTH0-- 高电平定时时间TH0初值
set1HTL0-- 高电平定时时间TL0初值
set1LTH0-- 低电平定时时间TH0初值
set1LTL0-- 低电平定时时间TL0初值
2.频率为1到9Hz时送定时器的初值(固定值,1000Hz的定时初值,因采用分频法):
set2TH0-- TH0初值
set2TL0-- TL0初值
couterH-- 高电平持续周期数
couterL-- 低电平持续周期数
3.公用变量:
couter-- 计数器
**功能描述:通过频率和占空比计算出将送给定时器0的初值。分为10Hz到4999Hz和1到9Hz两部分计算.注:使用晶振为12MHz *****************************************************************/
void Precond()
{
if(Frequence>=10) //当频率>=10Hz时,计算出定时器0的初值。
{
set1HTH0=(65536-(1000000/(Frequence*(1+DutyRatio)))*7)/256; //注:*7为软件修正输出频率,纠正输出频率与预定频率的差错。 set1HTL0=(65536-(1000000/(Frequence*(1+DutyRatio)))*7)%256;
set1LTH0=(65536-(1000000*DutyRatio/(Frequence*(1+DutyRatio)))*7)/256;
set1LTL0=(65536-(1000000*DutyRatio/(Frequence*(1+DutyRatio)))*7)%256;
}
else //当频率
{
set2TH0=(65536-1000)/256;
set2TL0=(65536-1000)%256;
couterH=1000/(Frequence*(1+DutyRatio));
couterL=1000*DutyRatio/(Frequence*(1+DutyRatio));
}
couter=0;
}
/****************************************************************
**函数名: main()---主函数
**输入:
**输出:
**功能描述:
*****************************************************************/
void main()
{
init(); //程序初始化
// inituart(); //串口初始化,调试时使用
CountFrequnce(); //计算频率
Precond(); //计算定时器初值
while(1)
{
keyscan(); //按键扫描
if(KeyNo!=16) //有按键按下时执行频率重算和定时器初值重算(有按键操作时做预处理)
{
CountFrequnce();
Precond();
}
seg7leddisplay();
/* TI=1; //串口调试部分,调试结束后可以不适用该段程序
printf(
TI=1;printf(
printf(
}
}
/****************************************************************
**函数名: PWMout()----PWM波输出中断函数
**输入:
**输出:
**功能描述:用中断定时输出要求的频率
*****************************************************************/
void PWMout() interrupt 1 using 1
{
if(Frequence>=10)
{
if(couter==0)
{
TH0=set1HTH0;
TL0=set1HTL0;
PWM=1;
couter=1;
}
else
{
TH0=set1LTH0;
TL0=set1LTL0;
PWM=0;
couter=0;
}
}
if(Frequence
{
TH0=set2TH0;
TL0=set2TL0;
if(couter
{
PWM=1;
couter++;
}
else
{
if(couter==couterH+couterL)
{
PWM=1;
couter=0;
}
else
{
PWM=0;
couter++;
}
}
}
}
/*********************************************************************************/ /****************************结束**************************************************/
范文二:方波信号发生器
方波信号发生器
——07电子 马路 0736065
一:实验要求。
应用上面的DDS原理,设计一个产生方波的信号发生器,占空比可调。
二:实验电路及代码说明。
顶层文件为:
方波的设计过程同正弦波的基本相同,只不过不在需要rom文件,即不在需要data_rom文件了,转而用一个8位的比较器代替之。当DDS输出的相位值大于或是等于比较器的另一输入的8位信号值,则输出为一个8位的定值“10000000”,相反当小于该值时,输出为一定值“00000000”,把这8位的信号输入到DA的8个输入端,在示波器上即可观察出方波,其占空比随输入的8个按键的高低产生变化。
比较器元件符号如下:
代码如下:
为了便于观察方波的变化,这里把DDS设置为固定频率,即相位输出为定值。32位的高位:31~18位全零,低位:17~0位为全1。占空比通过SET[7..0]信号调节。时钟信号clk用的是FPGA芯片上的固有频率20M。
三:仿真。
仿真时,为了提高仿真的效率,可以不加锁相环。如下:
仿真波形设置:
仿真后的波形:
由仿真结果可知,产生了方波。 四:下载。
管脚设置。电路模式为5。
下载:
范文三:方波信号发生器设计
方波信号发生器设计
一.实验目的:
1.进一步熟悉QuartusII及其LPM_ROM与FPGA硬件资源的使用方法。
2.加深对电路理论概念的理解
3.进一步熟悉常用仪器的使用及调试
4.加深计算机辅助分析及设计的概念
5.了解及初步掌握对电路进行计算机辅助分析的过程
6.培养学生发现问题、分析问题的创新能力
7.锻炼学生搜集资料、分析综合资料的能力
二.实验原理:
方波波信号发生器由四部分组成:
计数器或地址发生器(这里选择6位)。
方波信号数据ROM(6位地址线、8位数据线),含有64个8位数据(一个周期)。 VHDL顶层设计。
8位D/A(实验中用DAC0832代替)。
图1所示的信号发生器结构框图中,顶层文件singt.vhd在FPGA中实现,包含两个部分:ROM的地址信号发生器,由6位计数器担任;一个方波数据ROM,由LPM_ROM模块构成。LPM_ROM底层是FPGA中的EAB、ESB或M4K等模块。地址发生器的时钟CLK的输入频率f0与每周期的波形数据点数(在此选择64点),以及D/A输出的频率f的关系是:f = f0/64。
图1 方波信号发生器结构框图
三.实验内容:
1.新建一个文件夹。利用资源管理器,新建一个文件夹,如:e : \SIN_GNT 。注意,文件夹名不能用中文。
2.输入源程序。打开 QuartusII,选择菜单“File” “New”,在 New 窗中的“Device Design Files”中选择编译文件的语言类型,这里选“VHDL Files”。然后在 VHDL 文本编译窗中键入VHDL 程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity square is
port(clk,clr:in std_logic;
q:out integer range 0 to 255
);
end entity;
architecture behav of square is
signal a:bit;
begin
process(clk,clr) --计数分频
variable cnt:integer range 0 to 32;
begin
if(clr='0') then
a
elsif clk'event and clk='1' then
if cnt
cnt:=cnt+1;
else
cnt:=0;
a
end if;
end if;
end process;
process(clk,a) --信号输出
begin
if clk'event and clk='1' then
if a='1' then
q
else
q
end if;
end if;
end process;
end behav;
3. 建立.mif 格式文件
首先选择 ROM 数据文件编辑窗,即在 File 菜单中选择“New”,并在 New 窗中选择“Other files”项,并“Memory Initialization File”(图 3-11),点击 OK 后产生 ROM 数据文件大小选择窗。这里采用 64 点 8位数据的情况,可选 ROM 的数据数 Number 为 64,数据宽 Word size 取 8 位。点击“OK”,将出现空的 mif数据表格,表格中的数据为 10 进制表达方式,任一数据(如第三行的 99)对应的地址为左列于顶行数之和。将波形数据填入此表中,完成后在 File 菜单中点击“Save as”,保存此数据文件,在这里不妨取名为romd.mif
4.定制ROM元件
利用 Mega Wizard Plug-In Manager 定制方波数据 ROM 步骤如下:
设置 Mega Wizard Plug-In Manager 初始对话框。在 Tools 菜单中选择“Mega Wizard Plug-In Manager”,产生图 3-14的界面,选择“Create a new custom…”项,即定制一个新的模块。点击“Next”后,产生图 3-15 对话框,在左栏选择“Storage”项下的 LPM_ROM,再选“Cyclone”器件和 VHDL 语言方式,最后键入 ROM 文件存放的路径和文件名,点击“Next”。
5.创建.bdf文件,连接引脚,如图:
6.编译
7.仿真
(1)打开波形编辑器。选择菜单 File 中的 New 项,在 New 窗中选“Other Files”中的“Vector Waveform File”,点击 OK,即出现空白的波形编辑器(图 3-21)。
(2)设置仿真时间区域。为了使仿真时间轴设置在一个合理的时间区域上,在 Edit 菜单中选择“End Time”项,在弹出的窗中的“Time”窗中键入 100,单位选“ms”,即整个仿真域的时间即设定为 100毫秒,点击 OK,结束设置。
(3)存盘波形文件。选择 File 中的“Save as”。
(4)编辑输入波形(输入激励信号)。点击时钟名 CLK,使之变兰色,再点击左列的时钟设置键,在 Clock 窗中设置CLK 的周期为 10ns(图 3-22);所示的 Clock 窗中的“
Duty
cycle”是占空比,可选 50,即 50%占空比,再对文件存盘
(5)编译仿真波形如图:
四.实验体会:
通过实验,激发了我们学习EDA的兴趣,也对这门课程有了更深的理解,对EDA设计软件Quarter Ⅱ的使用也更加熟练。在老师给我们的材料中,我们分析了方波信号发生器在整个运行过程中的状态,并参考资料写出了状态图,然后根据状态图用有限状态机来实现了各个状态之间的转换,进而实现了产生方波信号。
我想我们对EDA的学习只能算是个入门,这个领域的发展空间非常大,应用范围也非常广泛,而且我相信在将来还会有更加广阔的应用前景。因此在以后的学习过程中,我们不能因为课程学习的结束而结束了对这个领域的探索,相反我们应更加努力的去学习它。感谢老师孜孜不倦的教诲,让我们不仅学到了知识,也学到了做人做事的一些道理,为我们提供了很多帮助。在接下来的学习生涯中,我们会继续努力,努力扎实地学习专业知识,实现自己的理想。
范文四:方波信号发生器设计
单片机最小系统设计报告
课程名称:院 系:专业班级:学生姓名:指导教师:完成时间:报告成绩: 基于单片机的方波信号发生器 机电工程学院 机械制造及其自动化 吴兆华 2010年06月15日 _____ _____________________
目录
一、概述 ------------------------------------------------------------------ 2
1.1、设计内容 ------------------------------------------------------ 3 1.2、设计目的 ------------------------------------------------------ 3
二、方波发生器设计方案 ---------------------------------------------------- 3 三、系统的硬件设计 -------------------------------------------------------- 4
3.1、单片机最小系统 ------------------------------------------------ 4 3.2、电路板的制作 -------------------------------------------------- 5
四、程序流程图 ------------------------------------------------------------ 7 五、单片机程序设计清单----------------------------------------------------- 7 六、电路板连接图----------------------------------------------------------- 9 七、调试与性能分析 -------------------------------------------------------- 9
7.1硬件调试 -------------------------------------------------------- 9 7.2软件调试 -------------------------------------------------------- 9
八、设计体会 ------------------------------------------------------------- 10 参考文献 ----------------------------------------------------------------- 11
方波信号发生器设计
一、概述
单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。 1.1、设计内容
设计一个频率可调的方波发生器,方波脉宽为2us~10ms,步进100us。 1.2、设计目的
1、通过本次实验,掌握单片机I/O口的使用,4位7段数码管动态显示数据的方法以及DAC0832的用法;
2、通过对单片机的使用和编程,了解单片机的应用编程; 3、掌握单片机C语言设计和分析方法;
4、学会使用并熟练掌握电路绘制软件Protel99SE; 5、掌握电路图绘制及PCB图布线技巧。
二、方波发生器设计方案
在电子技术领域中,实现方波发生器的方法有很多种,可以采用不同的原理及器件构成不同的电路,但可以实现相同的功能。在此次设计中,有些地方与课题原本的具体要求有点不同。如实现频率调节时,不是按要求步进1us,那样频率显示太快,不容易辨别,所以采用步进100us。
本设计中使用芯片AT89S52,用到定时器中断和定时器延时。通过按键是否按下,
来改变发生器的频率,以灯泡的闪亮时间长短来表示频率变化。设计中安装了电压转换器,讲12v电压转换成5v电压(因为我自己使用的电源是12v电压)。
三、系统的硬件设计
3.1、单片机最小系统
单片机各功能部件的运行都是以时钟频率为基准的,有条不紊地进行工作。因而时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路方式有两种:一种是内部时钟方式,一种是外部时钟方式,这里采用的是内部时钟方式,外接晶振。时钟电路由片外晶体、微调电容和单片机的内部电路组成。选取频率为12MHz的晶振,微调电容是瓷片电容。
89S52单片机的P0.7口作为波形输出口,若接示波器,则可通过示波器来观察波形,是一个矩形波。
此单元电路包括时钟电路、复位电路,具体电路如图1所示:
图1 单片机最小系统
3.2、电路板的制作
Protel99功能强大,为我们进行电子电路原理图和印制板图的设计提供了良好的操作环境。用Protell99进行电路设计分为两大部分:原理图的设计和电路板的设计。原理图的设计实在SCH系统中进行的,电路原理图是印刷板电路设计的基础,只有设计好原理图才有可能进行下一步的电路板设计。
用protel99进行电路板设计的第一步是其原理图的设计。显然,原理图决定整个电路的基本功能,也是接下来生成网表和设计印刷板电路的基础。具体步骤如下:
(1)图面设置:
Protel99允许用户根据电路的规模设置图面的大小,按照偏好和习惯设置图面的样式。实际上,设置图面就是设置了一个工作平面,以后的工作就要在这个平面上进行。所以图面应该设置得足够大,为进一步工作提供一个足够大的工作空间。
(2)放置元件:
所谓放置元件就是从元件库中选取所需得元件,将其布置到图面上合适的位置,有时还要重定义元件的编号、封装。元件的封装很重要,要根据元件的实际尺寸和实际封装来决定,要是元件没封装好,将会给以后电路板的制作带来很大的麻烦。这些都是下一步工作的基础。Protel99为用户提供了一个非完备的元件库,并且允许用户对这个元件库进行编辑或者新建自己的元件库。
电路板的制作过程 (1) 打印:
将生成的PCB图打印到热转印纸上,需注意线不能太窄,墨要加重,否则制板时容易断线,如果在操作过程中断了线,可用电烙铁将锡带过。
(2) 熨烫:
将热转印纸覆在铜板上,用电熨斗进行熨烫,关键要注意熨烫的时间,不能太久,也不能时间太短,否则,太久会把铜板烫坏,不够的话墨迹覆不上去。
(3) 腐蚀:
把铜板放到三氯化铁溶液中腐蚀,需注意溶液浓度要较高,最好用热水配置,这样腐蚀更快,一般3分钟即可。如果时间过长,需剩下的铜线也可能被腐蚀。
(4) 打孔:
打孔时注意钻头尺寸,本次用的钻头大小是0.712mm的,最需注意的地方是集成块的管脚,如果打孔误差大,管座就很难插上。
(5) 放置元件:
放置前应先打磨一下打孔后留下的毛刺,并均匀地涂上松香水(目的是防止铜线氧化,易于焊锡覆着焊盘,但多涂会导致焊接时焊点变黑,影响美观)。放置元件时注意集成块的管脚,二极管和电解电容的正负,这些都是平时比较容易出错的地方。
(6) 焊接:
焊接技术比较难掌握,焊锡、烙铁与焊盘的位置关系,焊锡熔化时间 长短,松香水的浓度,烙铁的温度等等,都是影响焊点美观的因素。 (7) 检查:
检查是否有虚焊,集成块管脚位置是否正确,电源引线位置是否恰当等。检查完毕就能进行调试了。
四、程序流程图
图2 程序流程图
五、单片机设计程序清单
#include
#define uint unsigned int #define uchar unsigned char uint i,z,T0_cnt,T0_over_num; sbit pulse_out=P0^1; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);
}
void timer0() interrupt 1 { T0_cnt++;
TH0=(65536-1)/256; TL0=(65536-1)%256;
if( T0_cnt>=T0_over_num) { T0_cnt=0;
pulse_out=!pulse_out; } } main() {
pulse_out=0; T0_cnt=0;
T0_over_num=5000; TMOD |= 0x01; TMOD &= 0xfd; TH0=(65536-1)/256; TL0=(65536-1)%256; EA=1; ET0=1; TR0=1; while(1)
{ P2=0xff; i=P2; if(i!=0xff) delay(5); if(i!=0xff) { switch (i) { case 0xfe: T0_over_num=T0_over_num+100; if(T0_over_num==10000)
T0_over_num=2; break;
case 0xfd: T0_over_num=T0_over_num-100; if(T0_over_num==2)
T0_over_num=10000; break;
} } } }
六、电路板连接图
七、调试与性能分析
7.1硬件调试
硬件的测试首先是检查电路的逻辑线路是否正确,如果正确再检查原理图的线路连接是否正确,电路的布局安排是否合理等等。软件的测试只要是检查程序的语法是否正确,数据结构安排是否妥当,时序是否正确,整体流程安排是否合理。上面两部检查妥当后,就到了系统调试最关键的一步,软硬件的协同调试,问题往往在此才能被发现。 7.2软件调试
在软硬件协同调试时,硬件问题比较少,主要体现在上拉电阻的使用,滤波电容的使用等,极少发生逻辑上的错误。硬件的问题往往是致命的问题,其不易察觉,发现之后电路更改也不容易。这就需要我们不断的实验,在实战中摸索出规律,吸取经验教训,
在以后的电路设计中能设计出稳定的抗干扰能力强的电路。
调试过程:
1、保证电路板连接正确后,接上电源,测试最小系统是否工作;
2、观察灯泡是否按照预期情况闪烁,如果不相符,分析原因。找出问题的所在,解决问题,直到显示正确为止。
实验过程中的问题及改进方法:
1、制作电路板过程中由于焊接等原因,造成电路连接不通现象,浪费了调试时间。 2、在实际调试过过程中,由于对最小系统不熟悉,而导致开始时候最小系统不工作,复位电路没有反应,在同学的帮助下,找到了问题,调整了焊线,使系统显示正确了。
八、设计体会
在单片机课程设计中,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
但是,由于平时对单片机知识学习得不够扎实,理解得不够透彻、一知半解,致使在运用是不能贯通,导致在设计过程中困难重重,往往无从下手,但是通过和同组的同学一起探讨,最后还是一步一步的把所有的问题给一一解决了。在这次设计过程中,我也对word、protel、画图板等软件有了更进一步的了解,这使我在以后的学习中更加熟练。
总之,本次单片机课程设计让我悟出了许多东西:第一,就是对资料的搜索、整理、归类、总结、保存的能力是一个至关重要的个人能力。如果没有这种能力,在大学学习阶段,那么我们的学习将会是一种负担;今后我们走出校门,甚至在整个人生阶段,也将会碌禄无为;第二,我们要学会坚持不懈,不轻易言弃,这对于我们非常的重要。如果我们没有这种精神,一旦我们遇到一点挫折,我们也许就会被打败,以后进入社会就
会没有我们的立足之地。因此,我们要珍惜大学时光,循序渐进的培养这些能力,这样才不会被瞬息万变的时代所淘汰。
参考文献
[1] 何立民.MCS51单片机应用系统设计[M].北京:北京航空航天大学出版社,2003.
[2] 徐君毅.单片微型机原理与应用[M].上海:上海科技出版社,1995
[3] 公茂法.单片机人机接口实例集[M].北京:航空航天大学出版社,1998.
[4] 沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出版社, 2005.
[5] 李广弟,朱月秀等.单片机基础[M].北京:北京航空航天大学出版社, 2003. 11
范文五:方波信号发生器设计论文
摘要
随着大规模集成电路技术和计算机技术的飞速发展,把计算机的运算器和控
制器(即CPU)、存储器和多种接口集成在一块芯片上而成的芯片为单片机。单
片机问世20年来,发展速度之迅猛,应用范围之广泛是以往任何技术都无法比
拟的。单片机作为嵌入式微控制器其应用很普及。
本文介绍了单片机的概念、分类、发展过程,并使用MCS-51单片机和CD4094
单片机设计多用方波发生器的硬件电路和控制电路,并对单片机进行了软件编
程,使用户可以方便的制造和生产多用方波信号发生器。
本文第一章简单介绍了单片机的发展过程和应用领域;第二章以MCS-51单
片机为例,具体介绍单片机的结构以及工作原理;第三章使用MCS-51单片机和
CD4094单片机设计多用方波发生器的硬件电路和控制电路,并进行软件编程。
关键词:微处理器,单片机,MCS-51单片机,多用信号发生器电路,多用
信号发生器程序,
ABSTRACT
Along with the large scale integrated circuit technology and the computer technology rapid development, the computer logic unit and the controller (namely CPU), the memory and the many kinds of interfaces integration the chip which becomes together on the chip is a monolithic integrated circuit. The monolithic integrated circuit is published for 20 years, development speed swift and violent, the application scope was broad is formerly any technology all is unable to compare. The monolithic integrated circuit achievement inserts declines controller its application to be very popular. This article introduced the monolithic integrated circuit concept, the classification, the developing process, and use the MCS-51 monolithic integrated circuit and the CD4094 monolithic integrated circuit design multipurpose square wave-form oscillator hardware electric circuit and the control circuit, and has carried on the software programming to the monolithic integrated circuit, causes manufacture and production multipurpose square-wave signal generating device which the user may facilitate. The this article first chapter simply introduced the monolithic integrated circuit developing process and the application domain; Second chapter take the MCS-51 monolithic integrated circuit as the example, specifically introduces the monolithic integrated circuit the structure as well as the principle of work; Third chapter uses the MCS-51 monolithic integrated circuit and the CD4094 monolithic integrated circuit design multipurpose square wave-form
oscillator hardware electric circuit and the control circuit, and
carries on the software programming. Key word: Microprocessor,
monolithic integrated circuit, MCS-51 monolithic integrated circuit,
multipurpose signal generating device electric circuit, multipurpose
signal generating device program,
Key words: Microprocessor,
第一章 概述
1.1 单片机介绍
1.1.1 单片机的概念
随着大规模集成电路技术和计算机技术的飞速发展,把计算机的运算器和控
制器(即CPU),存储器和多种接口集成在一块芯片上,称为微处理器
(Microprocessor)。也叫微控制器,习惯上叫单片机。
微型计算机问世20年来,发展速度之迅猛,应用范围之广泛是以往任何技
术都无法比拟的。单片机作为嵌入式微控制器其应用很普及。
1.1.2 单片机的分类
单片机按存储器的类型分为五种类型:
MASKROM类:程序在芯片封装过程中用掩膜工艺制作到RAM区中,如80C51,
适合于大批量生产。
EPROM类:紫外线可擦写存储器类,如87C51(价格较贵)。
ROMless类:无ROM存储器,如80C31,电路扩展复杂,现在较少用。
OTPROM类:可一次性写入程序。
FlashROM(MTPROM)类:可多次编程写入存储器,如89C51,89S51等,其
成本低,开发调试方便,可重复烧写程序。
1.1.3 单片机的组成
一个最基本的微型计算机通常由以下几部分组成:
(1)中央处理器(CPU),包括运算器、控制器和寄存器组;
(2)存储器,包括ROM(只读存储器)和RAM(静态可读写存储器);
(3)输入输出(I/O)接口,与外部输入输出设备连接。
随着计算机微型化的需要,把上述微型计算机的基本功能部件全部集成在一块半导体芯上,使得一块集成电路芯片就是一个是单片机,单片机除了具备一般微型计算机的功能外,为了增强实时控制能力,绝大部分单片机的芯片上还集成有定时器/计数器,某些单片机带有A/D转换器等功能部件,使单片机能满足多功能控制要求。
单片机结构上的设计重点是面向控制的需要,因此,它在硬件结构、指令系统和I/O能力等方面均有其独特之处,其显著的特点之一就是具有非常有效的控制功能。所以,单片机不但与一般的微机结构一样是有效的数据处理机,而且还是一个功能很强的过程控制机。只要加上较少的所需要的输入/输出设备或驱动电路,就可以构成一个实用的系统,满足各种应用领域的需要。把硬件功能软件化。
1.1.4 单片机的特点
单片机具有集成度高、体积小、功耗低、系列齐全、功能扩展容易、使用灵活方便、抗干扰能力强、性能可靠、价格低廉等特点。
1.1.5 单片机的发展概况
单片机自从1975年诞生以来,经历了近30年的发展。目前单片机的产品已达60多种系列,300多种型号。就字长而言,单片机主要有4位、8位、16位和32位多种。
1.2 单片机的应用领域
由于单片机具有体积小、使用灵活、成本低、易于产品化等的特点,特别是有强大的、面向控制的能力,使它在工业控制、智能仪表、外设控制、家用电器、机器人、军事装置等方面得到了广泛的应用。
单片机的主要应用领域有以下几方面。
1.2.1 智能化产品
单片机与传统的机械产品相结合,使传统的机械产品结构简单化,控制智能
化,构成新一代的机、电一代化产品。目前,广泛用于工业自动控制,如数控机床、可编程顺序控制、电机控制、工业机器人,离散与连续过程自动控制等;家用电器,如微波炉、电视机、录像机、音响设备、游戏机等;办公设备,如传真机、复印机等;电讯技术,如调制解调器、声像处理、数字滤波、智能线路运行控制;在电传、打印机设计中由于采用了单片机,取代了近千个机械部件;用单片机控制空调机,使制冷量无级调节的优点得到了充分的发挥,并增加了多种报警与控制功能;用单片机实现了通信系统中的临时监控、自适应控制、频率合成、信道搜索等,构成了自动拨号无线电话网、自动呼叫应答设备及程控调度电话分机等等。
1.2.2 智能化仪表
单片机引入原有的测量、控制仪表后,能促进仪表向数字化、智能化、多功能化、综合化、柔性化发展,并使监测、处理、控制等功能一体化,使仪表重量大大减轻,便于携带和使用。同时成本低,提高了性能价格比,长期以来测量仪器中的误差修正、线性化处理等难题也可迎刃而解。单片机智能仪表的这些特点不仅使传统的仪器、仪表发生根本的变革,也给传统的仪器、仪表行业技术改革带来曙光。
1.2.3 智能化测控系统
测控系统特点是工作环境恶劣,各种干扰繁杂,而且往往要求控制实时,要求检测与控制系统工作稳定、可靠、抗干扰能力强。单片机最适合应用于工业控制领域,可以构成各种工业检测控制系统。例如,温室人工气候控制、电镀生产线自动控制系统等。在导航控制方面,如在导弹控制、鱼雷制导、智能武器装置、航天导航系统等领域中也发挥着不可替代的作用。
1.2.4 智能化接口
通用计算机外部设备上已实现了单片机的键盘管理、打印机、绘图仪、磁盘驱动器、UPS等,并实现了图形终端和智能终端。
在计算机应用系统中,除通用外部设备(键盘、显示器、打印机)外,还有许多外部设备和接口全部由主机管理,势必造成主机负担过重、运行速度降低,并且不能提高对各种接口的管理水平,现在一般采用单片机专门对接口设备进行控制和管理,使主机和单片机能并行工作,不仅大大提高系统的运算速度,而且单片机还可以对接口住处进行预处理,如数字滤波、线性化处理、误差修正等,减少主机和接口界面的通信密度,极大地提高了接口控制管理的水平。例如,在通信接口中采用单片机可以对数据进行编码解码、分配管理、接收/发送控制等工作。
要开发单片机的应用,不但要掌握单片机硬件和软件方面的知识,而且还要深入了解各应用系统的专业知识,只有将这两方面的知识融会贯通和有机结合,才能设计出优良的应用系统。
1.3 单片机的发展历程
单片机自从20世纪70年代问世以来,以其鲜明的特点得到迅猛的发展,单片机的发展经历了以下几个阶段:
1. 单片机的初级阶段
1976年Intel公司推出了8位的MCS-48系列的单片机,以其体积小、重量轻、控制功能齐全和低价格的特点,得到了广泛的应用,为单片机的发展奠定了坚实的基础。
2. 单片机的发展阶段
80年代初,Intel公司推出了8位的MCS-51系列的单片机,随着单片机的应用的急剧增加,其它的单片机也随之大量涌现如:motorola的68系列,Zilog的Z8系列等。
3. 高性能单片机发展阶段
随着控制领域对单片机性能要求的增加,出现了16位的单片机,而且芯片内部也增加了其他的性能。如Intel的MCS-96系列单片机,在单片机内部集成了A/D转换器、PWM输出。
在未来,应各种电子产品对单片机的要求,单片机将会向多功能、高性能、高速度、低电压、低功耗、大容量存储器的方向发展。
1.4 单片机的产品介绍
1 MCS-51系列
MCS-51系列是Intel公司1980年推出的高档8位单片机。该系列包括基本型;8051/8751/8031;强化型8052/8032;改进型8044/8344/8744,超级型:83C252/87C252/80C252等。
基本采用HMOS工艺,片内集成有8位CPU;片内驻留4K字节ROM(8031片内无ROM)和128字节RAM以及21个特殊功能寄存器;片内还包括两个16位定时器/计数器、1个全双工串行I/O口(UART)、32条I/O线、5个中断源和两级中断,寻址能力达128K字节(其中程序存储器ROM和数据存储器RAM各64K字节)。指令系统中设置了乘、除运算指令、数据查找指令和位处理指令等。主时钟频率为12MHZ时,大部分指令周期只需lus,乘除指令也仅需4us。
强化型8052是1982年推出的产品,与基本型8051不同的是片内ROM增加
到8K字节,RAM增加到256字节,16位的定时器/计数器增加到3个,串行接口(UART)的通信速度率快6倍。
改进型8X44系列是在基本型上用一种新的串行接口SIU取代UART。SIU是一个HDLC/SDLC通信控制器,属于SIO的通信标准,通信软件已固化在器件内。由于SIU是有两根I/O线的串行通信方式,因而最适宜远距离通信和网络接口。
采用CMOS工艺的8XC51系列,其基本结构和功能与基本型相同。87C51和8XC252还具有两级程序保密系统,可禁止外部对片内ROM中的程序进行读取,为用户提供了一种保护软件不被窃取的有效手段。由于采用CMOS工艺,功耗极低。
超级型8XC252系列是超8位单片机。它们的结构、引脚和指令与MCS-51系列完全相同,但又具有MCS-96系列高速输入/输出(HIS/O)功能和脉冲宽度调制PWM,1个可做加减计数的定时器;1个可做编程计数器库阵列以及适用于串行口的场错误检测和自动地址识别。
51系列由Intel公司转让技术给Philips公司后也生产了很多个型号,产品性能也有提高。
ATMEL公司生产了AT89C51 AT89C52和AT89C1051、AT89C2051等,这些单片机片内采用可加密闪速存储器,性能优良,性价比及高。台湾也在生产51内核的单片机。
2 列的单片机由于其内部功能单元组成及指令系统不尽相同,表现出各种不同的特点,从用户使用角度来看应当有所选择。在各系列的单片机中,片内ROM的配置状态通常有4种形式;
(1)片内驻留掩膜ROM。这种单片机(如MCS-51中的8051)是由厂家用掩摸技术把应用程序写入片内ROM中。用户无法自行改写片内的程序,推广应用受限制。
(2)片内驻留EPROM。这种单片机(如MCS-51中的8751)可由用户把应用程序写入片内ROM中。用紫外线擦除后又能重新写入程序。
(3)片内无ROM。这种单片机(如MCS-51中的8031)必须外接EPROM芯片作为程序存储器,其容量可视需要来灵活配置。这是目前学校教学中使用最广泛的一种单片机,不仅其价格低廉,而且可供用户灵活使用。
(4)片内带闪速可编程电可擦除只读存储器(如AT89C51),这是目前应用产品开发中使用最多的一种单片机系列。
第二章 MCS-51单片机结构原理
2.1 MCS-51单片机的性能及结构
MCS-51系列单片机是在一块芯片上集成了CPU,RAM,ROM、定时器/计数器和多功能I/O口等基本功能部件的一台计算机。单片机必须配备部分外围元件才能使用,其系统核心是单片机芯片。
图2-1 MCS-51单片机的内部结构框图
2.2 CPU的结构
CPU包括运算器和控制器二大部分。
2.2.1 运算器
运算器包括算术,逻辑部件(ALU)、累加器A、暂存寄存器、寄存器B、程序状态寄存器(PSW),十进制调整电路等。运算器主要用于实现算术/逻辑运算及位操作运算。下面介绍运算器的各组成部分。
1、算术,逻辑部件ALU
2、累加器A
3、寄存器B
4、程序状态字寄存器PSW
图2-2 程序状态字寄存器PSW
CY(PSW.7):进位标志位。在进行加法(或减法)运算时,若运算结果最高位有进位或借位,则CY自动置“1”,否则CY置“0”,在进行布尔操作运算时,CY(简称C)作为布尔处理器。
AC:辅助进位标志位。当进行加法或减法时,若低4位向高4位有进位(或借位)时,AC被置“1”,否则AC被置“0”。在十进制调整指令中AC还作为十进制调整的判别位。
F0:用户标志位。用户可用软件对F0位置“1”或清“0”以决定程序的流向。
OV:溢出标志位,当运算结果溢出时OV为“1”,否则为“0”,此标志位反映了运算结果是否溢出。
PSW.1:未定义位。
P(PSW.0):奇偶标志位。MCS-51单片机采用的是偶校验。当累加器A中“1”的个数为奇数时,P置“1”,否则P置“0”。此位反映累加器A中内容“1”的奇偶性,它常常用于机间通信。
RS1、RS0:工作寄存器区选择位。用来选择当前工作的寄存器区。用户通过改变RS1 、RS0的内容来选择当前工作寄存器区。RS1、RS0的内容与工作寄存器区的对应关系如表2-1所示。
表2-1 RS~、RS0与片内寄存器组的对应关系 RS1 RS0 寄存器区 片内RAM地址 通用寄存器名称 0 0 0 00H-07H R0-R7 0 1 1 08H-0FH R0-R7 1 0 2 10H-17H R0-R7 1 1 3 18H-1FH R0-R7 2.2.2 控制器
1、指令寄存器IR和指令译码器ID。
指令寄存器是存放指令代码的地方。当执行指令时,CPU把从程序存储器中
读取的指令代码送入指令寄存器,然后指令译码器译码后由定时控制电路发生相应的控制信号,最终完成指令所规定的操作。
2、程序计数器PC
程序计数器PC的功能与普通微机相同,它用来存放CPU执行的下一条指令的地址。当一条指令按照PC所指的地址从程序存储器中取出后,PC会自动加1,指向下一条指令。程序计数器PC是一个16位的寄存器,可寻址64KB的程序存储器空间。
3、堆栈指针SP
4、数据指针寄存器DPTR
2.2.3 工作寄存器和特殊功能寄存器
1、工作寄存器
MCS-51有32个工作寄存器,分为四个区(或组)每个区为8个寄存器R0、R1、R2、R3、R4、R5、R6、R7,每一时刻只有一个区工作。由PSW寄存器中的RS1、RS0的值来决定当前的工作区:
当 RS1 RS0,00时,0区为工作区,
RS1 RS0,01时,1区为工作区
RS1 RS0,10时,2区为工作区
RS1 RS0,11时,3区为工作区
这32个工作寄存器不但有它们的名称和区号,而且还有地址。00H-1FH共32个单元。
00H,07H为0区,分别对应R0,R7
08H,0FH为1区,分别对应R0,R7
10H,17H为2区,分别对应R0,R7
18H,1FH为3区,分别对应R0,R7
这32个单元为内部数据存储器(即片内RAM)的00H,1FH存贮空间,这与普通微机中的通用寄存器基本相同,所不同的是,普通微机的通用寄存器只有名称,不占有RAM空间,因此只有名字,没有对应的地址;而MCS-51单片机的工作寄存器R0,R7既可以用名字也可以用它的地址来表示。其中R0、R1寄存器除做工作寄
存器外还常做间址寻址的地址指针。
2、特殊功能寄存器SFR(又称专用寄存器)
这21个特殊功能寄存器详情见表2-2。
表2-2 特殊功能寄存器SFR 特殊功能寄存器 功能名称 地址 复位后初态 B 通用寄存器 F0H 00H A 累加器 EDH 00H PSW 程序状态寄存器 D0H 00H IP 中断优先级控制寄存器 B8H XXX00000B P3 P3口数据寄存器 B0H FFH IE 中断允许控制寄存器 A8H 0XX00000B P2 P2口数据寄存器 A0H FFH SBUF 串行口发送/接收缓冲器 99H 不定 SCON 串行口控制寄存器 98H 00H P1 P1口数据存储器 90H FFH TL1 T1计数器低8位 8BH 00H TL0 T0计数器低8位 8AH 00H TH1 T1计数器高8位 8DH 00H TH0 T0计数器高8位 8CH 00H TMOD 定时器/计数器方式控制寄存器 89H 00H TCON 定时器控制寄存器 88H 00H PCON 电源控制寄存器 87H 00H DPL 地址寄存器低8位 82H 00H DPH 地址寄存器高8位 83H 00H SP 堆栈指针寄存器 81H 07H P0 P0口数据寄存器 80H FFH 这21个特殊功能寄存器中,有11个寄存器具有位寻址功能,即寄存器中的
每位都具有位地址,可以按位寻址。11个寄存器的位地址如图2-3所示。
图2-3 SFR块中具有位寄存器寻址功能的位地址
2.3 MCS-51单片机存储器
图2-4 8051存储器的配置图
2.3.1 程序存储器
8051单片机内部有4KB的掩膜ROM、8751单片机内部有4KB的EPROM,而8031内部没有程序存储器,必须外接程序存储器。
2.3.2 数据存储器
MCS-51系列单片机数据存储器分内部数据存储器(即片内RAM)和外部数据存储器(即片外RAM)。
1、内部数据存储器
图2-5 内部数据存
2、外部数据存储器
由于MCS-51子系列单片机内部数据存储器只有128个字节,往往不够用,这就需要扩展外部数据存储器,外部数据存储器最多可扩至64KB。 2.4 时钟电路及时序
2.4.1 时钟电路
1、 内部方式时钟电路
2、 外部方式时钟电路
(A)
(B)
图2-6 单片机时钟电路
(A)内部时钟电路; (B)外部振荡源(外部时钟电路) 2.4.2 时序
1、基本概念
(1) 振荡周期
振荡周期指为单片机提供定时信号的振荡源的周期,即晶体振荡器直接产生的振荡信号的振荡周期。
(2) 时钟周期
时钟周期是振荡周期的两倍。是对振荡器2分频的信号。时钟周期又称状态周期,用S来表示,一个时钟周期,分为两个节拍,P1和P2节拍。P1节拍通常完成算术逻辑操作,P2节拍通常完成内部寄存器间数据的传递。
(3) 机器周期
一个机器周期由6个时钟周期组成,即S1,S6,如果把一条指令的执行过程划分为几个基本操作,则完成一个基本操作所需的时间称为机器周期。
(4) 指令周期
指令周期是执行一条指令所需的全部时间。MCS-51单片机的指令周期通常由1,4个机器周期组成。
2、几种典型的取指和执行时序
(1) 单字节单周期指令
(2) 双字节单周期指令
(3) 单字节双周期指令
(4) 访问外部数据存储器指令MOVX时序
图2-7 MCS-51 单片机取址/执行时序图 2.5 输入/输出端口
2.5.1 P0口 2.5.1 P0口
P0口有,位,每一位由一个锁存器、两个三态输入缓冲器以及控制电路和P0口有,位,每一位由一个锁存器、两个三态输入缓冲器以及控制电路和
驱动电路组成,其位结构如图2-8(a)所示。 驱动电路组成,其位结构如图2-8(a)所示。
1、 P0口作通用I/O口
2、 作分时复用的地址/数据总线
图2-8(a) P0口的位结构图
2.5.2 P1口
P1口是一个专用的8位准双向I/O口,只具有通用输入/输出口功能,每一位都能设定为输入或输出,它的位结构如图2-8(b)所示。
图2-8(b) P1口的位结构图
2.5.3 P2口
P2口是一个8位准双向I/O口,具有两种功能。一是作通用I/O口用,与P1口相同。二是作扩展系统的高8位地址总线。输出高8位地址,与P0口一起组成16位地址总线。它的位结构如图2-8(c)所示。
图2-8(c) P2口的位结构图
2.5.4 P3口
P3口也是一个8位准双向I/O口,除具有与P1口同样的功能(即可以作通用I/O口使用)外,还具有第二功能。当工作在第二功能时,每位都具有新的功能,各位的定义如表2-4。
P3口的位结构如图2-8(d)所示,当P3口作通用I/O口时,与P1口相同。
图2-8(d) P3口的位结构图
2.5.5 P0,P3口的负载能力及接口要求
P0口的输出级的每一位可驱动8个LSTTL门。P0口作通用I/O口时,由于
数据总输出级是开漏电路,故用它驱动NMOS电路时需外加上拉电阻;而作地址/线时,无需外接上拉电阻。
P1口,P3口的输出级的每一位可驱动4个LSTTL门。由于它们的输出级内部有上拉电阻,因此组成系统时无需外加上拉电阻。
2.6 MCS-51单片机的引脚功能
MCS-51单片机共有40个引脚。
图2-9 MCS-51单片机的引脚及总线结构 2.7 MCS-51单片机的工作方式
MCS-51单片机有三种工作方式,复位方式、程序执行方式以及节电工作方式。
2.7.1 复位方式
1、单片机复位后的工作状态
2、复位电路
图2-10 (a)上电复位电路;(b)按钮复位电路;(c)上电及按钮复位电路
图2-11 实用上电及外部复位电路
2.7.2 程序执行方式
1、连续执行方式
2、单步执行方式
2.7.3 节电工作方式
1、HMOS单片机的掉电工作方式
2、CHMOS单片机的节电工作方式
(1) 电源控制寄存器PCON
图2-12 电源控制寄存器PCON (2) 等待工作方式
将PCON中的IDL位置1,单片机进入等待工作方式,如图2-13所示。
图2-13 节电方式控制电路 2.8 89C51单片机简介
89C51单片机的外形采用40条引脚双列直插封装(DIP)或LCC/QFP封装。
DIP封装的引脚和逻辑符号如图2-14所示。
图2-14 单片机的引脚功能和逻辑符号
图2-15 单片机的逻辑符号 1、引脚功能介绍:
?Vcc:电源电压
?GND:地
?P0口:P0口是一组8位漏极开路型双向I,0口,也即地址,数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“l”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。。
?P1口:Pl是一个带内部上拉电阻的8位双向I,O口,Pl的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“l”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
P2口:P2是一个带有内部上拉电阻的8位双向I,O口,P2的输出缓冲级可?
驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
位地址的外部数据存储器(例如执行MOVX@DPTR在访问外部程序存储器或16
指令)时,P2口送出高8位地址数据。在访问 8 位地址的外部数据存储器(如执行MOVX@Ri 指令)时,P2 口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。
?P3口:P3口是一组带有内部上拉电阻的8位双向I,0口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“l”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3 口除了作为一般的 I,0 口线外,更重要的用途是它的第二功能,如下表所示:
表2. 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(外部数据存储器读选通)
?RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRT0位(地址8EH)可打开或关闭该功能。DISRT0位缺省为RESET输出高电平打开状态。
?ALE,PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE 仍以时钟振荡频率的 1,6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条M0VX和M0VC指令ALE才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。
?PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当 AT89S51 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN信号。
?EA,VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H
),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,,FFFFH
复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
?XTALl:振荡器反相放大器及内部时钟发生器的输入端。
?XTAL2:振荡器反相放大器的输出端。
2、方式和控制寄存器
定时器/计数器有4种工作方式,由TMOD设置,并由TCON控制。定时器/计数器方式寄存器TMOD各位定义如下表所示:
表3. TMOD各位定义
----GATE M1 M0 GATE M1 M0 C/T C/T
T1控制方式 T0控制方式
M1M0可组成4种编码,分别对应4种工作方式,如下表所示:
表4. 定时器4种工作方式
M1 M0 方式 说明
0 0 0 13位定时器(TH的8位和TL的低5位)
0 1 1 16位定时器/计数器
1 0 2 自动重装入初值得8位计数器
1 1 3 T0分成两个独立的8位计数器,T1在方式3时停止工作
----
当C/T=1时,为计数方式;C/T=0时,为定时器方式。
当GATE=1时,只有外部中断引脚为高电平且TR0(或TR1)置1时,相应的定时器/计数器才能被选通工作,这时可用于测量INTX端出现的正脉冲的宽度。当GATE=0时,只要TR0(或TR1)置1,定时器/计数器就被选通,而不管外部中断引脚电平是高还是低。
定时器/计数器控制寄存器TCON用于控制定时器的操作及对定时器中断的控制。其各位定义如下表所示:
表5. TCON各位定义
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
各引脚作用如下表所示:
表6. TCON各位作用
名称及定义 符号
内部定时器1溢出标志。当定时器/计数器溢出时,由硬件置位,申请TF1 中断,进入中断服务后被硬件自动清除。
内部定时器1运行控制位。靠软件置位或清除,置位时,定时器/计数TR1 器接通工作,清除时停止工作。
内部定时器0溢出标志。其作用类似于TF1 TF0
内部定时期0运行控制位。其作用类似于TR1 TR0
外部中断1请求标志。检测到外部中断引脚上出现的外部中断信号有IE1 效时,由硬件置位,请求中断。进入中断服务后被硬件自动清除。
外部中断1类型控制位。靠软件来设置或清除,以控制外部中断的触IT1 发类型。高电平时,下降沿触发;低电平时,低电平触发。
外部中断0请求标志。其作用类似于IE1。 IE0
外部中断0类型控制位。起作用类似于IT1。 IT0
3、定时器0和1的操作
定时器0和 1定时和计数功能由特殊功能寄存器TMOD的控制位C/T进行选择。这两个定时/计数器4 种操作模式,通过TMOD的M1和M0进行选择。两个定时/计数器的模式0,1和2都相同,模式3不同。如下所述:
模式 0
将定时器设置成模式0时类似8048定时器,即 8位计数器带32分频的预分频器。
此模式下,定时器寄存器配置为13位寄存器。当计数从全为 1 翻转为全为 0
TFn 置位。当 TRn=1 同时 GATE=0 或 INTn=1 时定时器时,定时器中断标志位
计数。置位GATE时允许由外部输入INTn控制定时器,这样可实现脉宽测量。
该13位寄存器包含THn全部8个位及TLn的低5位。TLn的高3位不定,可将其忽略,置位运行标志 TRn 不能清零此寄存器。
模式0的操作对于定时器 0 及定时器 1 都是相同的,两个不同的GATE位 TMOD.7和 TMOD.3分别分配给定时器 0 及定时器 1。
模式 1
模式 1 除了使用了THn及TLn全部 16 位外,其它与模式0相同。
模式 2
此模式下定时器寄存器作为可自动重装的8位计数器 TLn。TLn 的溢出不仅置位TFn,而且将THn内容重新装入 TLn,THn 内容由软件预置重装时,THn 内容不变。模式2的操作对于定时器0及定时器1是相同的。
模式 3
在模式3中,定时器1停止计数,效果与将TR1设置为0相同。
此模式下定时器0的TL0及TH0作为两个独立的8位计数器。TL0占用定时器0的控制位C/T,GATE,TR0,INT0及TF。TH0限定为定时器功能(计数器周期),占用定时器1的TR1及TF1。此时TH0控制定时器1中断。
模式 3 可用于需要一个额外的8位定时器的场合。定时器0工作于模式3时,89C51 看似有 3 个定时器/计数器, 定时器1可通过开关进入/退出模式3,它仍可用作串行端口的波特率发生器,或者应用于任何不要求中断的场合。
4、中断
89C51共有5个中断源。外部中断INT0和INT1可根据寄存器TCON中的IT0 和IT1位状态分别设置为电平或者边沿触发。实际产生的中断标志是TCON中的位IE0和IE1。当产生外部中断时,如果是边沿触发,进入中断服务程序后由硬件清除中断标志位。如果中断是电平触发,由外部请求源而不是由片内硬件控制请求标志。
定时器0和定时器1中断由TF0和TF1(分别由各自的定时/计数寄存器控制, 定时器0工作在模式3时除外)产生。当产生定时器中断时,进入中断服务程序后由片内硬件清除标志位。
所以这些产生中断的位都可通过软件置位或清零。与通过硬件置位或清零的效果相同。简而言之,中断可由软件产生,推迟或取消。
当中断服务程序执行到RETI指令时,通知处理器中断程序已执行完毕,然后从堆栈弹出两个字节重新装入PC,继续执行被中断的程序。
注意:RET指令也可以返回被中断的程序,但这样会使中断系统认为中断仍在执行,那么后面的中断就无法响应.
5、中断优先级结构
每个中断源都可通过编程中断优先级寄存器IP单独设置优先级。一个中断服务程序可响应更高级的中断,但不能响应同优先级或低级中断。最高级中断服务程序不响应其它任何中断。如果两个不同中断优先级的中断源同时申请中断时,响应较高优先级的中断申请。下面就简单介绍一下IP寄存器。
IP寄存器定义如下图所示:
表7. IP寄存器定义
* * * PS PT1 PX1 PT0 PX0
各位的作用如下表所示:
表8. IP寄存器各位作用
符号 名称及定义
串行口中断优先级设定位。高电平时,串行口为高优先级,相反为低PS 优先级。
内部定时器1中断优先级设定位。高电平时,T1为高优先级,相反为低PT1 优先级。
外部中断1优先级设定位。高电平时,外部中断1为高优先级,相反为PX1 低优先级。
内部定时器0中断优先级设定位。高电平时,T0为高优先级,相反为低PT0 优先级。
外部中断0优先级设定位。高电平时,外部中断0为高优先级,相反为PX0 低优先级。
IP寄存器中包含了一些无效位,由于这些位可能用于其它89C51系列产品中,用户软件不应将这些位写入1。
89C51共有5个中断源,为了使每个中断源都能被独立的允许或禁止,以使用户灵活使用,它在每个中断信号的通道中设置了一个中断屏蔽触发器。只有该触发器无效,它所对应的中断请求信号才能进入CPU,即此类型中断开放。同时,CPU内还设置了一个中断允许触发器,它控制CPU能否相应中断。
中断屏蔽触发器和中断允许触发器由中断允许寄存器IE控制,其各位定义如下表所示:
表9. IE寄存器各位定义
EA * * ES ET1 EX1 ET0 EX0
各位的作如下表所示:
表10. IE寄存器各位作用
符号 名称及定义
中断总允许位。低电平时,禁止一切中断;高电平时,每个中断源是EA 否允许由各自的允许位确定。
ES 串行口中断允许位。低电平禁止,高电平允许。
ET1 内部定时器1中断允许位。低电平禁止,高电平允许。 EX1 外部中断1允许位。低电平禁止,高电平允许。
ET0 内部定时器0中断允许位。低电平禁止,高电平允许。 EX0 外部中断0允许位。低电平禁止,高电平允许。
另外,每个中断向量都有其相应的中断入口地址,如下表所示:
表11. 中断入口地址
中断源 向量地址
外部中断0 0003H
定时器0 000BH
外部中断1 0013H
定时器1 001BH
串行口中断 002BH
6、堆栈指针SP
堆栈操作是在内存RAM区专门开辟出来的按照‘先进后出’原则进行数据存取的一种工作方式,主要用于子程序调用及返回和中断处理断点的保护和返回,它在完成子程序嵌套和多重中断处理中是必不可少的。为保证逐级正确返回,进入栈区的‘断点’数据应遵循‘先进后出’的原则。SP用来指示堆栈所处的位置,在进入操作之前,先用之令给SP赋值,以规定栈区在RAM区的起始地址。当数据进入栈区后,SP的值也自动随之变化。89C51系统复位后,SP初始化为07H。 2.9 CD4094芯片简介
CD4094是带输出锁存和三态控制的串入,并出高速转换器,具有使用简单、功耗低、驱动能力强和控制灵活等优点。
CD4094的引脚定义如图2-15。其中{1}脚为锁存端,{2}脚为串行数据输入端,{3}脚为串行时钟端。{1}脚为高电平时,8位并行输出口Q1,Q8在时钟的上升沿随串行输入而变化;{1}脚为低电平时,输出锁定。利用锁存端可方便地进行片选和级联输出控制。{15}脚为并行输出状态控制端,{15}脚为低电平时,并行输出端处在高阻状态,在用CD4094作显示输出时,可使显示数码闪烁。{9}脚QS、{10}脚Q′S是串行数据输出端,用于级联。QS端在第9个串行时钟的上升沿开始输出,Q′S端在第9个串行时钟的下降沿开始输出。
当CD4094电源为5V时,输出电流大于3.2,A,灌电流为1,A。串行时钟频率可达2.5MH,。
1、CD4094 是8 位移位存贮总线寄存器其功能表如下
表2-2 CD4094功能表
CLK OE STR D 并行输出 串行输出
Q1 Qn QS’ QS
? L * * 三态 三态 Q7 不变
? L * * 三态 三态 不变 Q7
? H L * 不变 不变 Q7 不变
? H H L L Qn-1 Q7 不变
? H H H H Qn-1 Q7 不变
? H H H 不变 不变 不变 Q7 * 在时钟脉冲正沿移位寄存器第7 级的内容传送到Q8 和QS
2、CD4094 管脚图
图2-15 CD4094 管脚图
第三章 多用方波信号发生器设计
信号发生器是科研及工程实践中最重要的仪器之一,以往多用硬件组成,系统结构比较复杂,可维护性和可操作性不佳.随着计算机技术的发展,信号发生器的设计制作越来越多的是用计算机技术,种类繁多,价格,性能差异很大. 3.1 多种方波信号发生器的比较
3.1.1 一般的方波发生器
一般的方波发生器只有频率和幅度是可调的,而占空比则不可调。其频率和幅度的改变都是通过旋转螺钮来实现的。用螺钮来实现频率可调的弊端就在于,这样做不仅保证不了方波频率的精确性,而且人工旋转螺钮到一定频率本身就是比较困难的事。所以,随着实验本身的重要性和其精度要求的不断提高,一般的方波发生器注定将被淘汰,而对其改进的方波发生器也将应运而生。 3.1.2 多功能方波发生器
多功能方波发生器就是在对一般方波发生器进行改进的基础上设计的。在此
设计中,方波的频率,占空比和幅度都是可调的,频率的变化范围为10HZ到10KHZ,幅度的变化范围为。其中,频率和占空比都是随着键盘输入值的改变而改变的,也就是说,你只需在键盘上输入你所期望的方波频率和占空比,通过一定的程序后,在单片机的输出端就可以得到满足要求的方波,其频率值也可在数码管上显示出来。这样的话就可以使我们的实验操作更加简单,输出方波的参数也更加精确。方波幅度的调节也是通过旋转螺钮来实现的,这是因为在一般的实验中,对方波幅度的要求不太高,而且方波幅度对实验结果影响不大,所以这部分没有作太大的改变,希望大家谅解。
3.2 设计性能与应用前景
3.2.1 本设计的性能
本设计的多用方波信号发生器具有的基本性能如下:
?可以产生正弦波,方波,三角波,锯齿波等几种周期性信号;
?可以用键盘编辑生成正弦波,方波,三角波这三种信号的线性组合. ?增加外部存储器后可以方便的是现信号存储功能,即有记忆功能系统可以实现的功能;
?信号存储功能可存储掉电前用户编辑的信号和设置;
?可实现用键盘编辑产生任意信号.
3.2.2 本设计的应用前景
当然,本设计的方波发生器的功能跟现在市场上的比起来并不是最多的。市场上的方波发生器大多数不仅能产生方波,还可以产生正弦波,三角波,锯齿波等波形。但这并不意味着本设计没用此项功能。本设计只是针对方波这一部分设计的,如果想得到其他波形,只需要对得到的方波再进行处理即可。例如:。要想得到三角波,只需要在方波发生器后面再连接一个积分电路即可。
所以,本设计的应用前景相当广泛。另外,本设计除了可以用作实验仪器外,还可以用在其它多种工作场合。
3.3 信号发生的原理
3.1.1 系统框图
系统结构框图如图3-1。
图3-1 系统框图
3.1.2 信号发生电路原理
信号发生电路原理框图如图3-2所示.该信号发生器采用MCS-51芯片作为系
配以少量的外围接口芯片,构成单片机的最小控制系统.5V电源经二极统的CPU,
管降压后得到3.6V电压用作单片机电源.人机对话部分用A口组成键盘及数码管
图中略去未画);信号输出部分用MCS-51提供的2个10位的数模转换器,显示(
即DAC1和DAC2,以及外部运放电路组成.
图3-2 信号发生电路原理图
?多功能信号发生器可产生正弦波,方波,三角波和由用户编辑的特定信号.信号的发生方法有两种:一是采用硬件,二是采用软件.如果采用硬件方法.可以使频率范围做得很大,然而为了配合智能化设置,其幅度,频率的调整,仍然要利
用软件驱动I/O口进行切换,对于信号发生器来说,输出的信号种类较多,采用硬件的方法会使硬件电路相当复杂,并且调试也很困难.故障率也会大大增加.本设计中采用软,硬件相结合方法,可节约大量的硬件电路,信号的种类,频率完全由软件通过D/A变换来产生,幅度调整由可以用数字量控制的硬件电路实现.在高频端采用软件压缩的方法,可以得到较好的效果.
信号生成过程如下:
将生成信号的数据写入DAT1后,数字量转换为模拟量经DAT1引线端输出,输出电流加在电阻R9上形成信号电压,信号电压经运放U2A组成的跟随器输入数字电位器DP1(MAX5400)[2]的高端,数字电位器DP1将分压后信号输入由运放U2C组成的跟随器后输入由运放U2D组成的运算放大器放大后输出.由于单片机的DAC只能输出电流,在电阻R9上形成的信号电压始终?0,要输出正反相信号需调整信号信号的电平,为此,利用DAC2输出电流加在电阻R8上形成偏置电压,经由运放U2A组成的反相器形成负偏置电压(Vr)后,加在输出放大器U2D输入端,达到调整输出信号电平的目的.
图3-3 电平调整原理
?输出信号幅度的调节方式:在0~5V的(峰~峰值)范围,要实现步进0.1V,如果完全使用软件实现,失真会非常严重.因为10位输出按0.1V步进,则峰~峰值最小为0.1V;又因为D/A数字最大为1023,输出对应5V,则0.1对应数字20,在这个很小的范围内,输出各种信号失真会很大.为了减小失真度,将信号峰~峰值固定对应数字1023,而其中参考电压由DAC2提供,以实现步进幅度为0.1V要求的硬件原理.低电压输出时信号时,这里使用数字电位器DP1的是调整输出信号的信号,数字电位器DP1产生的偏差通过输入DAC1的数字量进行修正,为此需要检测输出信号与期望值的偏差,所以系统中将数字电位器分压信号反馈给SPCE061A的模数转换通道(IOA0),借以检测输出信号是否达到规定要求.实验测量信号电
信号电平调整原理如图3-3所示.图3-3(a)为数字电压可实现0.02V幅度步进.
位器分压信号,图3-3(b) DAC2提供的由反相器U2A形成的负偏置电压(Vr),图3-3(c)为输出放大器U2D放大后的输出信号.系统中运放采用一片TI公司的4运放芯片TLC2254[3],该芯片为rail-to-rail型低功耗运放,可以提供-5V~+5V摆幅输出。
为使输出信号得到进一步改善,在输出端再加1级RC低通滤波器,以实现输出信号的平滑.
3.2.2 信号分析与计算
(1)正弦波信号计算
由于信号都是周期性的,所以只要设计出一个完整周期的正弦波。在信号输出部分,采用了10位的D/A变换器,其最大输出值为1023。为了与D/A变换器相适应,在2π一个周期内,将其输出信号的幅值,角频率量化,如图3(a)所示,将正弦波向上平移,使其最低点为0,而且对于奇函数,其傅里叶级数只能用正弦项表示,即有
f(k)=512sinkω0 (0?k?512)
y(k)=512+f(k)
式中ω0=2π/1024.由此可以求出1024个离散值,形成数据表,以备计算驱动程序调用。
图3-4 三角波信号形成原理
(3)三角波的计算
三角波信号形成原理如图3-4所示,按DAC满幅输出计算三角波的上升沿和下降沿的N个DAC输出的小阶梯,由于阶梯很小从宏观上看它可以近似成三角波波信号,如图4中实线所画的波形。阶梯之间的时间间隔t1,t2由定时器TimerA 的定时值决定通过改变t1和t2的值来改变三角波信号上升沿和下降沿的时间T1,T2从而改变三角波信号的频率。
(4)方波信号的计算
方波计算比较简单,只需根据给出高电平时间t1和低电平t2时间,分别用定时器计时即可实现。
以上计算所的数据(10位有效数据)在写入DAC寄存器时,要写入DAC数据寄
存器的高10位。因为,SPCE06lA的DAC数据寄存器中只有高10为有效,低6位无意义。
3.2 控制电路设计
3.3.1 时钟复位电路设计
采用单片机片内的振荡器、上电复位和外部硬件看门狗电路。看门狗采用MAXIM公司的MAX706芯片,硬件电路如图3-5。 MAX706可以提供至少200ms宽度的复位脉冲,为使看门狗溢出有效必须把MAX706的WDO和MR连接起来,看门狗输入WDI连接4051的任何一个I/O端口都可。MAX706在程序运行期间监控整个系统的运行,喂狗程序必须在1.6秒之内使WDI引脚电平发生改变,否则MAX706将发出复位指令,使整个系统复位,看门狗时序如图3-6所示。
图3-5 复位电路
图3-6 看门狗时序图
3.3.2 单片机与D/A的接口电路设计
D/A选用AD公司的AD7226。AD7226是具有8位精度的四通道D/A转换器,最小分辨电压约为4mV,可以满足设计的精度要求。每个通道都有一个输入锁存器,可以对输入的数字量进行锁存;输出端带有输出缓冲放大器。AD7226有一条写入控制线WR,两条地址线A0、A1,通过地址线可以选择不同的D/A转换通
道。写入时序如图3-7所示。
图3-7 AD7226写入时序
由于4051没有专门的地址和读写控制引脚,此处可以通过普通的I/O引脚参考AD7226的写入时序,利用软件进行时序模拟。可以通过改变延时的时间来改变输出的频率。图3-8是利用4051的P3.0、P3.1口作为A0、A1的地址线,P3.5作为WR的写入控制线的硬件参考电路,相应的示例程序如下:
??..
MOV P1, A ;P1口置数
MOV P3, #0FCH ;选择通道A
CLR P3.5 ;置P3.5 低电平
SETB P3.5 ;置P3.5 高电平,上升沿锁存数据
LCALL DELAY ;调用延时子程序
??..
图3-8 单片机与D/A接口电路
3.3.3 偏移电路设计
AD7226的每一个通道都可以单独用来提供单极性或双极性的输出,要获得双极性的输出必须外加运算放大器和偏移电阻,输出电压的范围取决于参考电压的大小,如图3-9是在单极性电源供电情况下的双极性输出电路图,要注意偏移电阻的阻值匹配。
图3-9 AD7226双极性输出电路
3.3.4 放大电路设计
放大电路主要是对AD7226输出的双极性电压信号幅值进行处理,以达到使用的要求。放大电路的输入极增加一个一阶低通滤波器,以防止D/A输出的高频成分干扰;采用低频运放作为射随器以提高输入阻抗。放大电路部分如图3-10所示。
图 3-10 放大电路(部分)
3.5 软件程序
3.5.1 系统主要程序流程框图
主程序流程如图3-11所示。
初始化
显示设置数正弦波
据
选择输出 三角波
方 波 计算
输出 其 它
扫描键盘
N Y
有键按下
图3-11 主程序流程图
3.5.2 软件设计
本模块软件设计主要分三大块,首先,通过相应的计算程序,把键盘输入的频率数字为实际的频率,然后再把频率转化为计时器的初值,最后通过定时器产生方波。
先介绍算法程序。键盘输入的频率是五个毫无关系的数字,假设分别放在R5,R4,R3,R2,R1中,要想把它计算为实际的频率,应该有这样一个程序,R5乘10000,R4乘1000,依此类推,最后把所有的结果加起来,就是频率,频率暂时放在寄存器R2R3中。程序流程图如下:
-12 总计算程序流程图 图3
其中,R3*1000和R4*10000的具体程序流程图如下所示:
图3-13 R3*100程序流程图
图22. R4*10000程序流程图
程序清单如下所示:
ORG 0030H
MOV R0,#*
MOV R1,#*
MOV R2,#*
MOV R3,#*
MOV R4,#0
MOV R5.#0
MOV A,R1
MOV B,#10
MUL AB
CLR C
ADDC A,R0
MOV R5,A
MOV A,#0 ONE: CLR C
ADDC A,#100
JC JIA1 TWO: DJNZ R2,ONE
CLR C
ADDC A,R5
MOV R5,A
MOV A,R4
ADDC A,#0
MOV R4,A
MOV R6,#0
MOV R7,#0 THREE: CLR C
MOV A,R7
ADDC A,#E8H
MOV R7,A
MOV A,R6
ADDC A,#03H
MOV R6,A
DJNZ R4,THREE
CLR C
MOV A,R5
ADDC A,R7
MOV R5,A
MOV A,R4
ADDC A,R6
MOV R4,A
RET
JIA1: INC R4
LJMP TWO
RET
END
现在该第二步,通过频率计算定时器的初值。先把频率转化为周期,再通过输入的占空比计算出方波高电平的时间,最后再把周期和高电平时间分别转化为定时器0的计数初值。
把频率转化为周期比较简单,只需用1秒除以频率值即可。假设算得的周期为N,高电平时间为M。AT89C51的晶振一般为12MHZ,所以机器周期为1us。根据设计要求,16位定时器T0先后对方波高电平和低电平进行计时。所以,定时器T0的初值分别应为:(65535-M),(65565-N+M)。程序流程图如下:
图23. 定时器初值计算程序流程图
具体程序如下所示:
ORG 0000H
AJMP NDIV
ORG 0030H
NDIV: MOV R4,#0FH
MOV R5,#42H
MOV R6,#40H
MOV R2,#0FFH
MOV R3,#0FFH
MOV R0,#0
MOV R1,#0
NDIV1: CLR C
MOV A,R6
SUBB A,R3
MOV A,R5
SUBB A,R2
MOV A,R4
SUBB A,#0
JC NDIV2
CLR C
MOV A,R6
SUBB A,R3
MOV R6,A
MOV A,R5
SUBB A,R2
MOV R5,A
MOV A,R4
SUBB A,#0
MOV R4,A
CLR C
INC R1
JC NDIV3
NDIV4: LJMP NDIV1
NDIV2: CLR C
MOV R3,#0FFH
MOV R2,#0FFH
MOV A,R3
SUBB A,R1
MOV R1,A
MOV A,R2
SUBB A,R0
MOV R0,A
RET
NDIV3: INC R0
LJMP NDIV4
RET
END
第三步,是要通过定时器和中断的控制,实现方波的产生。89C51的内部定
时器在使用前应考虑7个特殊功能寄存器的应运:TMOD和TCON的初始化,T0 的
初值,以及使用中断时还要用到的SP,IE和IP。
根据前面的介绍,可以很轻松的设置这7个寄存器的初值。定时器0为16
位计数器,所以TMOD初值应为11H;TR0,TR1,ET0,ET1和EA都应该置1。程
序流程图如下:
图24. 产生方波程序流程图
具体程序如下所示:
ORG 0000H
AJMP START
ORG 000BH
AJMP T0INT
ORG 0030H
START: MOV SP,#60H
MOV TMOD,#01H
MOV TH0,#**H
MOV TL0,#**H
SETB TR0
SETB ET0
SETB EA
SETB P1.0
MAIN: AJMP MAIN
T0INT: MOV A,P1.0
ORL A,#00H
JB A,HIGH
LOW: CLR P1.0
MOV TH0,#**H
MOV TH1.#**H
RETI
HIGH: SETB P1.0
MOV TH0,#**H
MOV TH1,#**H
RETI
总结:
本论文主要介绍了多功能方波发生器的设计。在各个模块中,都对此模块中
所用到的芯片作了详细的介绍,并在此基础上,实现了功能的软件和硬件设计。
本设计综合了大学期间学过的好多课程的知识,故在设计的过程中,相当于系统
的复习了一遍大学课程,在此过程中。不仅加深了我对所学知识的理解,而且使
我更加明确了动手和实践的重要性。通过本设计的实现,相信会对以后的工作和学习带来很大的帮助,我也会更加努力的。
致 谢
本人在设计论文期间都是在温涛老师全面、具体指导下完成进行的。温老师渊博的学识、敏锐的思维、民主而严谨的作风使学生受益非浅,并终生难忘。
感谢我的学友和朋友对我的关心和帮助。
附录一:89C51单片机特性 特性
89C51 核心处理单元
4k 字节FLASH 89C51X2
8k 字节FLASH 89C52X2
16k 字节FLASH 89C54X2
32k 字节FLASH 89C58X2
128 字节RAM 89C51X2
256 字节RAM 89C52X2/54X2/58X2 布尔处理器
全静态操作
12 时钟操作可选6 个时钟通过软件或并行编程器
存储器寻址范围
64K 字节ROM 和64K 字节RAM 电源控制模式
―时钟可停止和恢复
―空闲模式
―掉电模式
两个工作频率范围
6 时钟模式时为0 到20MHz 12 时钟模式时为0 到33MHz LQFP, PLCC 或DIP 封装 扩展温度范围
双数据指针
3 个加密位
2
4 个中断优先级
6 个中断源
4 个8 位I/O 口
全双工增强型UART ―帧数据错误检测
―自动地址识别
3 个16 位定时/计数器T0 T1 标准80C51 和增加的T2 捕获和比较
可编程时钟输出
异步端口复位
低EMI (禁止ALE 以及6 时钟模式)
掉电模式可通过外部中断唤醒