虚拟信号发生器设计.docx
- 文档编号:1578936
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:23
- 大小:456.13KB
虚拟信号发生器设计.docx
《虚拟信号发生器设计.docx》由会员分享,可在线阅读,更多相关《虚拟信号发生器设计.docx(23页珍藏版)》请在冰点文库上搜索。
虚拟信号发生器设计
第1章摘要………………………………………………3
第2章系统总体设计方案……………………………4
第3章单片机系统各模块原理………………….7
3.1发光二极管…………………………………………….7
3.216*16点阵……………………………………………8
3.3数码管…………………………………………………7
3.4蜂鸣器…………………………………………………11
3.5串口通信………………………………………………12
第5章系统整体调试结果及说明……………………14
第6章课设心得及总结………………………………15
参考文献…………………………………………………15
录附………………………………………………………16
第一章摘要
随着电子技术的飞快发展,单片机也应用得越来越广泛,基于单片机的智能仪器的设计技术不断成熟。
单片机构成的仪器具有高可靠性,高性价比等特点。
单片机技术在智能仪表和自动化等诸多领域有了极为广泛的应用,并用到各种家庭电器,单片机技术的广泛应用推动了社会的进步。
利用单片机采用程序设计方法来产生波形,线路相对简单,结构紧凑,价格低廉,频率稳定度高,抗干扰能力强等优点,而且还能对波形进行细微的调整,改良波形,易于程序控制。
只要对电路稍加修改,调整程序,就能实现功能的升级。
随着电子技术、计算技术和网络技术的高速发展,传统的电子测量仪器的功能和作用已发生了质的变化,新型的虚拟仪器应运而生。
本次课程设计主要设计一个基于80C51单片机的虚拟信号发生器,采用Matlab软件编程,用于输出所需要的方波、正弦波、三角波、锯齿波、冲击串波、抽样波等多种信号,有效地实现信号发生器的基本功能。
由上位机通过串行口传送数据,并在LED上显示相应的参数,通过两个GUI界面的控制按钮来实现参数的调节功能。
应用伟福6000软件和MATLAB软件编写程序并实现单片机系统的仿真。
关键词:
80C51单片机串口通讯虚拟信号发生器
基本射线图
第二章系统总体设计方案
本次课程设计是由数字信号和单片机相结合,用MATLAB软件的GUI工具箱来设计一个人机交换界面,单片机编程将数码管、发光二极管、16*16点阵、蜂鸣器各模块连接起来与电脑进行串行通信,再由MATLAB编程发出设计出的五个信号,通过对幅值、频率、相位、采样频率等参数的变化,改变信号的波形,当数据传输过来时,蜂鸣器响铃,16*16点阵表示出传输的参数名,同时发光二极管和数码管表示参数的数值。
本次课程设计主题分为俩部分,一是硬件部分,由计算机和实验箱构成,设计电气原理连接图,将蜂鸣器,数码管,点阵,发光二极管等合理连接。
另一部分为软件部分,利用MATLAB编程,搭出GUI界面,确定可变的参数,设计出五种参数可调的信号,再者利用C语言编程,完成对发光二极管,蜂鸣器,数码管,16*16点阵的功能实现,并用串行通信与计算机相连,进行数据传输。
图2.1单片机控制结构示意图
图2.2基于matlab信号发生器控制流程图
图2.3GUI界面示意图
第三章单片机模块基本原理
3.1发光二极管
图3.1.1LED原理图
图3.1.2LED程序流程图
本实验74LS245的片选地址为CSO,即8000H,读这个地址,就是从74LS245读回开关的值。
可以用单步的方式执行程序,改变开关状态,观察读回的值。
实验仪上装有8只发光二极管及相应驱动电路。
L0-L7为相应发光二极管驱动信号输入端,该输入端为高电压电平“1”时发光二极管点亮。
我们可以通过P0口对其直接进行控制,点亮或者熄灭发光二极管。
3.216*16点阵
图3.2.1点阵原理图
图3.2.2点阵程序流程图
16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。
每个行与每个列可以选中一个发光管,共有256个发光管,采用动态驱动方式。
每次显示一行,10ms后再显示下一行。
3.3数码管
图3.3.1数码管原理图
图3.3.2数码管程序流程图
显示共有6位,用动态方式显示。
8位段码、6位位码是由两片
74LS374输出。
位码经MC1413或ULN2003倒相驱动后,选择相应显示位。
本实验仪中8位段码输出地址为0X004H,位码输出地址为0X002H。
此处X是由KEY/LEDCS决定,参见地址译码。
做键盘和LED实验时,需将KEY/LEDCS接到相应的地址译码上。
以便用相应的地址来访问。
例如,将KEY/LEDCS接到CS0上,则段码地址为08004H,位码地址为08002H。
3.4蜂鸣器
、
图3.4.1蜂鸣器原理图
图3.4.1蜂鸣器程序流程图
本实验采用的继电器其控制电压是5V,控制端为高电平时,继电器工作常开触点吸合,连触点的LED灯被点亮。
当控制端为低电平时,继电器不工作。
执行时,对应的LED将随继电器的开关而亮灭。
3.5串口通信
、
图3.5.1串口原理图
图3.5.2串口程序流程图
用串并转换方法扩展I/O口。
串行口工作在方式0时,可通过外接移位寄存器实现串并行转换。
在这种方式下,数据为8位,只能从RXD端输入输出,TXD端总是输出移位同步时钟信号,其波特率固定为晶振频率Fosc/12。
对于80C196CPU波特率为Fosc/2(B+1),Fosc为晶振频率,B为波特率常数。
由软件置位串行控制寄存器的允许接收位(REN)后,才启动串行接收。
待8位数据收完后,硬件将状态寄存器的RI位置1,RI必须由软件清零。
用串行口工作方式0读入数据,是自动移位完成的,用P1端口串行读入数据时,要编程输出时钟信号,移位读入数据。
对于80C196用串口发数据时要将IOC1.5置1,选择P2.0脚为TXD功能。
同时注意用P1口输出位信号时,需要用到‘与’‘或’运算得到相应位。
第四章系统整体调试结果及说明
利用Matlab设计虚拟信号发生器。
在PC机显示不同信号波形的同时,利用串行口控制单片机系统的LED显示相应波形参数:
幅度、频率、相位和采样频率。
图4.1
第五章课设心得及总结
通过本次课程设计,我对单片机的一些内部结构和功能有了更深层次的了解。
懂得了如何去设计硬件电路,如何编程,如何将信号处理与单片机结合起来综合应用,把知识运用到设计和创新,它不仅仅是让我们把理论知识与实践相结合起来,提高自己的实际动手能力和独立思考能力,更重要是的是同学间的团结合作,个人的能力是有限的,团结才能有力量,我们都尽自己所能来完成这次课程设计。
这是对我们所学的课本知识的测验,也是对是否能快速吸收新的知识的一种考验,在自己亲自操作的时候,才能体验到它具有的挑战性,才能达到我们想要的结果。
所以,在以后的学习和其它课程设计的时候,我们一定要细心的检查并发现、解决问题。
在课设过程中遇到了很多不懂的地方,要是没有学长耐心的指导我不能完全理解这些程序,也不能做的这么快。
这里真心的谢谢老师给予我们的帮助。
同时感谢同伴的帮助。
从查资料,设计编程,模拟仿真,再把与这次课程设计有关的资料汇总在WORD中,直至打印出来,到我们满意。
我感到收获巨大。
参考文献
1)《微型计算机控制系统》赖寿宏,机械工业出版社(教材)
2)《单片机及应用》李大友,高等教育出版社(教材)
附录:
#include
#defineLEDLen6
#defineucharunsignedchar
#defineuintunsignedint
xdataunsignedcharRowLow_at_0xb002;//行低八位地址
xdataunsignedcharRowHigh_at_0xb003;//行高八位地址
xdataunsignedcharColLow_at_0xb000;//列低八位地址
xdataunsignedcharColHigh_at_0xb001;//列高八位地址
xdataunsignedcharOUTBIT_at_0x8002;//位控制口
xdataunsignedcharOUTSEG_at_0x8004;//段控制口
xdataunsignedcharIN_at_0x8001;//键盘读入口
xdataunsignedcharCS273_at_0x9000;
sbitSpeaker=P1^0;
ucharj,a;
uints=0;
ucharLEDBuf[LEDLen];//显示缓冲
ucharRcvBuf;//接收缓冲
bitHasRcv=0;//接收标志
codeucharLEDMAP[]={//八段管显示码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
codeucharFont[][32]={
//幅
0x00,0x20,0x02,0x22,0xFE,0x23,0x22,0x22,0x22,0xBA,0xFE,0xAB,0x22,0xAA,0xFE,0xAB,
0x00,0xA8,0xFC,0xA9,0x04,0xA9,0x04,0xA9,0xFC,0xF9,0x00,0x20,0xFE,0x23,0x00,0x20,
//值
0x00,0x20,0xFE,0x2F,0x08,0x22,0x08,0x22,0xF8,0x23,0x08,0x22,0xF8,0x23,0x08,0x22,
0xF8,0xA3,0x08,0x62,0xF8,0x33,0x80,0x20,0x40,0x10,0xFC,0x17,0x60,0x18,0x40,0x10,
//频
0x00,0x00,0x02,0xC3,0x86,0x20,0x48,0x10,0x50,0x08,0xA4,0x84,0xA4,0x4A,0xA4,0x4A,
0xA4,0x08,0xA4,0x00,0x84,0xFE,0xFC,0x48,0x40,0x48,0x20,0x4E,0xFE,0x08,0x00,0x08,
//率
0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xFE,0xFF,0x20,0x01,0xC4,0x47,0x48,0x22,
0x10,0x11,0x80,0x04,0xD0,0x17,0x28,0x22,0x00,0x41,0xFE,0x7F,0x00,0x01,0x00,0x02,
//相
0x84,0x10,0xFC,0x10,0x84,0x10,0x84,0x10,0x84,0x10,0x84,0x90,0xFC,0x50,0x84,0x52,
0x84,0x32,0x84,0x34,0xFC,0x18,0x84,0xFE,0x84,0x10,0x84,0x10,0xFC,0x10,0x00,0x10,
//位
0x00,0x00,0x00,0x10,0xFE,0x1F,0x40,0x10,0x20,0x10,0x20,0x11,0x20,0x11,0x10,0x91,
0x10,0x52,0x18,0x52,0x10,0x34,0x00,0x20,0xFC,0x17,0x40,0x10,0xC0,0x0C,0x00,0x09,
//采
0x00,0x01,0x00,0x01,0x04,0xC1,0x0E,0x31,0x18,0x09,0x20,0x05,0x40,0x03,0x80,0x01,
0xFE,0x7F,0x00,0x01,0xA0,0x08,0x10,0x11,0x10,0x00,0x00,0x7E,0xF8,0x01,0x00,0x00,
//样
0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0xFE,0x13,0x20,0x90,0x20,0x50,
0x20,0x54,0xFC,0x39,0x20,0x30,0x20,0x10,0xFE,0xFD,0x90,0x10,0x88,0x10,0x08,0x11,
//频
0x00,0x00,0x02,0xC3,0x86,0x20,0x48,0x10,0x50,0x08,0xA4,0x84,0xA4,0x4A,0xA4,0x4A,
0xA4,0x08,0xA4,0x00,0x84,0xFE,0xFC,0x48,0x40,0x48,0x20,0x4E,0xFE,0x08,0x00,0x08,
//率
0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0xFE,0xFF,0x20,0x01,0xC4,0x47,0x48,0x22,
0x10,0x11,0x80,0x04,0xD0,0x17,0x28,0x22,0x00,0x41,0xFE,0x7F,0x00,0x01,0x00,0x02,
};
voidDelay(uchart)
{
uchari;
while(t--!
=0)
for(i=100;i!
=0;i--);
}
voiddisply1()//16x16点阵显示
{
uchari;
ucharcount;
uintbitmask;
//uintnum;
//清屏
ColLow=0xff;//行驱动低有效
ColHigh=0xff;
RowLow=0x00;//列驱动高有效
RowHigh=0x00;
if(s<2)
{for(j=0;j<2;j++)
{
for(count=0;count<50;count++)
{
bitmask=0x01;
for(i=0;i<16;i++)
{
RowLow=0x00;//首先清屏
RowHigh=0x00;
ColLow=~Font[j][i*2];//写出一行数据
ColHigh=~Font[j][i*2+1];
RowLow=bitmask&0xff;//点亮此行
RowHigh=bitmask>>8;
bitmask<<=1;//移位,指向下一行
Delay
(1);
}
}
ColLow=0xff;
ColHigh=0xff;
}
}
if((s>=2)&&(s<3))
{
for(j=2;j<4;j++)
{
for(count=0;count<50;count++)
{
bitmask=0x01;
for(i=0;i<16;i++)
{
RowLow=0x00;//首先清屏
RowHigh=0x00;
ColLow=~Font[j][i*2];//写出一行数据
ColHigh=~Font[j][i*2+1];
RowLow=bitmask&0xff;//点亮此行
RowHigh=bitmask>>8;
bitmask<<=1;//移位,指向下一行
Delay
(1);
}
}
ColLow=0xff;
ColHigh=0xff;
}
}
if((s>=3)&&(s<4))
{
for(j=4;j<6;j++)
{
for(count=0;count<50;count++)
{
bitmask=0x01;
for(i=0;i<16;i++)
{
RowLow=0x00;//首先清屏
RowHigh=0x00;
ColLow=~Font[j][i*2];//写出一行数据
ColHigh=~Font[j][i*2+1];
RowLow=bitmask&0xff;//点亮此行
RowHigh=bitmask>>8;
bitmask<<=1;//移位,指向下一行
Delay
(1);
}
}
ColLow=0xff;
ColHigh=0xff;
}
}
if((s>=4)&&(s<5))
{for(j=6;j<10;j++)
{
for(count=0;count<50;count++)
{
bitmask=0x01;
for(i=0;i<16;i++)
{
RowLow=0x00;//首先清屏
RowHigh=0x00;
ColLow=~Font[j][i*2];//写出一行数据
ColHigh=~Font[j][i*2+1];
RowLow=bitmask&0xff;//点亮此行
RowHigh=bitmask>>8;
bitmask<<=1;//移位,指向下一行
Delay
(1);
}
}
ColLow=0xff;
ColHigh=0xff;
}
}
}
voidSerialIO0()interrupt4
{
if(RI)
{
RI=0;
RcvBuf=SBUF;
HasRcv=1;
//Speaker=0;
Delay(100);
s++;
if(s>=5)
{
s=0;
}
}
else
{
TI=0;
}
}
voidDisplayLED()
{
uchari;
ucharPos;
ucharLED;
Pos=0x20;//从左边开始显示
for(i=0;i { OUTBIT=0;//关所有八段管 LED=LEDBuf[i]; OUTSEG=LED; OUTBIT=Pos;//显示一位八段管 Delay (1); Pos>>=1;//显示下一位 } } codeucharKeyTable[]={//键码定义 0x16,0x15,0x14,0xff, 0x13,0x12,0x11,0x10, 0x0d,0x0c,0x0b,0x0a, 0x0e,0x03,0x06,0x09, 0x0f,0x02,0x05,0x08, 0x00,0x01,0x04,0x07 }; unsignedcharTestKey() { OUTBIT=0;//输出线置为0 return(~IN&0x0f);//读入键状态(高四位不用) } /*unsignedcharGetKey() { ucharPos; uchari; //unsignedcharj; uchark; i=6; Pos=0x20;//找出键所在列 do{ OUTBIT=~Pos; Pos>>=1; k=~IN&0x0f; }while((--i! =0)&&(k==0)); //键值=列X4+行 if(k! =0){ i*=4; if(k&2) i+=1; elseif(k&4) i+=2; elseif(k&8) i+=3; OUTBIT=0; doDelay(10); while(TestKey()); //等键释放 return(KeyTable[i]);//取出键码 }elsereturn(0xff); }*/ voidmain() { CS273=0; IE=0x00;//DISABLEALLINTERRUPT TMOD=0x20;//定时器1工作于方式2(8位重装) TH1=0xF9;//2400BPS@12MHz TL1=0xF9; PCON&=0x7F;//SMOD位清零 SCON=0x50;//串行口工作方式设置 LEDBuf[0]=0xff; LEDBuf[1]=0xff; LEDBuf[2]=0xff; LEDBuf[3]=0xff; LEDBuf[4]=0xf0; LEDBuf[5]=0x00; TR1=1; ES=1; EA=1; HasRcv=0; while (1) { if(HasRcv) { Speaker=0; CS273=SBUF; disply1(); LEDBuf[5]=LEDMAP[RcvBuf&0x0f]; //a=RcvBuf&0xf0; //a>>=4; //LEDBuf[4]=LEDMAP[RcvBuf&0xf0]; Speaker=1; CS273=0; } DisplayLED(); /*if(TestKey()) { SBUF=GetKey(); }*/ } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 虚拟 信号发生器 设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)