
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch //开始转换
这是用STC单片机内部A/D转换电路进行A/D转换时,要给A/D控制寄存器ADC_CONTR写启动转换命令,ADC_CONTR是ADC控制寄存器,其中的每一位的作用见下图,而这行语句前面肯定闷毕要有清罩宏定义每一位状态的语句,或用#define宏定义了各答册位的值。
重点不在算法,重点是会AD_init() 和AD_get(channel)会初始化和启动AD转换并读取转换结果
至于换算是根据自己电路情况确定的,由于计算时采用过多的浮点陪乱型变量会占用较多内存,造成内存不足,因此有除法时常采用整形变量进行计算,运算时为了保持尾数不丢失,需把被除数扩大100倍或1000倍,如整数123/100=1,小数部分丢失了,为得到1.23这个结果,需把123扩大100倍,变成12300,12300/100=123.0,然后将小数点向左移2位(缩小100倍芦启档),即得1.23 这就是定旁穗(小数)点计算
LedCtrl = LedCtrl &0xdf大概就是一次选通一个数码管,7f df ef bf每次只有一位是0
#include <reg52.h> //包含51单片机头文件//共阳极数码管0-9数组编码
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
//数码管位选数组编码,这里有8位数码管(既8个数码管)
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}
//下面是变量申明
unsigned char mode=0
unsigned int temp
float dianya
unsigned int dianya1
//下侍空顷面是51单片机端口位申明
sbit START=P1^5
sbit EOC=P1^6
sbit OE=P1^7
sbit a=P1^0
sbit b=P1^1
sbit c=P1^2
sbit key=P1^3
//一个延时函数
void delay(unsigned int z)
{
while(z--)
}
//按键扫描函数
void key_scan()
{
if(key==0) //当key按下时,key既端口P1^3
{
delay(10) //延时
if(key==0) //在检测端口P1^3是否为低
{
/********************************************
到这里你发现你程序有问题
********************************************/
}
}
switch (mode) //这里也有问题,如果mode只为0,变量a b c清0,可以用if语句
{
case 0 : a=0b=0c=0break
}
}
void main()//主函数
{
unsigned char aa[4],i
while(1)
{
key_scan()
P2=wei[0] // 选中第一个数码管
P0=seg[mode] //第一个数码管显示存在变量mode里的数
/*******************************************
下面部分应该为从AD检测一个电压
*******************************************/
START=1 //P1^5 置1
delay(10) //延时
START=0 //P1^5 置0
while(EOC==0) //如果P1^6为0,一亏让直循环等待
OE=1//P1^7置1
temp=P3 //把P3端口上8位数赋值给变量temp
dianya=(5.0/255)*temp //8位AD值转换成老陆电压显示值
dianya1=dianya*10
aa[2]=dianya1/10 //把转换后的值除10
aa[3]=dianya1%10 //把转换后的值求模
for(i=2i<4i++)
{
P2=wei[i] //数码管2,3分别位选
if(i==2)
P0=seg[aa[i]]&0x7f //显示转换后的电压值aa[2]并加上点 (除10的值)
else P0=seg[aa[i]] //显标转换后的电压值aa[3](求模值)
delay(1)
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)