|
#include "H/Function_Init.H"
#include "math.h"
#include "H/TM1637.H"
unsigned char code CODE[10]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
unsigned char code number[12] = {0xFD,0x51,0xBB,0xAF,0x67,0xCF,0xDF,0xA5,0xFF,0xEF,0x20,0x76};
//0 1 2 3 4 5 6 7 8 9 LED燈 H
unsigned char code time[10] = {0xFD,0x51,0xBB,0xAF,0x67,0xCF,0xDF,0xA5,0xFF,0xEF};
//0 1 2 3 4 5 6 7 8 9
uint8_t data ucRunStatus = 0;//0表示待機(jī)狀態(tài),1表示進(jìn)入焦度調(diào)整模式
uint8_t data program; //焦度模式選擇
uint8_t data mode_3s_flag; //焦度模式3s不操作標(biāo)志位
uint16_t data mode_3s_time; //焦度模式3s累計(jì)時(shí)間
uint8_t data mode_last_value; //上次焦度模式的值
uint8_t data mode_value; //焦度模式的值
uint8_t data digital_tube_flash;
uint8_t data digital_tube_flashtime;
uint8_t key_pressdown_total = 0; //按鍵按下總數(shù)
uint16_t time_setting; //時(shí)間設(shè)定
//float T_c=0.0; //溫度值
// 定義常量
#define R_FIXED 1000.0 // 固定電阻值1kΩ
#define B_CONST 4537.0 // NTC的B常數(shù)
#define T0 373.15 // 100℃轉(zhuǎn)換為開(kāi)爾文
#define R0 1000.0 // NTC在25℃時(shí)的電阻值1kΩ
#define clk P20
#define dio P05
#define key_press P25
#define Time_Max 945
#define Time_Min 0
unsigned int ADCValue = 0x0000;
unsigned int tmpValue;
bit AdcFlag = 0;
/***********ADC采樣頻率選擇*************/
enum ADCFreq {F32=0,F24,F16,F12,F8,F6,F4,F3};
/***********ADC采樣口選擇*************/
#if (IC_MODEL == SC92F7413)
enum Channel {AIN0=0,AIN1,AIN2,AIN3,AIN4,AIN5,AIN6,AIN7,AIN8,AIN9,VDD4=31};
#endif
#if (IC_MODEL == SC92F7412)
enum Channel {AIN2=2,AIN3,AIN4,AIN5,AIN8=8,AIN9,VDD4=31};
#endif
#if (IC_MODEL == SC92F7411)
enum Channel {AIN2=2,AIN3,AIN4,AIN8=8,AIN9,VDD4=31};
#endif
/********************延時(shí)函數(shù),延時(shí)nms******************/
void delay_nms(unsigned int n)
{
unsigned int i;
while(n--)
for(i=0;i<550;i++);
}
///=======================================
void Delay_us(unsigned int i) //nus 延時(shí)
{
for(;i>0;i--)
_nop_();
}
/*
函數(shù)功能:IIC開(kāi)始信號(hào)
參數(shù):無(wú)
返回值:無(wú)
備注:無(wú)
*/
void I2CStart(void)
{
clk = 1;
dio = 1;
Delay_us(2);
dio = 0;
}
/*
函數(shù)功能:IIC應(yīng)答信號(hào)
參數(shù):無(wú)
返回值:無(wú)
備注:無(wú)
*/
void I2Cask(void)
{
clk = 0;
Delay_us(5); //在第八個(gè)時(shí)鐘下降沿之后延時(shí) 5us,開(kāi)始判斷 ACK 信號(hào)
while(dio);
clk = 1;
Delay_us(2);
clk=0;
}
///========================================
/*
函數(shù)功能:IIC停止信號(hào)
參數(shù):無(wú)
返回值:無(wú)
備注:無(wú)
*/
void I2CStop(void)
{
clk = 0;
Delay_us(2);
dio = 0;
Delay_us(2);
clk = 1;
Delay_us(2);
dio = 1;
}
/*
函數(shù)功能:寫一個(gè)字節(jié)
參數(shù):無(wú)
返回值:無(wú)
備注:無(wú)
*/
void I2CWrByte(unsigned char oneByte) //
{
unsigned char i;
for(i=0;i<8;i++)
{
clk = 0;
if(oneByte&0x01) //低位在前
{
dio = 1;
}
else
{
dio = 0;
}
Delay_us(3);
oneByte=oneByte>>1;
clk=1;
Delay_us(3);
}
}
/*
函數(shù)功能:自動(dòng)地址加一模式
參數(shù):無(wú)
返回值:無(wú)
備注:無(wú)
*/
void SmgDisplay(void) //寫顯示寄存器
{
unsigned char i;
I2CStart();
I2CWrByte(0x40); // 40H 地址自動(dòng)加 1 模式,44H 固定地址模式,本程序采
I2Cask();
I2CStop();
I2CStart();
I2CWrByte(0xc0); //設(shè)置首地址,
I2Cask();
for(i=0;i<4;i++) //地址自加,不必每次都寫地址
{
I2CWrByte(0x00); //送數(shù)據(jù)
I2Cask();
}
I2CStop();
I2CStart();
I2CWrByte(0x8f); //開(kāi)顯示 ,最大亮度
I2Cask();
I2CStop();
}
/*
函數(shù)功能:顯示函數(shù),固定地址寫數(shù)據(jù)
參數(shù):無(wú)
返回值:無(wú)
備注:無(wú)
*/
void disp(unsigned char add, unsigned char value)
{
I2CStart();
I2CWrByte(0x44); //數(shù)據(jù)命令設(shè)置:固定地址,寫數(shù)據(jù)到顯示寄存器
I2Cask();
I2CStop();
I2CStart();
I2CWrByte(add); //地址命令設(shè)置:寫入add對(duì)應(yīng)地址
I2Cask();
I2CWrByte(number[value]); //給add地址寫數(shù)據(jù)
I2Cask();
I2CStop();
I2CStart();
I2CWrByte(0x8C); //顯示控制命令:開(kāi)顯示,脈沖寬度為11/16.
I2Cask();
I2CStop();
}
/*****************************************************
*函數(shù)名稱:void ADC_Init(uint Channel,uchar ADCFreq)
*函數(shù)功能:ADC初始化
*入口參數(shù):void
*出口參數(shù):void
*****************************************************/
void ADC_Init(uint Channel)
{
ADCCON = 0X80|Channel; //開(kāi)啟ADC,ADC采樣頻率為3M ,選擇Channel位ADC采樣口
if(Channel<8)
{
ADCCFG0 = 1<<Channel; //設(shè)置Channel作為采樣口
}
else
{
ADCCFG1 = 1<<(Channel-8); //設(shè)置Channel作為采樣口
}
//ADCCFG2 = F8;
IE |= 0X40; //開(kāi)啟ADC中斷
//EA = 1;
}
/*****************************************************
*函數(shù)名稱:uint ADC_GetAverageValue(uint Channel,ADC_SamplesNum_TypeDef ADC_SamplesNum)
*函數(shù)功能:ADC采樣取平均值
*入口參數(shù):
ADC_SamplesNum_TypeDef ADC_SamplesNum:采樣次數(shù)
*出口參數(shù):
uint:多次采樣平均值
*****************************************************/
uint ADC_GetAverageValue(ADC_SamplesNum_TypeDef ADC_SamplesNum)
{
uchar tmpCnt;
uint tmpValueSum = 0, tmpValue;
uint tmpValue_Max = 0, tmpValue_Min = 0xFFFF;
for(tmpCnt = 0; tmpCnt < ADC_SamplesNum; tmpCnt ++)
{
EA = 0;
OPINX = 0xC1;
OPREG |= 0x10; //切換至二分頻
EA = 1;
ADCCON |= 0X40; //開(kāi)始一次ADC轉(zhuǎn)換
while(!AdcFlag); //等待ADC轉(zhuǎn)換完成
EA = 0;
OPINX = 0xC1;
OPREG &= 0xCF; //返回至一分頻
EA = 1;
AdcFlag = 0;
tmpValue=(ADCVH<<4)+(ADCVL>>4); //獲取單次轉(zhuǎn)換值
if(tmpValue > tmpValue_Max) //獲取多次轉(zhuǎn)換值中的最大值
tmpValue_Max = tmpValue;
if(tmpValue < tmpValue_Min) //獲取多次轉(zhuǎn)換值中的最小值
tmpValue_Min = tmpValue;
tmpValueSum += tmpValue; //累加多次轉(zhuǎn)換值的和
}
/* 通過(guò)硬件乘除法器來(lái)計(jì)算平均值 */
{
OPERCON |= 0X40;
/* 被除數(shù)為16位數(shù)據(jù) */
tmpValueSum -= (tmpValue_Max + tmpValue_Min);
EXA0 = tmpValueSum;
EXA1 = tmpValueSum >> 8;
EXBL = ADC_SamplesNum - 2; //除數(shù)為8位數(shù)據(jù)
OPERCON |= 0x80; //開(kāi)始除法計(jì)算
while(OPERCON & 0x80); //等待計(jì)算完畢
//獲取商
tmpValue = (uint)EXA0;
tmpValue |= EXA1 << 8;
}
return tmpValue; //返回平均值
}
///*
//函數(shù)功能:LED燈全滅
//參數(shù):無(wú)
//返回值:無(wú)
//備注:無(wú)
//*/
void Display_OFF(void)
{
I2CStart();
I2CWrByte(0x80);
I2CStop();
}
uint32_t code ntc_r[100]=
{
//180°~ 189°
1548,1514,1480,1447,1414,1383,1353,1323,1294,1266,
//190°~199°
1239,1212,1186,1160,1136,1112,1088,1065,1043,1021,
//200°~209°
1000,978,957,937,917,897,878,860,841,824,
//210~219°
807,790,773,758,742,727,712,698,683,670,
//220°~229°
656,643,630,618,606,594,582,571,560,549,
};
float calculate_temperature(float voltage) {
float R_ntc, T;
float V_supply = 5; // 電源電壓3.3V
// 計(jì)算NTC電阻值
R_ntc = R_FIXED * (V_supply / voltage - 1);
// 計(jì)算溫度(開(kāi)爾文)
T = 1 / (1 / T0 + log(R_ntc / R0) / B_CONST);
// 轉(zhuǎn)換為攝氏度
T = T - 273.15;
return T;
}
uint8_t b;
//void digital(uint8_t c)
//{
//
// disp(0xc0,c/100);
// disp(0xc1,c/10%10);
// disp(0xc2,c%10);
//}
///==============================================
void main(void)
{
uint8_t a;
ADC_Init(AIN2);
IO_Init(); //初始化
Timer_Init();
SmgDisplay(); //開(kāi)機(jī)時(shí)先全滅,不加這條會(huì)亂顯示
while(1)
{
if(ubTime100mS)
{
ubTime100mS =0;
a = ADC_GetAverageValue();
//b = calculate_temperature(a);
disp(0xc0,a/100);
disp(0xc1,a/10%10);
disp(0xc2,a%10);
}
}
}
請(qǐng)大伙幫我看看,這個(gè)是賽元微的芯片,SC92F7411
|
|