📄 0831.c
字号:
/****使用ADC0831测电压;并用数码管显示电压的数值***/
/****注意:测量的电压范围:0-5V********************/
#include <reg51.h>
#include <intrins.h>
sbit CLK=P1^3; //CLK--7脚 //时钟I/O端口
sbit DO=P1^4; //DO---6脚 //数据I.O端口
sbit CS=P1^6; //CS---1脚 //片选I/O端口
//sbit RST = P1^5;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突
code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,
0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x3e,0x00};//共阴数码管显示数的组成是 "0-9""0-9有小数点的" "-" "U" "空 表"
unsigned char l_tmpdate[]={0,0,0,0}; //定义数组变量
void delay(); //延时子函数,5个空指令
void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
unsigned char ad0831read(void); //定义该函数为读取ADC0831的数据
void main(void) //主函数;
{
unsigned int i=254,tmp;
RST=0;
while(1)
{
i++;
if(i==255) //这里为循环255个周期读取一次0831,因CPU运行比较快,没必要每次循环都去读取
{
tmp=ad0831read()*100; //这里乘上100的意思是保留两位小数
tmp=tmp/51; //这里为什么除以51呢,分析如下:模数转换IC是8位ADC,转换回来的数值是0-255
//0V时是0,5V时是255,他相应的倍数就是255/5=51,因此,我们的将转换回来的
//数除以51,就得到相应的电压值了,
i=0;
l_tmpdate[0]=tmp/100; //得到百位,其实是个位,因为我们刚才乘上100了
l_tmpdate[0]+=10; //这里是加上小数点,带小数点的数在表中是后10位
tmp=tmp%100;
l_tmpdate[1]=tmp/10; //十位 即小数点后第一位
l_tmpdate[2]=tmp%10; //个位 //即小数点后第二位
l_tmpdate[3]=21; //加上单位U,伏
}
display(l_tmpdate,4); //输出显示 //4是显示的个数
}
}
void display(unsigned char *lp,unsigned char lc)//显示
{
unsigned char i; //定义变量
P2=0; //端口2为输出
P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管;数码管位选
for(i=0;i<lc;i++) //循环显示
{
P2=table[lp[i]]; //查表法得到要显示数字的数码段
delay(); //延时5个空指令
if(i==7) //检测显示完8位否,完成直接退出,不让P1口(位选)再加1,否则进位影响到第四位数据
break;
P2=0; //清0端口,准备显示下位
P1++; //下一位数码管
}
}
void delay(void) //空5个指令延时
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
unsigned char ad0831read(void)//请先了解ADC0831模数转换器的串口协议,再来读本函数,主要是对应时序图来理解
{ //本函数是模拟0831的串口协议进行的,当你了解用软件去模拟一个端口的协议
//以后,对于一个硬件这样的端口就简单多了
unsigned char i=0,tmp=0;
DO=1;
CS=0;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
for(i=0;i<8;i++)
{
tmp<<=1;
if(DO) //使DO端输出加入temp中
tmp++;
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
}
CS=1;
return tmp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -