?? mega48-1.c
字號:
#include <iom48v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define LED_NUM PORTD
#define LED_VALUE PORTB
#define key_set (PIND&0x02)
#define key_up (PIND&0x04)
#define key_down (PIND&0x08)
//Pc2、Pc3、Pc4為set,up,down鍵
/***********************溫度表 -50 度到 110 度*****************************/
const uint v_table[161]={
154,163,173,182,193,203,214,226,238,251, //-50---- -41
264,278,292,308,323,340,357,374,392,411, //-40---- -31
431,452,473,495,518,542,566,591,617,643, //-30---- -21
671,699,729,759,790,821,854,887,921,956, //-20---- -11
991,1028,1066,1104,1143,1182,1223,1264,1305,1347, //-10---- -1
1390,1433,1478,1522,1567,1613,1659,1705,1751,1798, //0---- 9
1845,1893,1940,1989,2036,2084,2132,2180,2228,2277, //10---- 19
2324,2372,2419,2467,2514,2561,2608,2654,2700,2746, //20---- 29
2791,2836,2880,2924,2967,3010,3053,3094,3135,3176, //30---- 39
3216,3255,3294,3332,3370,3407,3443,3478,3513,3548, //40---- 49
3581,3614,3647,3679,3710,3740,3770,3799,3828,3856, //50---- 59
3883,3910,3936,3962,3987,4011,4035,4058,4081,4103, //60---- 69
4125,4146,4167,4187,4207,4226,4244,4263,4280,4298, //70---- 79
4315,4331,4347,4363,4378,4393,4407,4422,4436,4449, //80---- 89
4462,4475,4487,4499,4511,4523,4534,4545,4556,4566, //90---- 99
4576,4586,4595,4605,4614,4623,4631,4640,4648,4656, //100--- 109
4664,} ; //110
/*****************************************************************************/
//共陰數碼管"0~9",
uchar dis_1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
//"熄滅","-"(負號),"-","_","Y","H","C"字段碼
uchar dis_2[7]={0x00,0x40,0x01,0x08,0x6e,0x76,0x39};
uchar Data[3]={0,0,0}; //顯示緩沖數據
uint v=0,dis_v,bh_v,dis_v_1;//實時溫度值, 顯示用的溫度值
uchar hot_warning[2]={0x00,0x00};//制熱模式限定值、制冷模式限定值
uchar cool_delay = 0; //壓縮機停機再開機延時時間
uchar setting_mode = 0; //溫度控制器模式,0x6e:制熱模式;0x76:制冷模式,
uchar Write_EEPROMData[5]={0,0,0,0,0};//設定數值寫到EEPROM數據緩沖
uchar Read_EEPROMData[5]={0,0,0,0,0};//從EEPROM讀設定數值到緩沖
//數據為:制熱模式限定值、制冷模式限定值、壓縮機延時開機時間、工作模式、溫度校正
uchar flag=1,nc_flag=0,no_flag=0; //負號標志位,傳感器斷線標志位,傳感器短路標志位
uchar CNT=0; //延時AD
uchar CNT_PV; //連續采樣8次后取平均
/*****************************************************************************/
//函數名 :DelayMs
//屬性 :私有
//功能 :延時
//輸入參數 :無
//輸出參數 :無
//返回值 :
//修改日期 :2007.1.2
//修改人 :mengxy
/*****************************************************************************/
void DelayMs(uint i)
{uint j;
for(;i!=0;i--)
{for (j=500;j!=0;j--) //延時1ms
{
//WDR();//復位看門狗
}
}
}
/*****************************************************************************/
//函數名 :WDT_off
//屬性 :私有
//功能 :關閉看門狗
//輸入參數 :無
//輸出參數 :無
//返回值 :
//修改日期 :2007.1.2
//修改人 :mengxy
/*****************************************************************************/
void WDT_off(void)
{
/* 置位 WDTOE 和WDE */
WDTCSR = (1<<WDCE) | (1<<WDE);
/* 關閉WDT */
WDTCSR = 0x00;
}
/*****************************************************************************/
//函數名 :port_init
//屬性 :私有
//功能 :機器初始化
//輸入參數 :無
//輸出參數 :無
//返回值 :
//修改日期 :
//修改人 :
/*****************************************************************************/
void port_init(void)
{ CLI(); //關中斷
MCUSR=0xf7; //關看門狗
WDT_off();
CLKPR = 0x80;
CLKPR = 0x00; //時鐘分頻因子為1
DDRB = 0xff; //數碼管段驅動
PORTB = 0xff;
//將PC0、PC1、PC2、PC3定義為輸入,不帶上拉電阻
DDRC=0x00; //
PORTC=0x00; // 將 PORT 置0,沒有上拉電阻
DDRD = 0x0f; //PD0.1.2 位驅動,PD5.6.7鍵盤輸入
PORTD = 0x0f;
}
/*****************************************************************************/
//函數名 :ceshi_led
//屬性 :私有
//功能 :機器初始化,測試數碼管,全亮
//輸入參數 :無
//輸出參數 :無
//返回值 :
//修改日期 :
//修改人 :
/*****************************************************************************/
void ceshi_led(void)
{
PORTD=0x07; //打開低三位 開機初始化畫面顯示
PORTB=0x00; //測試數碼管
DelayMs(500);
PORTB=0xff;
DelayMs(500);
}
/*****************************************************************************/
//函數名 :AdcConvert
//屬性 :私有
//功能 :開始AD轉換
//輸入參數 :無
//輸出參數 :無
//返回值 :
//修改日期 :2007.1.2
//修改人 :mengxy
/*****************************************************************************/
void get_adc_value(uchar adc_pin) //開始AD轉換,單次轉換
{
CLI();
ADMUX = (1<<REFS0)|(0<<REFS1)|adc_pin; //參考電壓源選擇AVCC
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
SEI(); //開中斷
{
ADCSRA |= (1<<ADSC); //開始AD
DelayMs(1);
//ADCSRA &= ~(1<<ADSC);
}
}
/*****************************************************************************/
//函數名 :adc_isr
//屬性 :中斷
//功能 :獲取AD轉換結果
//輸入參數 :無
//輸出參數 :無
//返回值 :
//修改日期 :2007.1.2
//修改人 :mengxy
/*****************************************************************************/
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr(void) //AD轉換 計算結果,以查表方便,獲取的數值直接查表
{ uint temp,temp1,temp2,temp3;
temp1 = (uint)ADCL;
temp2 = (uint)ADCH;
temp3=(temp2<<8)+temp1;
v = (49*temp3)/10;
ADCSRA = (1<<ADEN);
CLI();
}
/*****************************************************************************/
//函數名 :get_degree
//屬性 :私有
//功能 :查表
//輸入參數 :v
//輸出參數 :v
//返回值 :v
//修改日期 :2007.1.2
//修改人 :mengxy
/*****************************************************************************/
uint get_degree(void)
{
uchar x,y;
uint v_big,v_small,v_step;
if (v<100) /////傳感器斷線AD為0v
{
nc_flag=1;
}
if (v>4800) /////傳感器短路,AD為5v
{
no_flag=1;
}
if(v>100&v<4800) ///傳感器正常,斷線\短路標志為0
{
nc_flag=0;
no_flag=0;
}
for (x=0;x<161;x++) //查表 161個數據
{
if (v_table[x] >= v) // 找出電壓區域
{
v_big = v_table[x]; // 區域高段
v_small = v_table[x-1]; //區域低段
v_step = (v_big - v_small)/10; //把區域細分成10份
for (y=0;y<10;y++) // 細分比較
{
v_small += v_step;
if(v < v_small)
{bh_v=y;} //溫度變化值bh_v。
}
v=x;
if (x<=49) // 少于51為負溫度
{
v = 50-v; //加入負號標記
flag=0;
}
else
{
v =v-51; //0度修正
flag=1;
}
return v;
};
}
return v;
}
/*****************************************************************************/
//函數名 :JS_AD_display
//屬性 :私有
//功能 :AD數值的顯示
//輸入參數 :dis_v
//輸出參數 :Data[] 顯示緩沖區的數值
//返回值 :
//修改日期 :2007.1.3
//修改人 :mengxy
/*****************************************************************************/
void JS_AD_display(void)
{
uchar tempData[3];
tempData[2]=dis_v/100; //百位
tempData[1]=dis_v%100/10;//十位
tempData[0]=dis_v%10; //個位
Data[2]=dis_1[tempData[2]];
Data[1]=dis_1[tempData[1]];
Data[0]=dis_1[tempData[0]];
if(tempData[2]==0)
{Data[2]=0x00; //百位為0,不顯示
if(tempData[1]==0)
{Data[1]=0x00;} //十位也為零,不顯示
}
if(flag==0)
{
Data[2]=0x40; //負號標志為0,顯示負號
}
if(nc_flag==1)
{Data[2]=0x40;Data[1]=0x40;Data[0]=0x40;}//斷線顯示:---
if(no_flag==1)
{Data[2]=0x39;Data[1]=0x39;Data[0]=0x39;}//短路顯示:CCC
}
/*****************************************************************************/
//函數名 :AD_display
//屬性 :私有
//功能 :AD數值的顯示,顯示的時候,刷新AD 數值
//輸入參數 :Data[]
//輸出參數 :
//返回值 :
//修改日期 :2007.1.3
//修改人 :mengxy
/*****************************************************************************/
void AD_display(void)
{
uchar i,sel=0x01,ii=0;
uchar CNT1;
for(i=0;i<3;i++)
{
LED_NUM=sel; //打開相應的位
if((dis_v>=20)||(flag==0)) //超溫報警,低溫報警
{
LED_NUM|=0x08; //打開PD3
}
LED_VALUE=~Data[i]; //共陽數碼管,共陰的則~sel,Data[i]
DelayMs(1);
sel=sel<<1;
}
//////顯示的時候,刷新AD 數值
CNT++;
}
/*****************************************************************************/
//函數名 :pj_v
//屬性 :私有
//功能 :進行AD計算
//輸入參數 :CNT,get_adc_value(0);get_degree();
//輸出參數 :
//返回值 :
//修改日期 :2007.1.3
//修改人 :mengxy
/*****************************************************************************/
void pj_v(void)
{
if (CNT==100)
{
CNT=0;
//////////////////////////////////////
// CLI(); //關中斷
//ADMUX = (1<<REFS0); //AVCC, AREF 引腳外加濾波電容,
//ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
//ADEN置位即啟動ADC,ADIF: ADC 中斷標志,64分頻
//SEI(); //開中斷
////////////////////////////////////
get_adc_value(0); //進行ADC取樣,通道0
DelayMs(1); //延時,AD中斷
get_degree(); //查表
// if((bh_v>1)& (bh_en=1)) // 溫度變化超過0.5度并且bh_en置位,就傳遞
dis_v_1=dis_v; // 傳遞給顯示,精度整定時,bh_en=0,出廠時設置bh_en=1
dis_v=(v+dis_v_1)/2;//本次數值和上次數值平均
}
}
/*****************************************************************************/
//函數名 :main
//屬性 :私有
//功能 :主函數
//輸入參數 :port_init();Get_AD();JS_AD_display();AD_display();
//輸出參數 :
//返回值 :
//修改日期 :2007.1.3
//修改人 :mengxy
/*****************************************************************************/
void main(void)
{
port_init(); //初始化
ceshi_led(); //測試數碼管
while(1)
{
AD_display(); //顯示
pj_v();
JS_AD_display(); //對AD計算,獲取顯示數據
}
}
/*****************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -