標(biāo)題:
單片機(jī)多路電壓采集,液晶顯示,程序怎么加按鍵?
[打印本頁]
作者:
jhgfkhjlk
時間:
2017-12-31 11:13
標(biāo)題:
單片機(jī)多路電壓采集,液晶顯示,程序怎么加按鍵?
多路電壓采集,液晶顯示的程序有了,但是不知道怎么加按鍵。就是用按鍵選擇不同的通道顯示。源程序我放了主函數(shù)在這里了,里面調(diào)用的1602和I2C我沒放哦,應(yīng)該不需要的。請各位大佬幫幫忙,謝謝大家了!
#include <reg52.h>
bit flag300ms = 1; //300ms定時標(biāo)志
unsigned char T0RH = 0; //T0重載值的高字節(jié)
unsigned char T0RL = 0; //T0重載值的低字節(jié)
void ConfigTimer0(unsigned int ms);
unsigned char GetADCValue(unsigned char chn);
void ValueToString(unsigned char *str, unsigned char val);
extern void I2CStart();
extern void I2CStop();
extern unsigned char I2CReadACK();
extern unsigned char I2CReadNAK();
extern bit I2CWrite(unsigned char dat);
extern void InitLcd1602(l);
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void main()
{
unsigned char val;
unsigned char str[10];
EA = 1; //開總中斷
ConfigTimer0(10); //配置T0定時10ms
InitLcd1602(); //初始化液晶
LcdShowStr(0, 0, "AIN0 AIN1 AIN3"); //顯示通道指示
while (1)
{
if (flag300ms)
{
flag300ms = 0;
//顯示通道0的電壓
val = GetADCValue(0); //獲取ADC通道0的轉(zhuǎn)換值
ValueToString(str, val); //轉(zhuǎn)為字符串格式的電壓值
LcdShowStr(0, 1, str); //顯示到液晶上
//顯示通道1的電壓
val = GetADCValue(1);
ValueToString(str, val);
LcdShowStr(6, 1, str);
//顯示通道3的電壓
val = GetADCValue(3);
ValueToString(str, val);
LcdShowStr(12, 1, str);
}
}
}
/* 讀取當(dāng)前的ADC轉(zhuǎn)換值,chn-ADC通道號0~3 */
unsigned char GetADCValue(unsigned char chn)
{
unsigned char val;
I2CStart();
if (!I2CWrite(0x48<<1)) //尋址PCF8591,如未應(yīng)答,則停止操作并返回0
{
I2CStop();
return 0;
}
I2CWrite(0x60|chn); //寫入控制字節(jié),選擇轉(zhuǎn)換通道
I2CStart();
I2CWrite((0x48<<1)|0x01); //尋址PCF8591,指定后續(xù)為讀操作
I2CReadACK(); //先空讀一個字節(jié),提供采樣轉(zhuǎn)換時間
val = I2CReadNAK(); //讀取剛剛轉(zhuǎn)換完的值
I2CStop();
return val;
}
/* ADC轉(zhuǎn)換值轉(zhuǎn)為實(shí)際電壓值的字符串形式,str-字符串指針,val-AD轉(zhuǎn)換值 */
void ValueToString(unsigned char *str, unsigned char val)
{
//電壓值=轉(zhuǎn)換結(jié)果*2.5V/255,式中的25隱含了一位十進(jìn)制小數(shù)
val = (val*25) / 255;
str[0] = (val/10) + '0'; //整數(shù)位字符
str[1] = '.'; //小數(shù)點(diǎn)
str[2] = (val%10) + '0'; //小數(shù)位字符
str[3] = 'V'; //電壓單位
str[4] = '\0'; //結(jié)束符
}
/* 配置并啟動T0,ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //臨時變量
tmp = 11059200 / 12; //定時器計(jì)數(shù)頻率
tmp = (tmp * ms) / 1000; //計(jì)算所需的計(jì)數(shù)值
tmp = 65536 - tmp; //計(jì)算定時器重載值
tmp = tmp + 12; //補(bǔ)償中斷響應(yīng)延時造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié)
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0為模式1
TH0 = T0RH; //加載T0重載值
TL0 = T0RL;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
}
/* T0中斷服務(wù)函數(shù),執(zhí)行300ms定時 */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr300ms = 0;
TH0 = T0RH; //重新加載重載值
TL0 = T0RL;
tmr300ms++;
if (tmr300ms >= 30) //定時300ms
{
tmr300ms = 0;
flag300ms = 1;
}
}
復(fù)制代碼
作者:
HC6800-ES-V2.0
時間:
2017-12-31 20:09
我瀏覽了你的程序,我有個想法:
你是用定時器控制什么時間進(jìn)行ADC轉(zhuǎn)換的。
那么:
第一:你把這個定時器去掉,換上一個按鍵程序,控制一個變量如n,按1鍵n=1,按二鍵n=2......
第二:將主函數(shù)的一個條件讓三路ADC都轉(zhuǎn)換,換成三個用變量n取值不同,開始轉(zhuǎn)換不同路ADC的程序。
搞定了啊。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1