📄 adc0832.c
字号:
/********************************************************************/
/* */
/* ME300B单片机开发系统演示程序 - ADC0832电压表 */
/* */
/* 采用三位数码管显示 */
/* 参考电压接至5V电源 */
/* 最小输出电压:0.00V 最大输出电压:5.00V 分辨率:0.02V */
/* */
/* 邮箱: gguoqing@willar.com */
/* 网站: http://www.willar.com */
/* 作者: gguoqing */
/* 时间: 2006/01/20 */
/* */
/* */
/*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved */
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */
/* */
/********************************************************************/
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define disdata P0 //显示数据段码输出口
#define channel_0 0x02 //单通道0输入选择
#define channel_1 0x03 //单通道1输入选择
sbit ADC_CS = P3^4; //片选端
sbit ADC_CLK= P1^0; //时钟端
sbit ADC_DI = P1^1; //数据输入输出复用
sbit ADC_DO = P1^1; //DI和DO端都接在P1.1
sbit ACC0=ACC^0; //通道与输入方式控制字
sbit ACC1=ACC^1; //通道与输入方式控制字
sbit DISX=P0^7; //LED小数点
uchar code disply[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
// 0 1 2 3 4 5 6 7 8 9 关闭
uchar code dis_scan[3]={0x7f,0xbf,0xdf}; //列扫描控制字
uint data dis[4]={0x00,0x00,0x00,0x00}; //定义3个显示数据单元和一个数据存储单元
/********************************************************************/
/* */
/* 延时函数 */
/* */
/********************************************************************/
delay(int ms)
{
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/********************************************************************/
/* */
/* 启动ADC转换 */
/* */
/********************************************************************/
ADC_start()
{
ADC_CS=1; //一个转换周期开始
_nop_();
ADC_CLK=0;
_nop_();
ADC_CS=0; //CS置0,片选有效
_nop_();
ADC_DI=1; //DI置1,起始位
_nop_();
ADC_CLK=1; //第一个脉冲
_nop_();
ADC_DI=0; //在负跳变之前加一个DI反转操作
_nop_();
ADC_CLK=0;
_nop_();
}
/********************************************************************/
/* */
/*AD转换函数 */
/*选择输入通道,输入信号的模式《单端输入,或差分输入》 */
/* */
/********************************************************************/
ADC_read(uchar mode)
{
uchar i;
ADC_start(); //启动转换开始
ACC=mode;
ADC_DI=ACC1; //输出控制位1,DI=1,单通道输入,DI=0,差分输入。
ADC_CLK=1; //第二个脉冲
_nop_();
ADC_DI=0;
ADC_CLK=0;
_nop_();
ADC_DI=ACC0; //输出控制位0,DI=0,通道0输入,DI=1,通道1输入。
ADC_CLK=1; //第三个脉冲
_nop_();
ADC_DI=1;
ADC_CLK=0; //输入模式和通道号已经选择完。
ADC_CLK=1; //第四个脉冲
ACC=0;
for(i=8;i>0;i--) //读取8位数据
{
ADC_CLK=0; //脉冲下降沿
ACC=ACC<<1;
ACC0=ADC_DO; //读取DO端数据
_nop_();
_nop_();
ADC_CLK=1;
}
ADC_CS=1; //CS=1,片选无效。
return(ACC);
}
/********************************************************************/
/* */
/* 数据处理与显示函数 */
/* 将采集到的数据进行16进制转换为10进制的处理,然后送显示。 */
/* */
/********************************************************************/
show_value(uchar ad_data)
{
uchar k;
dis[2]=ad_data/51; //AD值转换为3为BCD码,最大为5.00V。
dis[3]=ad_data%51; //余数暂存
dis[3]=dis[3]*10; //计算小数第一位
dis[1]=dis[3]/51;
dis[3]=dis[3]%51;
dis[3]=dis[3]*10; //计算小数第二位
dis[0]=dis[3]/51; //
for(k=0;k<3;k++)
{
disdata=disply[dis[k]];
if(k==2){DISX=0;}
P2=dis_scan[k];
delay(1);
P2=0xff;
}
}
/********************************************************************/
/* */
/* 主函数 */
/* */
/********************************************************************/
main()
{
uchar i,j;
while(1)
{
i=ADC_read(channel_0);
for(j=0;j<20;j++)
{
show_value(i);
}
}
}
/********************************************************************/
/* */
/*将i=ADC_read(channel_0)改为i=ADC_read(channel_1)即可使用JP6输入 */
/* */
/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -