📄 adc0804.c
字号:
/*****************************************************************/
/* */
/*名称: AD转换+显示程序 */
/*功能: 读取当前输入的转换电压,由数码管显示出来。 */
/*难度等级: 中 */
/* 作者: zengrenliang */
/* 版权: http://www.51kaifa.com */
/*编写日期: 2006.05.19 */
/*****************************************************************/
#include<reg52.h>
#define uchar unsigned char
sbit addr0 = P1^4;//系统片选地址线0
sbit addr1 = P1^5;//系统片选地址线1
sbit addr2 = P1^6;//系统片选地址线2
sbit addr3 = P1^7;//系统片选地址线3
sbit led = P1^0;
//行扫描数组
uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
//数码管显示的段码表
uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格
uchar dispbuf[8]; //显示缓冲区
/*****************************延时函数**************************/
void delay (unsigned int us)
{
while(us--);
}
/******************************显示+读键*************************/
void ledscan()
{ unsigned char i,dispcode;
for(i=0;i<8;i++){
addr3 = 0;
addr0 = 0;
addr1 = 1;
addr2 = 0;//开发板上U4(74HC574)的片选地址
dispcode =table[dispbuf[i]]; //取一行显示数据
if(i==3)
P0 = dispcode & 0x7f;
else
P0 = dispcode;
addr3 = 1;
addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
P2 = scan[i];//取row0--row7行扫描数据
delay(50); //延时50us
}
}
/*******************0804转换程序********************/
void ADC0804(void)
{ uchar adc0804value;
float voltage,decimal;
unsigned int intvolt,tofloat;
led = ~led;
addr0 = 1;
addr1 = 1;
addr2 = 0;//输出AD0804片选地址。
addr3 = 1;
P0 = 0xff;//向ADC0804发任何数据,0804开始转换
WR = 0;
WR = 1;
addr3 = 0;
delay(100);//等待转换完成
addr3 = 1;
RD = 0;
adc0804value=P0;//读取转换后的值
RD = 1;
addr3 = 0;
voltage = adc0804value;
voltage = voltage * 0.0391;//将二进制字节数据变成实际电压值 10/256 = 0.0196
intvolt = voltage;//取整数部分
tofloat = intvolt;
decimal = voltage - tofloat;//取小数部分
decimal = decimal * 100;//小数部分取两位
dispbuf[3] = intvolt % 0x0a;//整数部分个位
intvolt = decimal;
dispbuf[5] = intvolt % 0x0a;//小数部分低位
intvolt = intvolt / 0x0a;
dispbuf[4] = intvolt % 0x0a;//小数部分高位
}
/*******************************主函数***********************/
main()
{ uchar i;
for(i=0;i<8;i++)
dispbuf[i] = 17;
while(1){
for(i=0;i<10;i++)
ledscan(); //显示,读键扫描
ADC0804();
}
}
/********************************结束************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -