单片机课设-波形发生器

  • 前言
  • 一、课设任务是什么?
  • 二、如何解决这几个任务?
  • 三、仿真原理图
  • 四、代码
    • 4.1 LCD1602代码
    • 4.2 波形输出以及8*8点阵显示代码
    • 4.3 波形选择
  • 五、仿真源码下载
  • 关于使用仿真时的问题
  • 常见问题解释

前言

  这篇文章是自己写的单片机课设,发这篇文章就当留个小纪念;如果说有什么不太好的地方还请大神请指出
Keil C51的代码以及Proteus的仿真的百度网盘链接放在文章最后,需要的人可以自取


提示:以下是本篇文章正文内容,下面案例可供参考

一、课设任务是什么?

  1. 设计一款能产生3种以上波形的波形发生器
  2. 设计波形选择按钮(采用3个独立按键)
  3. 点阵显示波形图案;
  4. 能同时输出两种波形;
  5. 显示频率。

二、如何解决这几个任务?

  1. 能产生3种以上波形
    分析:通过查阅资料,得知常用的波形有正弦波、方波、锯齿波、三角波四种波形其余的被称为任意波,因此我主要的目的便是输出四种波形.
  2. 能同时输出两种波形
    同时输出两个波形,就要轮转着用相同的8个I/O口来将波形取码输出到数模转换电路中,也就是对P0这个口时分复用.
      对于波形的取码,采用二维数组来存放数据.
  3. 设计波形选择按钮(采用3个独立按键)
    硬件方面:同时输出两个波形,意味着需要对两个波形进行调控,需要两个按键;开始设置波形与结束设置波形各一个按键,共四个按键实现波形选择.
      程序方面:初步构想是不在主函数中调用键盘扫描,而是在外部中断0服务程序中调用,中断时查询能够节省大部分资源.同时输出两个波形,意味着需要对两个波形进行调控,需要两个按键.再定义两个变量,一个按键对应一个变量就能够解决.
  4. 点阵显示波形图案
    硬件方面:Proteus中最小的点阵是88点阵,如果直接连接到51单片机上I/O口是肯定的不够用的,所以采用串口输出的方式.串并转换芯片采用74HC595;只需要6个引脚就能够控制16个引脚的88点阵
      程序方面:用一个二维数组来存储点阵显示的数据;为了节省C51的空间,就利用上面波形选择时候两个变量来控制这个二维数组.
  5. 显示频率
    硬件方面:P1口连接LCD1602的8个数据口,其他的命令位是在P2.6 P2.7
     程序方面:第一行(也就是write_com(0x80))显示波形输出端一的波形.第二行(就是执行write_com(0xc0))显示的是频率.

三、仿真原理图


四、代码

我把关键部分的代码Po到下面,希望可以对大家有所帮助。
文章后面有关于代码常见问题的解释,有不懂的可以看一下。

4.1 LCD1602代码

 对于LCD1602来说,将它的代码和主函数放到同一个.c文件中会显得十分的累赘;对于这个波形发生器来说LCD显示只是辅助功能,所以放到一个独立的头文件中是一个不错的选择.

/*LCD1602.h 是LCD1602头文件*/
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include<REG52.H>
#define uint  unsigned int
#define uchar unsigned char
/*LCD1602位定义*/
sbit lcdrs = P2^7;//RS : 0=输入指令;1=输入数据
sbit lcden = P2^6;/*LCD1602函数声明*/
void lcd_ram();                 //向LCDRAM中写入八个字节的点阵数据,就会组成一个字符
void init_lcd();                //初始化函数
void write_com(uchar com);      //写命令函数
void write_date(uchar date);    //写数据函数
void delay_LCD56(uint xms);
/*LCD1602要显示的字符*/
uchar code table[]; //1-9
uchar code table1[];//前面是Fout= 是0-9
uchar code zifu[];
#endif

相关的LCD1602.c文件在链接里面有,这里就不再展示


4.2 波形输出以及8*8点阵显示代码

 对于波形输出采用定时器中断的方式输出,通过设置定时/计数器的初值就能够控制波形的频率,对于以后功能的扩展是个不错的选择;

void T0_time() interrupt 1
{TH0=a;//重新装填初值TL0=b;u++;   //u自加1if(u>=64) //如果u超过64,就要归零u=0;  //这是因为各个波形的取值只有64个/*开始输出第一个波形*/WR1 = 1;CS0 = 0;            /*CS0低电平有效,选中第一个DAC0832*/CS1 = 1;          /*CS1低电平有效,第二个DAC0832未被选中*/P0 = wave[flag_0][u];/*将数据通过P0口输出到数模转换电路中*/WR1 = 0;delay(20);/*第一个波形输出完成*//*8*8矩阵显示第一个波形*/for(temp = 0;temp<4;temp++){line_scan();send_595(matrix[flag_0][temp]);delay(3);ST_CP_0 = 0;ST_CP_0 = 1;    //上升沿,存储寄存器变为高电平_nop_();ST_CP_0 = 0;   //发送完}/*8*8矩阵显示第一个波形完成*//*开始输出第二个波形*/WR1 = 1;CS0 = 1;CS1 = 0;P0 = wave[flag_1][u];WR1 = 0;delay(20);/*第二个波形输出完成*//*8*8矩阵显示第2个波形*/for(temp = 0;temp<4;temp++){line_scan();send_595(matrix[flag_1][temp]);delay(3);ST_CP_0 = 0;ST_CP_0 = 1;  //上升沿,存储寄存器变为高电平_nop_();ST_CP_0 = 0;   //发送完}/*8*8矩阵显示第2个波形完成*/
}

4.3 波形选择

 波形选择用的是外部中断0,节省资源;设置优先级高于定时器中断0,能够打断中断0的服务程序进行设置.

void keyscan()
{//当第一个键按下去if(s1 == 0){delay(1);if(s1 == 0){EA = 0;                //关闭总中断while(!s1);      //等待松开按键if(++flag_0==4)flag_0=0;display();     //展示函数EA = 1;              //开总中断}}//当第二个按键按下去if(s2==0)          {    delay(1);          //防抖动if(s2==0)            //确认按键按下{EA=0;         //关闭总中断while(!s2);      //等待按键松开if(++flag_1==4)flag_1=0;EA=1;}}
}
void interrupt_0() interrupt 0 using 3
{while (s3!=0)//等待S3按键按下,就跳出循环,结束中断服务程序{keyscan();}
}

五、仿真源码下载

  这篇文章是自己写的单片机课设,发这篇文章就当留个小纪念;如果说有什么不太好的地方还请大神请指出。
  链 接

单片机课设基于51单片机的波形发生器(公开资源)(四种波形)(同时输出两种波形)相关推荐

  1. 51单片机五层电梯控制器 基于51单片机的五层电梯控制系统

    51单片机五层电梯控制器 基于51单片机的五层电梯控制系统 包括源代码和proteus仿真 系统硬件由51单片机最小系统.蜂鸣器电路.指示灯电路.内部按键电路.外部按键电路.直流电机.内部显示电路.外 ...

  2. C语言课设项目-51单片机-定时器和计数器

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一.定时器的原理 1.CPU时序的有关知识 2.在学习定时器之前需要明白的 3.定时/计数器的工作原理 ...

  3. 51单片机计算器_基于51单片机的倒计时温度检测报警器

    基于51单片机的倒计时温度检测报警器 学习单片机断断续续半年了,在学长学姐的教学帮助下,完成了51单片机的入门学习,开始实践做项目,在一周时间内设计和制作出个人项目.起初,我设计和选择的是12864显 ...

  4. c语言51单片机计算器,新基于51单片机的简易计算器

    <新基于51单片机的简易计算器>由会员分享,可在线阅读,更多相关<新基于51单片机的简易计算器(24页珍藏版)>请在人人文库网上搜索. 1.基于51单片机的简易计算器1.前言: ...

  5. 51单片机开发实例 基于51单片机的光控灯

    一.系统设计 通过光敏电阻模块检测环境中的光强,系统会根据程序设定的阈值完成小灯的控制,环境较暗且低于控制阈值小灯就会亮起.光敏电阻模块可以根据不同的光照强度输出相应的模拟电压信号,模拟信号会通过AD ...

  6. 万年历设计单片机c语言,基于51单片机的电子万年历的设计

    基于51单片机的电子万年历的设计(论文9400字) 功能要求 1. 万年历能用数码管显示阳历年.月.日.星期.[小]时.分.秒并设置指定时间的闹铃. 2. 数字式温度计要求测温范围-50~100°C, ...

  7. 电子密码锁课设单片机c语言,基于51单片机的电子密码锁综合课程设计

    5.大容量片内EEPROM,擦写次数10万次以上 EEPROM,擦写次数10万次以上,擦写次数10万次以上 6.ISP/IAP,在系统可编程/在应用可编程,无需编程器/仿真器 7.共8通道10位高速A ...

  8. C语言课设项目-51单片机-数码管

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 静态数码管 1.数码管是如何显示出字符 显示器及其接口 共阴数码管码表 开发板数码管电路图 2.数码管 ...

  9. 51单片机项目设计:基于51单片机时钟万年历

    文章目录 一.项目功能 二.材料选择 三.原理图设计 四.PCB设计 五.程序设计 哔哩哔哩视频链接: https://www.bilibili.com/video/BV1EF411z7im/ 资料链 ...

最新文章

  1. A 'return' expression required in a function with a block body ('{...}')
  2. python详细安装教程3.7.0-Linux 安装Python3.7.0
  3. google nexus 5 刷机 卡刷 救砖教程
  4. 美国数学三大分支专业就业前景解析 你选对了吗?
  5. 你真的懂redis的数据结构了吗?redis内部数据结构和外部数据结构揭秘
  6. @autowired注解_SpringBoot常用注解大全
  7. 自定义函数变量的设置(*/**),lambda匿名函数(map/filter/zip/enumerate)
  8. Django(part11)--利用UUID传递参数
  9. jzoj6286,P4442-走格子(Portal)【BFS,SPFA】
  10. PCA与图像压缩与去噪
  11. 基于JAVA+SpringMVC+Mybatis+MYSQL的健身管理系统
  12. 原来理解 AOP 可以这么简单
  13. 中国水蛭素产品行业市场供需与战略研究报告
  14. 脚本 金盾替换机器码_金盾2018SS加密视频机器码替换工具的分析过程三
  15. c语言函数能返回结构体,从C中的函数返回`struct`
  16. PHP swoole解密,[讨论]php7.3如何解密swoole
  17. 硬盘播放器和pc计算机,电脑可不可以用来当电影播放器用
  18. 2013级C++第15周项目——二维数组
  19. c语言某天星期几,计算某天是星期几【C代码】
  20. Faster RCNN原理篇(二)——RoIPooling和RoIAlign的学习和理解

热门文章

  1. 形象理解线性代数的本质(三) 矩阵的升维和降维
  2. 平凡的世界-少安少平
  3. java中关于递增和递减两种方式的差别
  4. 《程序设计基础2021》题目集7 题解一
  5. Linux快速创建目录方法(制作文档)
  6. 前度字符串转数组_“薛姨妈”的生日和“尤氏”产育——概念数组与《石头记》藏代修辞格...
  7. 计算机如何获取目标ip,如何在自己的电脑查看别人电脑的ip地址?教你,马上成为电脑高手...
  8. 河南省企业登记全程电子化平台无法访问怎么解决?
  9. 2013年11月-2014年5月规划
  10. vue解决闪现遇到的问题