《单片机原理与应用》频率占空比可调的方波发生器Word文件下载.docx
- 文档编号:22679346
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:290.39KB
《单片机原理与应用》频率占空比可调的方波发生器Word文件下载.docx
《《单片机原理与应用》频率占空比可调的方波发生器Word文件下载.docx》由会员分享,可在线阅读,更多相关《《单片机原理与应用》频率占空比可调的方波发生器Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,下图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
图5矩阵键盘
2.4液晶显示
液晶如图:
图6液晶
1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线
VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:
引脚
符号
功能说明
1
VSS
一般接地
2
VDD
接电源(+5V)
3
V0
液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4
RS
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5
R/W
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6
E
E(或EN)端为使能(enable)端,
写操作时,下降沿使能。
读操作时,E高电平有效
7
DB0
低4位三态、双向数据总线0位(最低位)
8
DB1
低4位三态、双向数据总线1位
9
DB2
低4位三态、双向数据总线2位
10
DB3
低4位三态、双向数据总线3位
11
DB4
高4位三态、双向数据总线4位
12
DB5
高4位三态、双向数据总线5位
13
DB6
高4位三态、双向数据总线6位
14
DB7
高4位三态、双向数据总线7位(最高位)(也是busyflag)
15
BLA
背光电源正极
16
BLK
背光电源负极
寄存器选择控制表
操作说明
写入指令寄存器(清除屏等)
读busyflag(DB7),以及读取位址计数器(DB0~DB6)值
写入数据寄存器(显示各字型等)
从数据寄存器读取数据
注:
关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.
busyflag(DB7):
在此位为1时,LCD忙,将无法再处理其他的指令要求。
3程序流程图
图7流程图
4源程序
#include<
reg51.h>
math.h>
#defineucharunsignedchar
#defineuintunsignedint
sbittest=P3^7;
sbitLCDEN=P2^2;
sbitLCDRS=P2^0;
sbitLCDRW=P2^1;
sbitWaveA=P3^0;
sbitWaveB=P3^1;
ucharFrequency,Key_Value,Flag,a[6];
uintdataPhase_Difference;
doubleControl_Phase=0.000001;
intdataCounter_T0,Number_T0,Counter_T1,Number_T1;
//**********************
voidInitial_System();
ucharScan_Keyboard();
uintGet_Number_T0(ucharFrequency);
uintGet_Number_T1(ucharFrequency);
voidIncrease_Frequency();
voidDecrease_Frequency();
voidIncrease_Phase_Difference(uintdataStep_Phase_Difference);
//voidDecrease_Phase_Difference(uintdataStep_Phase_Difference);
voidCalculate_Frequency_Phase(void);
voidDisplay_Frequency_Phase();
voidDelay(uint);
voidWrite_Cmd(ucharcmd);
voidWrite_Data(ucharData);
voidLCD_Init();
//**********************************
voidmain()
{
Initial_System();
while
(1)
{
Key_Value=Scan_Keyboard();
Calculate_Frequency_Phase();
Display_Frequency_Phase();
}
}
//************************
voidInitial_System()
WaveA=0;
WaveB=0;
Control_Phase=0.000001;
Frequency=10;
Phase_Difference=0;
Counter_T0=0;
Counter_T1=0;
Number_T1=Get_Number_T1(Frequency);
TMOD=0x22;
TH1=0x38;
//256-200
TL1=0x38;
TH0=0xc9;
//256-201
TL0=0xc9;
EA=1;
ET1=1;
TR0=1;
TR1=1;
LCD_Init();
}
//****************************
voidWrite_Cmd(ucharcmd)
LCDEN=1;
LCDRS=0;
P0=cmd;
Delay(5);
LCDEN=0;
//***************************
voidWrite_Data(ucharData)
LCDRS=1;
P0=Data;
voidLCD_Init()
LCDRW=0;
Write_Cmd(0x01);
Write_Cmd(0x38);
Write_Cmd(0x0C);
Write_Cmd(0x06);
Write_Cmd(0x80);
Write_Data('
F'
);
R'
E'
:
'
Write_Cmd(0x80+0x40);
P'
H'
A'
//*************************
ucharScan_Keyboard()
ucharkey;
uchartemp1,temp2;
P1=0x0f;
if(P1!
=0x0f)
temp1=P1;
P1=0xf0;
temp2=P1;
}
while(P1!
Delay(10);
key=temp1|temp2;
switch(key)
case0xee:
return0;
break;
case0xde:
return1;
case0xbe:
return2;
case0x7e:
return3;
default:
return16;
//*********************************
uintGet_Number_T0(ucharFrequency)
uinth;
doublel;
l=(double)Frequency;
l=Control_Phase*0.5/l;
l=l/0.000055;
h=l;
if(l-h>
+0.5)
h=h+1;
returnh;
uintGet_Number_T1(ucharFrequency)
doublef;
f=(double)Frequency;
f=0.5/f;
f=f/0.0002;
h=f;
if(f-h>
=0.5)
//********************************T0
voidTimer0_Interrupt()interrupt1
Counter_T0++;
if(Counter_T0>
Number_T0)
Counter_T0=0;
if(Flag==0)
WaveB=WaveA;
else
WaveB=~WaveA;
ET0=0;
TR0=0;
//********************************T1
voidTimer1_Interrupt()interrupt3
Counter_T1++;
if(Counter_T1>
Number_T1)
Counter_T1=0;
WaveA=~WaveA;
ET0=1;
TR0=1;
//********************************
voidIncrease_Frequency()
if(Frequency<
=256-10)
Frequency=Frequency+10;
else
Frequency=255;
voidDecrease_Frequency()
if(Frequency>
10)
Frequency=Frequency-10;
Frequency=1;
voidIncrease_Phase_Difference(uintdataStep_Phase_Difference)
Control_Phase=Control_Phase+0.00555556*Step_Phase_Difference;
if(Control_Phase>
=1)
{
Control_Phase=0.000001;
}
elseif(Control_Phase>
1)
Flag=1;
Control_Phase=Control_Phase-1;
Phase_Difference+=Step_Phase_Difference;
if(Phase_Difference>
=360)
voidCalculate_Frequency_Phase(void)
switch(Key_Value)
case0:
Increase_Frequency();
break;
case1:
Decrease_Frequency();
case2:
Increase_Phase_Difference(10);
case3:
Initial_System();
default:
Number_T0=Get_Number_T0(Frequency);
voidDisplay_Frequency_Phase()
uchari,j;
a[0]=Frequency/100;
a[1]=(Frequency%100)/10;
a[2]=Frequency%10;
a[3]=Phase_Difference/100;
a[4]=(Phase_Difference%100)/10;
a[5]=Phase_Difference%10;
Write_Cmd(0x80+5);
for(i=0;
i<
=2;
i++)
Write_Data(a[i]+48);
Write_Cmd(0x80+0x40+5);
for(j=3;
j<
=5;
j++)
Write_Data(a[j]+48);
test=0;
voidDelay(uinti)
uintj,k;
for(k=i;
k>
0;
k--)
for(j=110;
j>
j--);
5仿真结果分析
5.1系统初始化
系统默认频率为10HZ,相位差为0液晶显示,示波器测量如图:
图8系统初始图
5.2频率50HZ,相位差0
图9频率50HZ,相位差0
5.3频率50HZ,相位差50
图10频率50HZ,相位差50
5.4频率50HZ,相位差90
图11频率50HZ,相位差90
6心得体会
本次课程设计我的题目是《设计并实现两路相位可调方波信号发生器》。
实验要求输出两路方波信号,键盘控制频率和两信号的相位差,频率围和变化步长值自定,相位0~360,相位差变化步长值自定,用双踪示波器观察。
在学习微机原理和单片机以及智能仪器这些课程的时候我们就接触过很多可以产生方波的方法。
因此这次课程设计对于产生方波的方式有了多种选择。
既然是单片机课设,而且这次实验的最简单的方案就是利用单片机MSP430的P1口的两个引脚输出高低电平。
通过定时器A计数来实现PWM输出,通过port2端口的IO中断来实现按键控制相位变化和频率变化以及占空比变化等,通过液晶1602来实现系统相关信息的显示。
这个方案是无所质疑的,但是由于我对于汇编程序的编写掌握的不是很好,因此对于写程序是遇到了很大的困难。
最终我选择了用C430语言来完成此次课程设计。
在编程中也遇到了很多困难,首先可以输出两路方波信号并且在示波器上显示,但是无法改变相位和频率。
后来改变程序之后可以改变频率但是在改变相位的时候频率也变化了,也就是没有实现频率和相位独立变化的要求。
后来在同学的帮助下,多次修改程序,最终完成了本次课程设计。
由于此题硬件设计相对来说比较简单,首先是一个430的最小系统,包括始终部分和JTAG下载部分以及复位部分。
然后就是液晶1602,按照1602的datasheet所指示的去连接就可以了,还有就是独立按键键盘,通过上拉电阻上拉,连接到P2的相应口上,另一端接地就可以了。
此次单片微型计算机原理与接口技术课程设计收获很多,通过这次的课设,我进一步了解430单片机定时器A的应用以及其port2端口的IO中断的应用。
同时我对于有关单片机最小系统的搭建,硬件平台的实现也有了一定的了解。
此次设计中还对于IAR软件有了更进一步的了解,对以后的嵌入式学习打下了良好的基础。
7参考文献
1、燕南,薛钧义.微型计算机原理与接口技术.:
高等教育.2004
2、群芳,士军,黄建.单片微型计算机与接口技术(第2版).:
电子工业.2005
3、徐维祥,旭敏.单片微型计算机原理及应用.:
理工大学.2006
4、鑫,华臻,书谦.单片机原理及应用.:
电子工业.2008
5、汪道辉.单片机系统设计与实践.:
电子工业.2006
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机原理与应用 单片机 原理 应用 频率 可调 方波 发生器