单片机课程设计报告信号发生器Word文件下载.docx
《单片机课程设计报告信号发生器Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告信号发生器Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
设计报告:
一、工作原理
数字信号可以通过数/模转换器转换成模拟信号,因此可通过产生数字信号再转换成模拟信号的方法来获得所需要的波形。
8051f410单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:
中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将8051f410再配置键盘及、及波形输出、放大电路等部分,即可构成所需的波形发生器。
经过考虑,我们确定方案如下:
利用F410单片机采用程序设计方法产生锯齿波、三角波、正弦波、方波四种波形,再通过D/A转换器将数字信号转换成模拟信号,滤波放大,最终由示波器显示出来,通过键盘来控制四种波形的类型选择、频率变化,最终输出显示其各自的类型以及数值。
1.1、设计要求
1)、利用单片机采用软件设计方法产生四种波形
2)、四种波形可通过键盘选择
3)、波形频率可调
4)、需显示波形的种类及其频率
二、主程序思路
主程序先是进行一些初始化的工作,然后根据波形标志代码的值,使其形成多个数组,每个数组都是一个波形代码。
这样写的好处是输出的波形频率也可以有定时常数决定,找到定时常数和输出频率的关系。
在按键设置波形转换状态的循环中,波形的转换状态在按键上可以一一看出,把四种波形设置成0、1、2、3、在数码管的最高位设置成循环显示,然后把每个波形的代码值通过单片机自带的AD转换赋给输出的数据口,确定每个数组然后确定数组的列是否为数组中最后行的一个元素,若是则运行下一行的元素(另一个波形),并通过端口输出P0.0。
同时还要有按键控制频率,因为找到输出频率和定时常数的关系,所以频率的调节,可以有一个按键控制频率的个位、十位、百位、千位,再通过另一按键分别可以在频率的个位、十位、百位、千位进行加一功能,则实现了频率的要求调节,然后再把频率通过数码管的低四位一一显示出来,即构成四位的频率。
主程序流程图
三、软件流程程序:
本程序中两个外部中断分别起到了控制波形和频率的作用。
在程序中还加入了消抖部分。
软件流程图
4、电路板图:
6、程序六
7、#include<
C8051F410.h>
sbitCH452_SCL=P1^3;
sbitCH452_SDA=P1^4;
sbitCH452_KEY=P1^5;
unsignedcharsecond0,second1,minute0,minute1,f,j;
//四个参数
unsignedchartc,sta=0x08,stb=0x01;
//软件延时单元,状态标志
codeunsignedchards=0x14;
//软件延时系数__20
bitflag1=0;
unsignedchark,dispbuff[]={0,0,0,0,0,0,0,0};
//显示缓冲,初始显示全0
unsignedintCMD,DAT,DAT1;
unsignedcharbuffer[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
codeunsignedcharfont[32]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,//01234567
0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,//89ABCDEF
0xFD,0x61,0xDB,0xF3,0x67,0xB7,0xBF,0xE1,//0.1.2.3.4.5.6.7.
0xFF,0xF7,0x00,0x62,0x02,0x12,0x7C,0x1C};
//8.9.灭+—=UL
codeunsignedcharkey[16]={0xC6,0xB6,0x86,0xD6,0x96,0xA6,0xF6,0xE6,
0xC4,0xB4,0x84,0xD4,0x94,0xA4,0xF4,0xE4};
//键盘位置码
codeunsignedinttable1[4][32]={
4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,256,512,768,1024,1280,1536,1792,2048,2304,2560,2816,3072,3328,3584,3840,4095,3840,3584,3328,3072,2816,2560,2304,2048,1792,1536,1280,1024,768,512,256,
2048,2447,2831,3185,3496,3750,3940,4056,4095,4057,3941,3752,3498,3188,2834,2451,2051,1652,1268,913,603,348,158,40,0,38,154,342,596,905,1259,1642,
0,132,264,396,528,660,792,924,1056,1188,1320,1452,1584,1716,1848,1980,2112,2244,2376,2508,2640,2772,2904,3036,3168,3300,3432,3564,3696,3828,3960,4092};
//二维数组(方波,锯齿波,正弦波,三角波)
/*mS延时*/
voiddelayms(unsignedinti)
{unsignedintj;
do{for(j=0;
j!
=1000;
j++)
{;
}
}while(--i);
/////////////////////////////////////////////////////////////////////////////////////
/*uS延时*/
voiddelayus(void)
{unsignedintk;
for(k=0;
k<
8;
k++)
{;
}
unsignedcharrdch452(void)
{
unsignedcharj,key;
CH452_SDA=0;
delayus();
CH452_SCL=0;
CH452_SCL=1;
key=0x9F;
for(j=0;
j<
{
if(key>
=0x80)
CH452_SDA=1;
else
CH452_SDA=0;
CH452_SCL=1;
delayus();
CH452_SCL=0;
key=key<
<
1;
};
key=0;
{
if(CH452_SDA==1)
key++;
1;
}
CH452_SDA=1;
returnkey;
/////////////////////////////////////////////////////////////////////////////////////////////////////
/*命令、数据送CH452*/
voidtoch452(unsignedintcmda)
unsignedcharj;
16;
if(cmda>
=0x8000)
cmda=cmda<
/*读键盘*/
////////////////////////////////////////////////////////////////////////////////////
voiddisplay(void)
unsignedchari;
DAT1=0xA100;
//8个数码管逐一送显示
for(i=0;
i<
i++)
{
DAT=DAT1+font[dispbuff[i]];
toch452(DAT);
DAT1=DAT1+0x0400;
}
voidsx(void)//送显示函数
dispbuff[0]=second0;
//频率个位
dispbuff[1]=second1;
//频率十位
dispbuff[2]=minute0;
//频率百位//"
-"
dispbuff[3]=minute1;
//频率千位
dispbuff[4]=29;
//等号
dispbuff[5]=15;
//"
f"
dispbuff[6]=26;
//不显示
dispbuff[7]=j%10;
//转换波形状态
unsignedintkey1(void)
{
unsignedchari,keycode,keyn;
if(CH452_KEY==0)//查询键盘
keycode=rdch452();
//将键值赋给变量keycode
keyn=0;
for(i=0;
i++)//键译码
if(key[i]==keycode)