资源描述
ADC0804模数转换与显示
精品文档
ADC数模转换与现实
(扩展用1602带电阻值显示)
实验目的:
1. 掌握ADC的使用控制方法。
2. 实验内容: 基本要求:设计一程序采集ADC0809第3通道的电压值,将其转换为数字量,并在数码管上显示;5V显示为255, 0V显示为000。
3. 扩展要求:将转换结果以用1602表现出当前电阻值。
C程序:
#include<reg52.h> //52系列单片机头文件
#include<intrins.h> //包含_nop_函数所在的头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
sbit CS=P2^1; //ADC0804 CS 端
sbit wr=P2^4; //ADC0804 WR 端
sbit rd=P2^5; //ADC0804 RD 端
sbit lcd1=P2^3; //lcd锁存器
sbit lcden=P2^2; //lcd1602 EN 端
sbit lcdrs=P2^0; //lcd1602 RS 端
sbit dula=P2^7; //段选端
sbit wela=P2^6; //位选端
// float r;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge) //数码管显示函数
{
dula=1; //打开段选
P0=table[bai]; //送入百位
dula=0; //关闭段选
P0=0xff; //消隐
wela=1; //打开位选
P0=0x7e; //选择第一位
wela=0; //关闭位选
P0=0; //消隐
delay(5); //延时
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0x7d;
wela=0;
P0=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0x7b;
wela=0;
P0=0;
delay(5);
}
void write_com(uchar com) //1602写指令
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar data1) //1602写数据
{lcdrs=1;
P0=data1;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //1602初始化
{
dula=0; //关闭段选
wela=0; //关闭位选
lcden=0; //lcden置于低电平
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //设置开显示,不显示光标
write_com(0x06); //写一个字符后地址加1
write_com(0x01); //显示清0,数据指针清0
}
void lcd_display(uint ge,F1,F2,F3,F4) //lcd_显示 (F1小数点后一位 F2小数点后两位 F3 F4)
{
wela=0;
dula=0;
lcden=1;
lcd1=1; //打开lcd锁存器
// write_com(0x01);
write_com(0x80); //选择在1602第一行显示
write_data(48+ge); //ascii码48 写入个位
delay(5); //延时
write_data('.');
delay(5);
write_data(48+F1);
delay(5);
write_data(48+F2);
delay(5);
write_data(48+F3);
delay(5);
write_data(48+F4);
delay(5);
write_data('K');
delay(5);
lcd1=0; //关闭锁存器
}
void main() //主程序
{
uchar a,A1,A2,A3,shu;
uint ge,F1,F2,F3,F4;
float r;
init();
CS=0;
while(1)
{
r=(255-shu)/256; //转换公式
wr=1;
_nop_();
wr=0; //启动A/D转换
_nop_();
wr=1;
for(a=10;a>0;a--)
{
display(A1,A2,A3);
}
P1=0xff; //读取P1口之前先给其写全1
rd=1; //选通AD0804 CS 端
_nop_();
rd=0; //A/D读使能
_nop_();
shu=P1; //A/D数据读取赋给P1口
rd=1;
A1=shu/100; //数码管分出 百 十 个
A2=shu%100/10;
A3=shu%10;
ge=(int)r%10; //(int)字符型强制转换成整形 1602分出个位跟小数点后四位
F1=(int)(r*10)%10;
F2=(int)(r*100)%10;
F3=(int)(r*1000)%10;
F4=(int)(r*10000)%10;
lcd_display(ge,F1,F2,F3,F4);
}
}
仿真图:
收集于网络,如有侵权请联系管理员删除
展开阅读全文