51单片机的A/D转换应用(郭天祥TX-1C实验板):ADC0804
时间:10-02
整理:3721RD
点击:
此实验是通过ADC0804芯片,将采集到的模拟信号转换为数字量信号,并将数字量的变化通过LED灯以及数码管的显示实时反应出来。
对于ADC0804芯片,当片选信号CS=0(低电平有效)时,写信号WR在一个上升沿时,启动ADC芯片,并将模拟量信号输入ADC;读出时,在片选信号有效的同时,读出信号RD由低电平转换为高电平的过程中,将数字量信号输出到单片机的I/O口。
本实验是采用郭天祥的TX-1C实验板来实现程序的功能,原理图如下附件: 程序代码如下:
- #include<reg52.h> //52系列单片机的头文件
- #include<intrins.h> //包含_nop_()函数,实行空操作
- #define uint unsigned int
- #define uchar unsigned char
- /*----------------------特殊功能位的声明-----------------------*/
- sbit adcs=P0^7; //adcs为ADC0804的片选信号端
- sbit wr=P3^6; //wr表示写入功能控制位
- sbit rd=P3^7; //rd表示读出功能控制位
- sbit dula=P2^6; //dula控制数码管的段选
- sbit wela=P2^7; //wela控制数码管的位选
- uchar num; //用来存放转换后的数字量值
- uchar bai,shi,ge; //用来存放num分离出来的各位数
- uchar i; //用来控制循环次数
- uchar code table[]= //编码数组table保存段选字形码0~9的编码
- {0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- /*----------------------子函数的的声明-----------------------*/
- void delayms(uint);
- void display(uchar);
- void ADCStart();
- void main()
- {
- while(1) //while(1)循环,使模拟量实时发生变化
- {
- ADCStart();
- adcs=0; //选中ADC
- _nop_(); //空操作,延时一机器周期,使ADC响应
- rd=0; //准备读出数字量数据
- _nop_();
- _nop_();
- num=P1; //将P1端口的数字量赋给num,用于数码显示
- for(i=0;i<50;i++) //循环50次,此时LED灯保持常亮直到执行语
- //句"rd=1;"才熄灭,且数码管显示同一数值 {
- display(num); //将数字量的数值显示到数码管上
- }
- rd=1; //rd一个上升沿将数据读出,此时灯灭
- _nop_();
- adcs=1; //片选信号置于高电平,关闭ADC芯片
- }
- }
- /*-------ADC启动函数,并往ADC中写入模拟量数据-------*/
- void ADCStart()
- {
- adcs=0; //选中ADC,片选信号CS低电平有效
- _nop_();
- wr=0;
- _nop_();
- wr=1; //wr一个上升沿脉冲,启动ADC,并写入数据
- _nop_();
- adcs=1;
- }
- /*-------显示子函数,将模拟量数据值显示到数码管上-------*/
- void display(uchar num)
- {
- bai=num/100;
- shi=num%100/10;
- ge=num%10;
- dula=1;
- P0=table[bai];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x77;
- wela=0;
- delayms(2);
- dula=1;
- P0=table[shi];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x6f;
- wela=0;
- delayms(2);
- dula=1;
- P0=table[ge];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0x5f;
- wela=0;
- delayms(2);
- }
- void delayms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--)
- ;
- }
注意:LED灯亮的时间段为从"rd=0;"语句执行完到"rd=1;"语句结束为止,其余时间由于P0=0xff,导致LED灯全灭。因此在一个while(1)循环周期内,通过控制此段时间的长度,即LED灯亮的时间百分比,就可控制LED灯的亮度
6位数码管连接原理图
ADC0804连接原理图
LED流水灯连接原理图
第一次发帖,希望大家多提意见,多多支持,谢谢!
学习一下怎么用
很好的,尝试一些这程序
非常感谢小编 RD赋值那个地方之前一直没搞对,看了小编的程序终于知道自己错在哪了,thanks a lot.