久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
如何用STC15單片機內部AD讀取并在數碼管顯示電壓值?
[打印本頁]
作者:
pql2438547
時間:
2019-8-21 16:43
標題:
如何用STC15單片機內部AD讀取并在數碼管顯示電壓值?
MCU用的是STC15F2K60S2,外部硬件電路為一個20K的電位器,中間腳滑動端接AD輸入引腳P1.0,另外兩邊引腳分別接GND和VCC,目前代碼可以通過旋轉電位器實現在四位一體共陰數碼管上顯示0~1023的數值,但是下一步想嘗試顯示電壓值卻總是格式不對顯示不正常?參考了幾個例程文件,還是不能弄出。代碼部分的計算電壓值時:adcnum=adcnum*500/1024;結果顯示到數碼管上就不正常了?以下是代碼
#include "reg52.h"
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
sfr T2H = 0xd6; //定時器2高8位
sfr T2L = 0xd7; //定時器2低8位
sfr AUXR = 0x8e; //輔助寄存器
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位結果
sfr ADC_RESL = 0xBE; //ADC低2位結果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
sfr CLK_DIV = 0x97;
sbit LSA=P3^2;
sbit LSB=P3^3;
sbit LSC=P3^4;
uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
uchar DisplayData[8];
void Delay_ms(unsigned int ms)//ms級延時
{
unsigned int a,b;
for(a=ms;a>0;)
{
for(b=1000;b>0;)
{
b=b-1;
}
a--;
}
}
void ADC_int() //ADC初始化
{
ADC_CONTR=0X80;
P1ASF=0X01;
CLK_DIV=0X20;
ADC_RESL=0;
ADC_RES=0;
Delay_ms(10);
}
unsigned int ADC_Read()
{
unsigned int a=0;
ADC_CONTR = 0X88;
Delay_ms(1);
while(!(ADC_CONTR&0X10));
a=ADC_RES*256+ADC_RESL;
ADC_CONTR&=~0x10;
return a;
}
void DigDisplay()
{
uchar i;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
P2=DisplayData[i];//發送段碼
Delay_ms(1);//間隔一段時間掃描
P2=0x00;//消隱
}
}
void datapros()
{
uint adcnum;
adcnum=ADC_Read();
adcnum=adcnum*500/1024;
DisplayData[0]=smgduan[adcnum%1000%100%10/1]; //顯示個位
DisplayData[1]=smgduan[adcnum%1000%100/10]; //顯示十位
DisplayData[2]=smgduan[adcnum%1000/100]; //顯示百位
DisplayData[3]=smgduan[adcnum/1000]; //顯示千位
Delay_ms(10);
}
void main()
{
ADC_int(); //初始化ADC
while(1)
{
datapros(); //數碼管數據處理函數
DigDisplay(); //數碼管顯示函數
}
}
復制代碼
作者:
suuy79
時間:
2019-8-21 17:35
uint adcnum;
adcnum=ADC_Read();
adcnum=adcnum*500/1024; 數據超范圍啦
作者:
pql2438547
時間:
2019-8-21 18:48
suuy79 發表于 2019-8-21 17:35
uint adcnum;
adcnum=ADC_Read();
adcnum=adcnum*500/1024; 數據超范圍啦
但是我看別人程序的,他用串口發送給電腦的卻能正常顯示?
void adcsend()
{
unsigned char a[4],b;
send=send*500/1024; //電壓計算
a[0]=send%10+'0';
a[1]=send/10%10+'0';
a[2]='.';
a[3]=send/100+'0';
for(b=4;b>0;b--)
Uartsend(a[b-1]); //從4-1=[3]個位開始依次[2][1][0]發送給數據
}
復制代碼
作者:
angmall
時間:
2019-8-21 19:01
給你改了一下試試。
#include "reg52.h"
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
sfr T2H = 0xd6; //定時器2高8位
sfr T2L = 0xd7; //定時器2低8位
sfr AUXR = 0x8e; //輔助寄存器
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位結果
sfr ADC_RESL = 0xBE; //ADC低2位結果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
sfr CLK_DIV = 0x97;
sbit LSA=P3^2;
sbit LSB=P3^3;
sbit LSC=P3^4;
uchar code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
uchar DisplayData[8];
void Delay_ms(unsigned int ms)//ms級延時
{
unsigned int a,b;
for(a=ms;a>0;)
{
for(b=1000;b>0;)
{
b=b-1;
}
a--;
}
}
void ADC_int() //ADC初始化
{
ADC_CONTR=0X80;
P1ASF=0X01;
CLK_DIV=0X20;
ADC_RESL=0;
ADC_RES=0;
Delay_ms(10);
}
unsigned int ADC_Read()
{
unsigned int a=0;
ADC_CONTR = 0X88;
Delay_ms(1);
while(!(ADC_CONTR&0X10));
a=ADC_RES*256+ADC_RESL;
ADC_CONTR&=~0x10;
return a;
}
void DigDisplay()
{
uchar i;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
P2=DisplayData[i];//發送段碼
Delay_ms(1);//間隔一段時間掃描
P2=0x00;//消隱
}
}
void datapros()
{
ulong adcnum;
adcnum=ADC_Read();
adcnum=adcnum*500/1024;
DisplayData[0]=smgduan[adcnum%1000%100%10/1]; //顯示個位
DisplayData[1]=smgduan[adcnum%1000%100/10]; //顯示十位
DisplayData[2]=smgduan[adcnum%1000/100]; //顯示百位
DisplayData[3]=smgduan[adcnum/1000]; //顯示千位
Delay_ms(10);
}
void main()
{
ADC_int(); //初始化ADC
while(1)
{
datapros(); //數碼管數據處理函數
DigDisplay(); //數碼管顯示函數
}
}
復制代碼
作者:
107056
時間:
2019-8-21 22:20
先將數據化為強制類型轉換為整形,再將adcnum=adcnum*500/1024;里的500變為500.0,將結果轉換為浮點型應該就行了,這問題我也遇到過
作者:
aking991
時間:
2019-8-22 08:52
adcnum=adcnum*500/1024;關鍵就是這個算出來都是浮點數,所以當然不對,你應是定義為浮點數計算,然后再把結果數據放大為整數,然后再進行BCD解碼,這樣就OK了
作者:
CHUANGBIANZHE
時間:
2020-2-17 23:23
將“adcnum=adcnum*500/1024"改為“adcnum=adcnum*0.49”就OK了。
作者:
許你一世柔情
時間:
2020-3-26 18:57
根據樓上說的 你先乘0.49 然后乘100 得到49 *上前面的模擬值 然后模擬值會變成千位 你取千位和百位就可以避免浮點數運算
作者:
左岸的花會開
時間:
2020-3-31 10:58
suuy79 發表于 2019-8-21 17:35
uint adcnum;
adcnum=ADC_Read();
adcnum=adcnum*500/1024; 數據超范圍啦
沒有超吧
作者:
zhang32568
時間:
2024-4-17 08:54
adcnum=adcnum*500/1024; 要進行強制數據轉換
改成 adcnum=500*(unsigned long)adcnun/1024
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久草久草久草
|
免费av在线
|
亚洲欧美中文字幕
|
一区二区三区国产视频
|
黄色在线观看免费
|
国产欧美日韩视频
|
成人福利视频在线观看
|
国产精品久久久国产盗摄
|
国产无遮挡又黄又爽免费网站
|
国产一区二区三区在线观看视频
|
中文字幕一级片
|
欧美精品入口蜜桃
|
一本色道久久加勒比精品
|
欧美人与性动交α欧美精品
|
欧美日韩免费视频
|
国产精品久久久久久中文字
|
欧美一级特黄aaaaaa
|
伊人国产精品
|
亚洲乱码在线观看
|
四虎视频在线观看
|
欧美成人精品
|
天天操操操
|
成年人视频在线播放
|
欧美精品一区在线观看
|
中文字幕av一区二区三区谷原希美
|
欧美视频在线观看
|
国产精品久久久久久妇女6080
|
超碰在线观看免费版
|
精品国产乱码一区二区三
|
96久久
|
成人激情视频在线观看
|
欧美国产综合
|
欧美在线网址
|
日韩欧美色图
|
538精品视频
|
久久精品一区二区三区四区
|
日韩免费视频一区二区
|
91在线精品秘密一区二区
|
日韩精品视频免费
|
中文字幕+乱码+中文乱码91
|
成年人黄色网址
|