51单片机课程设计——基于单片机的AD模数转换设计

这篇具有很好参考价值的文章主要介绍了51单片机课程设计——基于单片机的AD模数转换设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 一、功能简介

1.A/D是模拟量到数字量的转换,依靠的是模数转换器(AnalogtoDigitalConverter),简称ADC。D/A是数字量到模拟量的转换,依靠的是数模转换器(DigitaltoAnalogConverter),简称DAC。它们的道理是完全一样的,只是转换方向不同,因此我们讲解过程主要以A/D为例来讲解。

什么是模拟量?就是指变量在一定范围内连续变化的量,总之,任何两个数字之间都有无限个中间值,所以称之为连续变化的量,也就是模拟量。ADC就是起到把连续的信号用离散的数字表达出来的作用。

2.ADC0809的内部逻辑图如图所示:

51单片机ad是什么,单片机,51单片机,课程设计

3. AD各个引脚结构:

D7-D0:8 位数字量输出引脚。

IN0-IN7:8 位模拟量输入引脚。

VCC:+5V 工作电压。

GND:地。

REF(+):参考电压正端。

REF(-):参考电压负端。

START:A/D 转换启动信号输入端。

ALE:地址锁存允许信号输入端。

(以上两种信号用于启动 A/D 转换).

EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。

OE:输出允许控制端,用以打开三态数据输出锁存器。

CLK:时钟信号输入端(一般为 500KHz)。

51单片机ad是什么,单片机,51单片机,课程设计

二、设计要求

1、用Proteus软件画出电路原理图,在单片机的外部扩展片外总线,并通过片外总线与接口。

2、在ADC0809的某一模拟量输入通道上接外部模拟量。

3、在单片机的外部扩展数码管显示器。

4、分别采用延时与查询的方法编写A/D转换程序。

5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。

三、开发工具介绍

1. Keil MDK-ARM是美国Keil软件公司(现已被ARM公司收购)出品的支持ARM微控制器的一款IDE(集成开发环境)。

MDK-ARM包含了工业标准的Keil C编译器、宏汇编器、调试器、实时内核等组件。具有业行领先的ARM C/C++编译工具链,完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件,包含世界上品牌的芯片。比如:ST、Atmel、Freescale、NXP、TI等众多大公司微控制器芯片。

2.Proteus是Lab Center Electronics公司推出的一个EDA工具软件。

Proteus具有原理布图、PCB自动或人工布线、SPICE电路仿真、互动电路仿真、仿真处理器及其外围电路等特点功能。

四、原理图的绘制

51单片机ad是什么,单片机,51单片机,课程设计

五、C程序清单
1602.h
#include <reg52.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P2^2;
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);

/*
void delay(unsigned int i)
{
	while(i--);	
}
*/
void LcdStar()
{
	unsigned char str[] = "Voltage measure";
	unsigned char tab[]="Voltage= "; 
	InitLcd1602();/* 初始化 1602 液晶 */
	LcdShowStr(1, 0, str);
	LcdShowStr(1, 1, tab);
	LcdShowStr(9, 1, "...");//默认初始化温度00
	LcdShowStr(13, 1, "V");//添加V电压
	
		
}

/* 等待液晶准备好 */
void LcdWaitReady()
{
	unsigned char sta;
	LCD1602_DB = 0xFF;
	LCD1602_RS = 0;
	LCD1602_RW = 1;
	do {
		LCD1602_E = 1;
		sta = LCD1602_DB; //读取状态字
		LCD1602_E = 0;
	} while (sta & 0x80); //bit7 等于 1 表示液晶正忙,重复检测直到其等于 0 为止
}
/* 向 LCD1602 液晶写入一字节命令, cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
	LcdWaitReady();
	LCD1602_RS = 0;
	LCD1602_RW = 0;
	LCD1602_DB = cmd;
	LCD1602_E = 1;
	LCD1602_E = 0;
}
/* 向 LCD1602 液晶写入一字节数据, dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{
	LcdWaitReady();
	LCD1602_RS = 1;
	LCD1602_RW = 0;
	LCD1602_DB = dat;
	LCD1602_E = 1;
	LCD1602_E = 0;
}
/* 设置显示 RAM 起始地址,亦即光标位置, (x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
	unsigned char addr;
	if (y == 0) //由输入的屏幕坐标计算显示 RAM 的地址
		addr = 0x00 + x; //第一行字符地址从 0x00 起始
	else
		addr = 0x40 + x; //第二行字符地址从 0x40 起始
	LcdWriteCmd(addr | 0x80); //设置 RAM 地址
}
/* 在液晶上显示字符串, (x,y)-对应屏幕上的起始坐标, str-字符串指针 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
	LcdSetCursor(x, y); //设置起始地址
	while (*str != '\0') //连续写入字符串数据,直到检测到结束符
	{
		LcdWriteDat(*str++); //先取 str 指向的数据,然后 str 自加 1
	}
}
/* 初始化 1602 液晶 */
void InitLcd1602()
{
	LcdWriteCmd(0x38); //16*2 显示, 5*7 点阵, 8 位数据接口
	LcdWriteCmd(0x0C); //显示器开,光标关闭
	LcdWriteCmd(0x06); //文字不动,地址自动+1
	LcdWriteCmd(0x01); //清屏
}
测试程序:
#include <reg52.h>
#include <LCD1602.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//ADC0832 
sbit CS = P1^0;
sbit CLK = P1^1;
sbit DIO = P1^2;

uchar len;
//一位小数,电压显示
uchar Display_Buffer[4];
//延时
void DelayMS(uint ms)
{
	uchar t;
	while(ms--)
	{
		for(t=0;t<120;t++);
	}
}

//获取AD转换结果
uchar Get_AD_Result()
{
	uchar i,dat1 = 0,dat2 = 0;
	//起始控制位
	CS = 0;
	CLK = 0;
	DIO = 1;   _nop_(); _nop_();
	CLK = 1;   _nop_(); _nop_();
	//第一个下降沿之前 设DI=1/0	
	//选择单端/差分(SGL/DIF)模式中的单端输入模式
	CLK = 0; DIO=1; _nop_();_nop_();
	CLK = 1;       _nop_();_nop_();
	//第二个下降沿之前 设DI=0/1 选择CH0/CH1
	CLK = 0;DIO = 0; _nop_();_nop_();
	CLK = 1;DIO = 1; _nop_();_nop_();
	//第三个下降沿之前 DI=1
	CLK = 0; DIO = 1; _nop_();_nop_();
	//4-11,共8个下降沿读取数据(MSB->LSB)
	for(i=0;i<8;i++)
	{
		CLK = 1;  _nop_();_nop_();
		CLK = 0;  _nop_();_nop_();
		dat1 = dat1<<1|DIO;
	}
	//11-18 共8个下降沿读取数据(LSB->MSB)
	for(i=0;i<8;i++)
	{
		dat2 = dat2|((uchar)(DIO)<<i);
		CLK = 1;  _nop_();_nop_();
		CLK = 0;  _nop_();_nop_();
	}
	CS = 1;
	//如果MSB->LSB和LSB->MSB读取数据结果相同,返回读取结果,否者0
	return (dat1==dat2) ? dat1 : 0 ;	
}

void main()
{
	uint Data;
	InitLcd1602(); //LCD初始化
	LcdStar();
	DelayMS(10);
	while(1)
	{
		//获取AD转换值 最大值255对应最高电压5.00V
		//显示三个数 使用500
		Data = Get_AD_Result()*500.0/255;
		// 数据分解
		Display_Buffer[0]= Data /100+'0'; 
		Display_Buffer[1] = '.';
		Display_Buffer[2] = Data /10%10+'0';
		Display_Buffer[3] = Data %10+'0';
		LcdShowStr(9, 1,Display_Buffer);
	}
}

51单片机ad是什么,单片机,51单片机,课程设计

六、实验感想

此次课程设计运用了一些基础的模块比如在课堂上学到的延时、循环和中断,将他们运用到课程设计里可以让我加深对这些知识的印象,有理论依据也要有实践操作。在编写获取AD转换结果时,遇到较多的麻烦,比如在下降沿读取数据时发生错误,Keil报错,根据错误代码通过网络找到了合理的解决方案。

这次课程设计让我意识到课堂中学到的知识只是冰山一角,今后的学习中应当努力掌握知识,提高自己的知识水平,才能做好设计。

七、参考文献

【1】王晋凯 《简简单单学通51单片机开发》.清华大学出版社.2014文章来源地址https://www.toymoban.com/news/detail-762070.html

到了这里,关于51单片机课程设计——基于单片机的AD模数转换设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C51单片机密码锁课程设计

    提示:文章写完后,目录可以自动加粗样式生成,如何生成可参考右边的帮助文档 微机原理及单片机应用技术的课程设计,C51设计一个密码锁; 要求:键盘上有0-9个数字按键,功能键:确认和取消等,可设置复合键。密码的位数及密码可以任意设定,,当输入数字和设置的密

    2023年04月10日
    浏览(22)
  • 单片机学习笔记---AD模数转换&DA数模转换

    目录 AD模数转换 XPT2046.c XPT2046.h main.c DA数模转换 main.c 上一篇博客讲了AD/DA转换的工作原理,也介绍了运算放大器的工作原理,这节开始代码演示! 新创建一个工程:AD模数转换 第一个工程将用到LCD1602和Delay函数,所以首先将我们之前讲过的代码模块添加进来 然后创建主程序

    2024年02月19日
    浏览(19)
  • 51单片机——ADC模数转换实验

    目录 一、功能描述 二、ADC介绍 2.1 逐次逼近型ADC转换原理 2.2 ADC的主要技术指标 三、XPT2046芯片介绍 3.1 XPT2046外部引脚 3.2 XPT2046的命令字 3.3 XPT2046时序图 四、测试文件test.c 五、实验现象         我们使用的 STC89C51单片机内部不含 ADC 接口,所以需要外接一个 ADC 转换芯片将

    2024年02月06日
    浏览(22)
  • 51单片机入门——数模\模数转换

    要记录一段美妙的音乐,我们至少有两种方式。第一种是使用黑胶唱片,第二种是使用数码文件。 任何一种音乐本质来说,都是一种跟随时间不断变化的信号,如下图(a)所示。它本身具有如下特点: 在时间轴上,信号是连续的,即每一个时刻都对应一个确定的信号。 信号

    2024年02月06日
    浏览(23)
  • 基于51单片机 + MQ-3酒精传感器 + ADC0832模数转换器 + LCD1602液晶显示器的酒精检测系统

    废话不多说,直接上东西。本文是基于51单片机的酒精检测系统设计,用的元器件有:51单片机、MQ-3酒精传感器、ADC0832模数转换器、 LCD1602液晶显示器、喇叭等元器件。 1、MQ-3 酒精检测传感器,用于检测酒精浓度。当然采集到的数据是模拟的还需要通过ADC0832模数转换器将其转

    2024年02月12日
    浏览(25)
  • 51单片机项目(9)——基于51单片机的电子琴设计

    简易电子琴设计设计内容: 1.用矩阵键盘代表琴键,至少能弹出8个音符,分别是:音符1.23.4.,5,6,  2.键按下的时间长短表征节拍的长短,用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 (代码及其工程文件放在最后) 电路图如下: 51单片机电子琴是一种基于51单片机(

    2024年02月09日
    浏览(18)
  • 【【51单片机AD转换模块】】

    2024年02月15日
    浏览(18)
  • 单片机设计基于51单片机的智能风扇控制系统设计与实现

      我们常见的电风扇一般只有四、五个风速档,用的是人工开关,而且并不是每个人家里都会有空调,或者在一些小型的工厂或者一些小型加工厂,这些地方都可能没有配备大型的中央空调系统这些东西,所以这些东西往往都会采用风扇这种小成本的东西来代替,但是不清楚

    2024年02月03日
    浏览(36)
  • 51单片机(十六)AD/DA

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月05日
    浏览(19)
  • 十四、51单片机之AD转换

    (1)A是指analog、模拟的;D是指digital、数字的。 (2)现实世界是模拟的,连续分布的,无法被分成有限份;计算机世界是数字的,离散分布的,是可以被分成有限份的; (3)AD转换就是把一个物理量从模拟的转换成数字的。 自然界多数是模拟量,为了方便计算机处理,人为的数字

    2024年02月06日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包