基于单片机的波形发生器仿真设计

发布者:祝福的4号最新更新时间:2020-09-17 来源: 51hei关键字:单片机  波形发生器  寄存器 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#include

#define  uchar unsigned char

#define  uint  unsigned int

#define DAdata  P0        //DA数据端口

sbit DA_S1= P2^0;   // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存

sbit DA_S2= P2^1;   // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存

sbit key=   P3^2;

uchar wavecount;    //'抽点'计数

uchar THtemp,TLtemp;//传递频率的中间变量

uchar judge=1;      //在方波输出函数中用于简单判别作用

uchar waveform;            //当其为0、1、2时,分别代表三种波

uchar code freq_unit[3]={10,50,200}; //三种波的频率单位

uchar idata wavefreq[3]={1,1,1};           //给每种波定义一个数组单元,用于存放单位频率的个数

uchar code  lcd_hang1[]={"Sine Wave       " "Triangle Wave   " "Square Wave     " "Select Wave:    " "press No.1 key! "};

uchar idata lcd_hang2[16]={"f=    Hz        "};

uchar code waveTH[]={

    0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};

uchar code waveTL[]={

    0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值

0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde,        //三角波频率调整中间值

0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};

/*************************************************************************************************/

uchar code triangle_tab[]={         //每隔数字8,采取一次

0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78,

0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,

0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,

0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00};

uchar code sine_tab[256]={

//输出电压从0到最大值(正弦波1/4部分)

0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,

0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,

0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,

//输出电压从最大值到0(正弦波1/4部分)

0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,

0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,

0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,

//输出电压从0到最小值(正弦波1/4部分)

0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,

0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,

0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,

//输出电压从最小值到0(正弦波1/4部分)

0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,

0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,

0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};

void delay(uchar z)          

{

    uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void triangle_out()        //三角波输出

{

    DAdata=triangle_tab[wavecount++];

if(wavecount>64) wavecount=0;

DA_S1=0;  //打开8位输入寄存器

DA_S1=1;  //关闭8位输入寄存器

}

void sine_out()         //正弦波输出

{

    DAdata=sine_tab[wavecount++];

DA_S1=0;  //打开8位输入寄存器

DA_S1=1;  //关闭8位输入寄存器

}

void square_out()  //方波输出

{

    judge=~judge;

    if(judge==1) DAdata=0xff;

else  DAdata=0x00;

DA_S1=0;  //打开8位输入寄存器

DA_S1=1;  //关闭8位输入寄存器

}

/************1602液晶的相关函数*************/

#define lcd_ports P1

sbit rs=P2^2;

sbit rw=P2^3;

sbit lcden=P2^4;

void write_com(uchar com)

{

rs=0;        //置零,表示写指令

lcden=0;

lcd_ports=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_date(uchar date)

{

rs=1;        //置1,表示写数据(在指令所指的地方写数据)

lcden=0;

lcd_ports=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void disp_lcd(uchar addr,uchar *temp1)

{

uchar num;

write_com(addr);

delay(1);   //延时一会儿???

for(num=0;num<16;num++)

{

write_date(temp1[num]);//或者这样写write_date(*(temp1+num));

delay(1);

}

}

void init_lcd()

{

//uchar num;

lcden=0;  //可有可无???

rw=0;  //初始化一定要设置为零,表示写数据

write_com(0x38);  //使液晶显示点阵,为下面做准备

write_com(0x0c);  //初始设置

write_com(0x06);  //初始设置

write_com(0x01);  //清零

write_com(0x80);  //使指针指向第一行第一格

    disp_lcd(0x80,&lcd_hang1[3*16]);  //在第一行显示

    disp_lcd(0xc0,&lcd_hang1[4*16]);  //在第二行显示

}

/********************1602液晶函数声明结束*********************/

void main()

{

    uchar i=0;

DA_S2=0;    //使DAC寄存器处于直通状态

DAdata=0;

DA_S1=1;    //关闭8位输入寄存器

init_lcd();

    waveform=0;

TMOD=0x01;  //设置定时器0为16位工作方式

IT0=1;      //设置外部中断0为下降沿触发

ET0=1;      //开定时器中断

EX0=1;

EA=1;

while(1)

{

//DAout(0xff);           //可输出TTL波形

//DAout(0x80);

//T_temp=32;

}

}         


void timer0() interrupt 1

{

TH0=THtemp;

TL0=TLtemp;

if(waveform==0)      sine_out();

else if(waveform==1) triangle_out();

else if(waveform==2) square_out();

}

void key_int0() interrupt 0

{

    uchar keytemp;

uint total_freq; //总频率

EA=0; TR0=0;     //关总中断与定时器

delay(5);       //延时够吗???

if(key==0)       //确实有按键按下而引发中断

{

keytemp=P3&0xf0; //获取P3口高四位的值

switch(keytemp)

{

    case 0xe0:        //选择波形

     waveform++;

if(waveform>2) waveform=0;

break;

    case 0xd0:  //频率按规定单位依次增加

     wavefreq[waveform]++;

if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠

break;         //   性更高,使加数有个上限,不会一直加下去*/

……………………


关键字:单片机  波形发生器  寄存器 引用地址:基于单片机的波形发生器仿真设计

上一篇:51单片机水温控制LCD显示加VB上位机温度曲线绘制
下一篇:自制单片机STC12C5A60S2+1602电压表

推荐阅读最新更新时间:2024-11-05 11:21

单片机C8051F020及其在露点测试系统中的应用
简介:通过单片机应用于露点测试系统中存在的缺陷,引入了美国Cygnal公司新近在国内推出的C8051F020单片机,并对该单片机的功能和特点进行了应用性探讨,提出了在露点测试系统中采用C8051F020单片机的可行性方案,通过比较显示:该方案具有更高的性价比。 1应用背景 目前在食品加工、饲料、家用电器等行业中广泛应用的露点测试系统要求具有高精度、高可靠性及高稳定性等特点,而且整个测试过程中需要动态连续或者间歇性动态连续进行。测试系统的控制核心部分一般采用单片机系统,其硬件电路示意图如图1所示。这种单片机系统虽然基本能满足生产需要,但是,由于系统扩展芯片多、线路复杂,也都不同程度地暴露出资源再扩受限、易出故障、编程麻烦、升级维
[单片机]
<font color='red'>单片机</font>C8051F020及其在露点测试系统中的应用
L298N电机驱动器设计资料 单片机例程+详细说明
Altium Designer画的L298N电机驱动器电路原理图和PCB图如下: 制作出来的实物图如下: 接线说明资料: 附件中包含如下单片机控制例程: 例一、步进电机正转两相四拍程序 例七、四相步进电机正转四拍程序 例三、步进电机反转两相四拍程序 例九、四相步进电机反转四拍程序 例二、步进电机正转两相八拍程序 例五、步进电机两相四拍调速程序 例八、四相步进电机正转八拍程序 例六、步进电机两相八拍调速程序 例十、四相步进电机反转八拍程序 例十一、四相步进电机四拍调速程序 例十七、步进电机每按一下转3圈 例十三、四相步进电机八拍调速程序方法二 例十二、四相步进电机八拍调速程序 例十五、步进电机每按一下转1.8度 例十六、步
[单片机]
L298N电机驱动器设计资料 <font color='red'>单片机</font>例程+详细说明
专为PLC应用优化的TI Piccolo浮点MCU
  无需另外部署新线路而一步迈入运营商的行列,坐等收钱,这对诸多电力公司而言,似乎是天上掉下的馅饼,而实现这个应用的狠角色就是电力线通信(PLC)。然而,长期以来,电力线通信并未如预期那样快速发展,因其始终无法摆脱嘈杂噪声等因素的影响。   然而随着宽带技术的发展及市场竞争的推动,更由于新的调制技术、DSP技术及新型PLC专用成套芯片的出现, PLC 愈发能够充分利用现有电力线基础设施,满足智能电网等诸多应用。据悉,今后几年,欧洲、中东和非洲预计将部署超过 2 亿套支持通信功能的电表。在这些地区,集中器/变电站已经连接了 500 到 1000 套电表。此外,PLC 还可扩展到更智能的系统管理应用,包括照明控制、家庭与楼宇的供暖
[工业控制]
专为PLC应用优化的TI Piccolo浮点<font color='red'>MCU</font>
   恩智浦半导体NXP Semiconductors N.V.近日发布了LPC1788微控制器,这是业界首款采用ARM® Cortex™-
   QNX软件系统有限公司今日宣布QNX® Neutrino® RTOS Secure Kernel™6.5.0版本正式商用,该产品是该公司共通准则认证实时操作系统的增强版。QNX® Neutrino® RTOS Secure Kernel™6.5.0版本主要针对发电厂、防御系统,地铁控制中心、政府网络及其它关键性任务应用所设计,使开发人员在基于ARM、Power和x86架构的单核或多核处理器方面有更多的选择,并充分利用QNX操作系统技术的最新功能和增强性能。    QNX Neutrino RTOS Secure Kernel是唯一由共通准则ISO/IEC 15408评估保证级别(EAL)4+授权并能够支持自适应分区的实时操作系
[工业控制]
透过航顺芯片,看国内32位MCU玩家的运营之策
作为嵌入式应用最核心的部分,MCU好比终端产品的中枢神经,控制着产品的行为。随着市场等方面的演进,MCU也从8位、16位,发展到32位、64位。 近年来,在IoT等新兴应用的推动下,32位的MCU已成市场的宠儿。随着工艺与IP的逐渐成熟,32位的MCU增长迅速。据赛迪顾问此前预测,到2020年,全球32位MCU出货量将达到166亿颗,市场规模将达到137.8亿美元。 目前,全球MCU市场仍被龙头企业垄断,不到十家的MCU厂商占据着九成的市场份额。我国本土MCU企业在高端产品布局、芯片产值、业务规模等方面与国外巨头仍有较大差距。随着技术的发展以及ARM内核授权带来的便利性,目前国内厂商逐渐完成中低端MCU的国产化,在中高端32位MC
[手机便携]
基于AVR单片机Megal6的电子时钟设计
1 引言   数字钟能长期、连续、可靠、稳定地工作;同时还具有体积小,功耗低等特点,便于携带,使用方便。数字钟是采用数字电路实现对“时、分、秒”数字显示的计时装置,广泛应用于个人家庭、车站、码头、办公室等公共场所,已成为人们日常生活中不可缺少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。传统MCS51系列单片机的所有数据处理都基于一个累加器,因此累加器与程序存储器、数据存储器之间的数据转换就成了单片机的瓶颈;在AVR单片机中,寄存器由32个通用工作寄存器组成,并且任何一个寄存器都能充当累加器,从
[单片机]
基于AVR<font color='red'>单片机</font>Megal6的电子时钟设计
AVR单片机控制74HC595 74HC165的示例程序
硬件说明:ATmega48/88/168的PB5是SPI时钟输出,接74HC595/74HC165的移位时钟输入端;PB4是SPI的MISO数据输人,接74HC165的数据输出;PB3是SPI的MOSI数据输出,接74HC595的串行数据输入端SER;PB2接74HC595/74HC165的锁存时钟输入端。 程序1:本例子是用硬件SPI接口循环发送一个变量到74HC595,并且在数据发送完毕后通过 单片机 的另外一个IO接口PB2输出一个“锁存”脉冲 ,使74HC595把移位寄存器的数据输出到锁存寄存器,并驱动8个 LED 输出,实现来回流水的效果。 //本程序在本站的 M8 V2.0 实验板 通过 // CodeWiz
[单片机]
GD32 MCU ISP失败的原因
玩过GD32的小伙伴们都知道,GD32 MCU支持ISP,即在系统编程,前面的常见问题也给大家讲过什么是ISP,什么是IAP? 那有没有小伙伴遇到过ISP失败的情况,失败的原因是什么呢? 我们就以GD32F30x系列为例,来看下用户手册: 通过将BOOT0拉高,BOOT1拉低,上电后,MCU则工作在ISP模式,此时可以通过ALL-IN-ONE软件(或用户自行开发的上位机软件)对MCU进行编程、操作选项字节、flash数据回读等操作,使用的是以下口: 如果用的是容量不超过512K的GD32F303系列(HD产品),则使用USART0(PA9 PA10)进行ISP交互,如果是超过512K的GD32F303系列(XD产
[单片机]
GD32 <font color='red'>MCU</font> ISP失败的原因
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved