基于51单片机制作的波形发生器Proteus仿真程序

发布者:温柔花香最新更新时间:2019-12-16 来源: 51hei关键字:51单片机  波形发生器  Proteus仿真 手机看文章 扫描二维码
随时随地手机看文章

仿真原理图如下
 

单片机源程序如下:

#include


sbit wr=P3^6;

sbit rd=P3^2;


sbit key0=P1^0;

sbit key1=P1^1;

sbit key2=P1^2;

sbit key3=P1^3;

sbit key4=P1^4;


unsigned char flag;//flag为0、1、2、3、4时分别为正弦波、方波三角波、梯形波、锯齿波


unsigned char const code ZXB_code[256]={

0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,

0xa5,0xa8,0xab,0xae,0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,

0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,0xda,0xdc,0xde,0xe0,

0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,

0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,

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

0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf3,0xf2,

0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdc,

0xda,0xd8,0xd6,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,

0xbc,0xb9,0xb6,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,

0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83,0x80,0x7d,0x79,0x76,

0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,

0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,

0x2e,0x2c,0x2a,0x27,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,

0x15,0x14,0x12,0x10,0xf,0xd,0xc,0xb,0x9,0x8,0x7,0x6,0x5,0x4,

0x3,0x3,0x2,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x1,0x1,0x2,0x3,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xc,0xd,

0xe,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,

0x25,0x27,0x29,0x2c,0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x40,

0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,

0x66,0x69,0x6c,0x6f,0x73,0x76,0x79,0x7c

};        //用于生成正弦



unsigned char keyscan()          //键盘扫描函数

{

  unsigned char keyscan_num,temp;


  P1=0xff;

  temp=P1;

  if(~(temp&0xff))

  {

    if(key0==0)

        {

          keyscan_num=1;

        }

        else if(key1==0)

        {

          keyscan_num=2;

        }

        else if(key2==0)

        {

          keyscan_num=3;

        }

        else if(key3==0)

        {

          keyscan_num=4;

        }

        else if(key4==0)

        {

          keyscan_num=5;

        }

        else

        {

          keyscan_num=0;

        }


        return keyscan_num;

  }

}


void init_DA0832()//DA芯片准备函数

{

  rd=0;

  wr=0;

}


void ZXB()//正弦波函数

{

  unsigned int i;

  

  do{

    P2=ZXB_code[i];

        i=i+1;

        }while(i<256);

}


void FB()//方波

  EA=1;

  ET0=1;

  TMOD=1;

  TR0=1;

  TH0=0xff;

  TL0=0x83;

}


void SJB()//三角波

{

  P2=0x00;

  do{

    P2=P2+1;

  }while(P2<0xff);

  P2=0xff;

  do{

    P2=P2-1;

  }while(P2>0x00);

  P2=0x00;

}


void JCB()//锯齿波

{

  P2=0x00;

  do{

    P2=P2+1;

  }while(P2<=0xff);

}


void TXB()//梯形波

{

  unsigned char i;


  P2=0x00;

  do{

    P2=P2+1;

  }while(P2<0xff);

  P2=0xff;

  for(i=255;i>0;i--)

  {

    P2=0xff;

  }

  do{

    P2=P2-1;

  }while(P2>0x00);

  P2=0x00;

}


void main()

{

  init_DA0832();

  do

    {

      flag=keyscan();

    }while(!flag);//等待按键按下

  while(1)

  {

    switch(flag)

    {

      case 1:

            do{

              flag=keyscan();

              ZXB();

             }while(flag==1);

            break;

          case 2:

            FB();

            do{

              flag=keyscan();

                  }while(flag==2);

                  TR0=0;

            break;

          case 3:

            do{

              flag=keyscan();

              SJB();

                  }while(flag==3);

            break;

          case 4:

            do{

              flag=keyscan();

              TXB();

                  }while(flag==4);

            break;

          case 5:

            do{

              flag=keyscan();

              JCB();

                  }while(flag==5);

            break;

          default:

            flag=keyscan();

            break;

    }        

  }

}


void timer0(void) interrupt 1

{

  P2=~P2;

  TH0=0xff;

  TL0=0x83;

  TR0=1;

}



关键字:51单片机  波形发生器  Proteus仿真 引用地址:基于51单片机制作的波形发生器Proteus仿真程序

上一篇:自己制作的单片机万年历 程序+原理图
下一篇:51单片机温控风扇制作 数码管显示 Proteus仿真程序

推荐阅读最新更新时间:2024-11-08 14:53

51单片机 驱动蜂鸣器、继电器实验
//==声明区======================================== #include // 定义8051暂存器之标头档, P2-17~19 sbit buzzer = P3^7; // 声明蜂鸣器的位置 sbit relay = P3^6; // 声明继电器的位置 void delay(int); // 声明延迟函数 void pulse_BZ(int,int,int); // 声明蜂鸣器发声函数 void pulse_RL(int,int,int); // 声明继电器控制函数 //==主程序==========
[单片机]
为什么51单片机晶振使用11.0592
用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的。 所以也还能用STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。 这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。 用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大
[单片机]
keil的51单片机仿真调试中如何查看内存的内容
在Keil中,玩过51的朋友都知道,调试时编译器给出了寄存器窗口(Register)、中断系统窗口(Interrupt System)、I/O口查看窗口(I/O ports)、串口和定时器设置窗口(serial、Timer)但是如何查看某一块内存区域的内容呢? 在Memory窗口中输入址值,得到的结果是程序代码区的内容,由于51是采用的是哈佛结构,程序指令存储和数据存储分开。要查看各种内存区域的内容,只要在Address框内输入 字母:地址 即可显示相应的内存值。其中字母可以是C、D、I、X,分别代表的意义是: C:代码存储空间 D:直接寻址片内存储空间 I :间接寻址片内存储空间
[单片机]
51单片机Keil C51的使用(C语言)
实验目的: 初步掌握Keil(C51语言)和SUN ES59PA实验仪的操作和使用,能够输入和运行简单的程序。 实验设备: SUN ES59PA实验仪一套、具有一个RS232串行口并安装Keil C51的计算机一台。 实验原理及环境: 1.在计算机上已安装Keil C51软件。这个软件既可以与硬件(SUN ES59PA实验仪)连接,在硬件(单片机)上运行程序;也可以不与硬件连接,仅在计算机上以虚拟仿真的方法运行程序。如果程序有对硬件的驱动,就需要与硬件连接;如果没有硬件动作,仅有软件操作,就可以使用虚拟仿真。 2. 实验的硬件环境: A3区:CPU总线、I/O接口 片选区 JP37,JP45:地址线A0..A7;
[单片机]
<font color='red'>51单片机</font>Keil C51的使用(C语言)
51单片机,点阵显示汉字(C语言)
#include reg51.h #include intrins.h //要用到 _nop_() #define uint unsigned int #define uchar unsigned char sbit SH_595=P2^1; sbit DATA_595=P2^0; sbit ST_CP_595=P2^2;//74HC595(12)-ST_CP上升沿-移位寄存器的数据进入数据存储寄存器 输出锁存器的时钟信号端口 sbit MR_595=P2^3; //74HC595(10)-MR 为0将移位寄存器的数据清0 sbit E1_154=P2^4;//74HC154(18)-E1为0开列(col)输出 显示允许
[单片机]
51单片机---定时器 计数器
一、MCS-51单片机的定时器/计数器概念 单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,而花费的时间恰好是1微秒;只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流逝; 因此,单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51单
[单片机]
<font color='red'>51单片机</font>---定时器 计数器
c51中断优先级c语言,51单片机的中断优先级及中断嵌套
说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。 在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。 中断的优先级有两个:查询优先级和执行优先级。 什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级: 外部中断0 定时/计数器0 外部中断1 定时/计数器1 串行中断 或 int0,timer0,int1,timer1,serial port 或 INT0、T
[单片机]
PROTEUS仿真点亮LED项目
设计要求:在本项目中,将设计微控制器的基本电路,其中包括晶体振荡器等。将单片机任何I / O引脚上连接一个小LED,然后使其闪烁。 比较简单的一个,放一下原理图代码什么的: #include reg51.h sbit LED = P1^0; void cct_init(void); void delay(int a); int main(void) { cct_init(); while(1) { LED = 0; delay(30000); LED = 1; delay(30000); } } void cct_init(void) { P1 = 0x00; } void delay(int a) { i
[单片机]
用<font color='red'>PROTEUS仿真</font>点亮LED项目
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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