IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 单片机课设-波形发生器 -> 正文阅读

[嵌入式]单片机课设-波形发生器


前言

??这篇文章是自己写的单片机课设,发这篇文章就当留个小纪念;如果说有什么不太好的地方还请大神请指出
?Keil C51的代码以及Proteus的仿真的百度网盘链接放到这里
? 链接: 点我跳转点我点我点我
?(提取码:TYWL)


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

一、课设任务是什么?

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

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

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

三、仿真原理图


四、代码

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*8LED显示代码

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

void T0_time() interrupt 1
{
	TH0=a;//重新装填初值
	TL0=b;
	u++;	//u自加1
	if(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();
   }
}

结尾

若有错误,欢迎私信指出

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:21:57  更:2021-07-15 16:23:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:46:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码