欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機多路電壓采集,液晶顯示,程序怎么加按鍵?
[打印本頁]
作者:
jhgfkhjlk
時間:
2017-12-31 11:13
標題:
單片機多路電壓采集,液晶顯示,程序怎么加按鍵?
多路電壓采集,液晶顯示的程序有了,但是不知道怎么加按鍵。就是用按鍵選擇不同的通道顯示。源程序我放了主函數在這里了,里面調用的1602和I2C我沒放哦,應該不需要的。請各位大佬幫幫忙,謝謝大家了!
#include <reg52.h>
bit flag300ms = 1; //300ms定時標志
unsigned char T0RH = 0; //T0重載值的高字節
unsigned char T0RL = 0; //T0重載值的低字節
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的轉換值
ValueToString(str, val); //轉為字符串格式的電壓值
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);
}
}
}
/* 讀取當前的ADC轉換值,chn-ADC通道號0~3 */
unsigned char GetADCValue(unsigned char chn)
{
unsigned char val;
I2CStart();
if (!I2CWrite(0x48<<1)) //尋址PCF8591,如未應答,則停止操作并返回0
{
I2CStop();
return 0;
}
I2CWrite(0x60|chn); //寫入控制字節,選擇轉換通道
I2CStart();
I2CWrite((0x48<<1)|0x01); //尋址PCF8591,指定后續為讀操作
I2CReadACK(); //先空讀一個字節,提供采樣轉換時間
val = I2CReadNAK(); //讀取剛剛轉換完的值
I2CStop();
return val;
}
/* ADC轉換值轉為實際電壓值的字符串形式,str-字符串指針,val-AD轉換值 */
void ValueToString(unsigned char *str, unsigned char val)
{
//電壓值=轉換結果*2.5V/255,式中的25隱含了一位十進制小數
val = (val*25) / 255;
str[0] = (val/10) + '0'; //整數位字符
str[1] = '.'; //小數點
str[2] = (val%10) + '0'; //小數位字符
str[3] = 'V'; //電壓單位
str[4] = '\0'; //結束符
}
/* 配置并啟動T0,ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //臨時變量
tmp = 11059200 / 12; //定時器計數頻率
tmp = (tmp * ms) / 1000; //計算所需的計數值
tmp = 65536 - tmp; //計算定時器重載值
tmp = tmp + 12; //補償中斷響應延時造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0為模式1
TH0 = T0RH; //加載T0重載值
TL0 = T0RL;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
}
/* T0中斷服務函數,執行300ms定時 */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr300ms = 0;
TH0 = T0RH; //重新加載重載值
TL0 = T0RL;
tmr300ms++;
if (tmr300ms >= 30) //定時300ms
{
tmr300ms = 0;
flag300ms = 1;
}
}
復制代碼
作者:
HC6800-ES-V2.0
時間:
2017-12-31 20:09
我瀏覽了你的程序,我有個想法:
你是用定時器控制什么時間進行ADC轉換的。
那么:
第一:你把這個定時器去掉,換上一個按鍵程序,控制一個變量如n,按1鍵n=1,按二鍵n=2......
第二:將主函數的一個條件讓三路ADC都轉換,換成三個用變量n取值不同,開始轉換不同路ADC的程序。
搞定了啊。
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1