完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
为什么下面的程序,不能刷新电压变化,显示结果只有两种不测为0,测就是5。3V,不能随着调度变化而变化,求指教
#include "15f204ea.h" #include "intrins.h" typedef unsigned char uchar; typedef unsigned int uint; uint dat0,dat10,dat100; /* ADC操作『ADC_CONTR寄存器』常量定义 */ #define ADC_POWER 0x80 //ADC电源控制位 #define ADC_FLAG 0x10 //ADC完成标志 #define ADC_START 0x08 //ADC起始控制位 #define ADC_SPEEDLL 0x00 //540个时钟 #define ADC_SPEEDL 0x20 //360个时钟 #define ADC_SPEEDH 0x40 //180个时钟 #define ADC_SPEEDHH 0x60 //90个时钟 ***it wei1=P3^2; ***it wei2=P3^3; ***it wei3=P3^4; ***it wei4=P3^5; uchar table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字不带点 uchar code table1[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //数字带点 /*---------------------------- 软件延时 ----------------------------*/ void Delay(uint n) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } /*---------------------------- 四位数码管显示 ----------------------------*/ void display(uint dat) { uint qian,bai,shi,ge; qian=dat/1000; //对变量temp求抹(就是千的倍数) bai=dat%1000/100; //对变量temp先求余数,再对余数进行100的求抹 shi=dat%1000%100/10; // 对变量temp先求余数,再对余数进行100的求余,最后对余数进行10的求抹 ge=dat%10; //对变量temp求余数 if(dat==dat10) //如果在10伏以下 { wei1=0; //打开位选和第一位 ,因为位选是通过PNP5401作反相器来加大电流,所以用这 P2=table1[qian]; //将求出来的千位数从数码表中取出送给P1口 Delay(1); //延时一下,这样好显示亮一下 P2=0xff;//消影 wei1=1; } else//否则 wei1=0; //打开位选和第一位 ,因为位选是通过PNP5401作反相器来加大电流,所以用这 P2=table[qian]; //将求出来的千位数从数码表中取出送给P1口 Delay(1); //延时一下,这样好显示亮一下 P2=0xff;//消影 wei1=1; //……………………………………………………………………………………………………………………………………………………………………………………………………………………………………… if(dat==dat100) //如果在10伏以下-100伏以下 { wei2=0; //打开位选和第二位 因为位选是通过PNP5401作反相器来加大电流,所以用这个 P2=table1[bai]; //将求出来的百位数从数码表中取出送给P1口 Delay(1); //延时一下,这样好显示亮一下 P2=0xff;//消影 wei2=1; } else//否则 wei2=0; //打开位选和第二位 因为位选是通过PNP5401作反相器来加大电流,所以用这个 P2=table[bai]; //将求出来的百位数从数码表中取出送给P1口 Delay(1); //延时一下,这样好显示亮一下 P2=0xff;//消影 wei2=1; //……………………………… wei3=0; //打开位选和第三位 因为位选是通过PNP5401作反相器来加大电流,所以用这个 P2=table[shi]; //将求出来的十位数从数码表中取出送给P1口 Delay(1); //延时一下,这样好显示亮一下 P2=0xff;//消影 wei3=1; //……………………………… wei4=0; //打开位选和第四位 因为位选是通过PNP5401作反相器来加大电流,所以用这个 P2=table[ge]; //将求出来的个位数从数码表中取出送给P1口 Delay(1); //延时一下,这样好显示亮一下 P2=0xff;//消影 wei4=1;//……………………………… } /*---------------------------- 读取ADC结果 ----------------------------*/ uint GetADCResult(uchar ch) { ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START| ch ; //打开AD转换电源|设置AD转换数度|开始AD转换|8路ADC其中一个通道号 _nop_(); //等待4个NOP _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成 ADC_CONTR &= ~ADC_FLAG; //Close ADC // if((ADC_RES*5.0/256)>0.71) //如果大于0.1伏 // { if((ADC_RES*5.0/256)<10) //如果小于10伏 { dat10=((ADC_RES*5.3/256)+0.021)*1000; return dat10; //返回ADC结果 } if((ADC_RES*5.0/256)>9)//如果大于10伏 { dat100=((ADC_RES*5.3/256)+0.021)*1000; return dat100; //返回ADC结果 } // } // else//否则 } /*---------------------------- 初始化ADC ----------------------------*/ void InitADC() { P1ASF = 0x01; //设置P1.0口为AD口 // P1ASF = 0xff; //设置P1口(P1.0-P1.7)为AD口 ADC_RES = 0; //清除结果寄存器 ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); //ADC上电并延时 } //………………………………………………………………………………………………………… void main() { InitADC(); //初始化ADC while (1) { display(GetADCResult(0)); //显示0通道(P1。0)的ADC高8位结果 } } |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
435 浏览 0 评论
464 浏览 0 评论
450 浏览 0 评论
806 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
748 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17010 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 03:41 , Processed in 2.984152 second(s), Total 72, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2569