标题:
51单片机ADC0808采集 数码管显示
[打印本页]
作者:
天外仙
时间:
2021-3-4 15:06
标题:
51单片机ADC0808采集 数码管显示
51hei图片20210304150216.png
(23.34 KB, 下载次数: 57)
下载附件
2021-3-4 15:02 上传
程序和仿真工程请在附件中下载
单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
//定义ADC的控制接口
#define ADC_DATA P1
sbit ADC_EOC = P3^2;
sbit ADC_CLK = P3^1;
sbit ADC_START = P3^0;
sbit ADC_OE = P3^3;
sbit ADC_A = P3^4;
sbit ADC_B = P3^5;
sbit ADC_C = P3^6;
//定义数码管接口
#define SEG_DATA P0
sbit seg_1=P2^0;
sbit seg_2=P2^1;
sbit seg_3=P2^2;
sbit seg_4=P2^3;
uchar code SEG_Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xf7};//CA共阳
uchar dis_data_buf[4]={0,0,0,0};
//============================
//ADC获取函数
//============================
uchar ADC_GET(uchar temp_channel)
{
if(temp_channel==0)
{
ADC_A=0;
ADC_B=0;
ADC_C=0;
}
else if(temp_channel==1)
{
ADC_A=1;
ADC_B=0;
ADC_C=0;
}
else if(temp_channel==2)
{
ADC_A=0;
ADC_B=1;
ADC_C=0;
}
else if(temp_channel==3)
{
ADC_A=1;
ADC_B=1;
ADC_C=0;
}
else if(temp_channel==4)
{
ADC_A=0;
ADC_B=0;
ADC_C=1;
}
else if(temp_channel==5)
{
ADC_A=1;
ADC_B=0;
ADC_C=1;
}
else if(temp_channel==6)
{
ADC_A=0;
ADC_B=1;
ADC_C=1;
}
else if(temp_channel==7)
{
ADC_A=1;
ADC_B=1;
ADC_C=1;
}
ADC_START = 0;
ADC_OE = 0;
ADC_START = 1;
ADC_START = 0;
while(ADC_EOC == 0);
ADC_OE = 1;
return ADC_DATA;
}
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
//数码管的显示函数
void diplay(uchar *dis_p)
{
static uchar temp_num=0;
//消隐
seg_1=0;seg_2=0;seg_3=0;seg_4=0;
switch(temp_num) //动态扫描数码管
{
case 0:
SEG_DATA=SEG_Table[*(dis_p+temp_num)]&0x7f;//传递数码管断码到数据段
seg_1=1;seg_2=0;seg_3=0;seg_4=0;
break;
case 1:
SEG_DATA=SEG_Table[*(dis_p+temp_num)];//传递数码管断码到数据段
seg_1=0;seg_2=1;seg_3=0;seg_4=0;
break;
case 2:
SEG_DATA=SEG_Table[*(dis_p+temp_num)];//传递数码管断码到数据段
seg_1=0;seg_2=0;seg_3=1;seg_4=0;
break;
case 3:
SEG_DATA=SEG_Table[*(dis_p+temp_num)];//传递数码管断码到数据段
seg_1=0;seg_2=0;seg_3=0;seg_4=1;
break;
}
Delay_1ms(2);
temp_num++;
if(temp_num>3) temp_num=0;
}
//************************************
//定时器初始化
//************************************
void Time0_init()
{
TMOD |= 0x02; //使用模式2,8位定时器
TH0=256-50;// 50US
TL0=256-50;//
EA = 1; //总中断
ET0 = 1;//定时器0初始化
TR0 = 1;
}
//转换采集的数据进行显示
void Trans_data(uchar temp_channel)
{
ulong temp_data=0;
temp_data=ADC_GET(temp_channel);
temp_data=temp_data*5000/255; //把AD数值换算成电压并放大1000倍,避免小数运算
//解析数据到数码管
dis_data_buf[3]=temp_data%10;
dis_data_buf[2]=temp_data%100/10;
dis_data_buf[1]=temp_data%1000/100;; //数组的最后一个是下划线编码
dis_data_buf[0]=temp_data/1000;
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
Time0_init(); //初始化定时器
while(1)
{
Trans_data(0); //采集指定通道的数据
diplay(dis_data_buf); //刷新显示
}
}
//===========================
//定时器0中断,为ADC提供时钟信号
//===========================
void timer0() interrupt 1
{
ADC_CLK = ~ADC_CLK;
}
复制代码
所有资料51hei提供下载:
ADC809.zip
(236.54 KB, 下载次数: 70)
2021-3-4 15:05 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1