基于C51单片机、AD1674和MAX7221的数字电压表(含原理图)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于C51单片机、AD1674和MAX7221的数字电压表(含原理图)
2010年06月24日星期四 15:43
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define addo (10.0/4095.0)//转换进率,12位精度(2^12-1=4095),满量程为10V /*管脚定义*/
sbit DIN = P2^5;
sbit SCL = P2^6;
sbit CS = P2^7;
sbit STS = P2^0;
sbit CS1 = P2^1;
sbit A0 = P2^2;
sbit CE = P2^3;
sbit RC = P2^4;
static uchar disbuf[8];//显示缓存
/*微秒延时函数*/
void delay_us(uchar n)
{
uchar i;
while(n--)
{
for(i=0;i<10;i++);
}
}
/*毫秒延时函数*/
void delay_ms(uint n)
{
uchar i;
while(n--)
{
for(i=0;i<100;i++);
}
}
/*向MAX7221串行写一个字节的数据*/
void WriteData(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DIN = (dat&(0x80>>i))?1:0;
SCL = 0;
delay_us(2);
SCL = 1;
delay_us(2);
}
}
/*向MAX7221中指定的地址写入数据*/
void MAX7221_Write(uchar addr,uchar dat)
{
CS = 0;
WriteData(addr);
WriteData(dat);
CS = 1;
}
/*MAX7221的初始化*/
void MAX7221_Initial(void)
{
MAX7221_Write(0x0A,0x07);//LED亮度值设置为8/16
MAX7221_Write(0x0B,0x07);//扫描显示器的个数为8个
MAX7221_Write(0x0C,0x01);//正常操作模式(非掉电模式)
MAX7221_Write(0x0F,0x00);//正常显示模式(非测试模式)
MAX7221_Write(0x09,0xff);//对0~7的8个数据进行B型BCD译码}
/*LED显示函数*/
void display(void)
{
uchar i;
for(i=0;i<8;i++)
{
MAX7221_Write(i+1,disbuf[i]);
}
}
/*读取AD1674转换结果*/
uint AD1674_Read(void)
{
uint temp;
uchar temp1,temp2;
CS1 = 1;
CE = 0; //初始化,关闭数据采集
CS1 = 0;
A0 = 0;
RC = 0;
CE = 1; //CE=1,CS1=0,RC=0,A0=0启动12位温度转换
_nop_();
while(STS==1);//等待数据采集结束
CE = 0; //芯片使能关闭
RC = 1;
A0 = 0;
CE = 1; //CE=1,CS1=0,RC=1,12/8=1,A0=0允许高八位数据并行输出
_nop_();
temp1 = P0;//读取转换结果的高八位
CE = 0;//芯片使能关闭
RC = 1;
A0 = 1;
CE = 1;//CE=1,CS1=0,RC=1,12/8=0,A0=1允许低四位数据并行输出
_nop_();
temp2 = P0;//读取转换结果的低四位
CE = 0;
CS1 = 1;//关闭AD1674数据采集
temp = (temp1<<8)|temp2;//高位和低位合成实际温度,temp2为P0口的高四位return (temp>>4);//返回转换结果,右移四位是因为temp2为P0口的高四位}
/*向缓冲器中写入要显示的数据*/
void HEXTOBCD(uchar chn)
{
uint temp;
temp = (int)(AD1674_Read()*addo*1000);//转换为可显示的实际温度值
disbuf[0] = temp/10000;
disbuf[1] = (temp%10000/1000)|0x80;//带小数点的位显示
disbuf[2] = temp%1000/100;
disbuf[3] = temp%100/10;
disbuf[4] = temp%10;
disbuf[5] = 15;
disbuf[6] = 15;//空显示
disbuf[7] = chn;//显示通道号
}
/*主函数*/
void main()
{
MAX7221_Initial();
while(1)
{
HEXTOBCD(1);//采集第一通道的数据
display();//显示采集到的数据
delay_ms(10);
}
}
原理图如下:。

相关文档
最新文档