|
111.png (113.91 KB, 下載次數(shù): 70)
下載附件
2016-7-2 16:43 上傳
#include "p18cxxx.h" //頭文件
#include "delays.h"
#include "SEG.h"
#define uchar unsigned char
#define uint unsigned int
#define uch unsigned char //給unsigned char起別名 uch
# define DQ LATAbits.LATA0 //定義18B20數(shù)據(jù)端口
# define DQ_DIR TRISAbits.TRISA0 //定義18B20D口方向寄存器
# define DQ_HIGH() DQ =1 ; DQ_DIR =1 //設(shè)置數(shù)據(jù)口為輸入
# define DQ_LOW() DQ_DIR = 0 ;DQ = 0 //設(shè)置數(shù)據(jù)口為輸出
unsigned char TLV=0 ; //采集到的溫度高8位
unsigned char THV=0; //采集到的溫度低8位
unsigned char TZ=0; //轉(zhuǎn)換后的溫度值整數(shù)部分
unsigned char TX=0; //轉(zhuǎn)換后的溫度值小數(shù)部分
unsigned int wd; //轉(zhuǎn)換后的溫度值BCD碼形式
unsigned char shi; //整數(shù)十位
unsigned char ge; //整數(shù)個(gè)位
unsigned char shifen; //十分位
unsigned char baifen; //百分位
unsigned char qianfen; //千分位
unsigned char wanfen; //萬分位
#define TMR0HLOAD 0xf6 //4MHZ 2.5mS
#define TMR0LLOAD 0x4D
unsigned char TickClock = 0; //系統(tǒng)時(shí)基
#define SCLK LATBbits.LATB0 //74HC164時(shí)鐘
#define SDAT LATBbits.LATB1 //74HC164數(shù)據(jù)
const unsigned char SegCode[] = //圖型表
{
Bmp0Map,Bmp1Map,Bmp2Map,Bmp3Map,Bmp4Map,Bmp5Map,
Bmp6Map,Bmp7Map,Bmp8Map,Bmp9Map,BmpAMap,BmpBMap,
BmpCMap,BmpDMap,BmpEMap,BmpFMap
};
const unsigned char SegCS[6] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF}; //顯示片選
unsigned char SegBuf[6] = {BmpPMap,Bmp1Map,BmpCMap,Bmp1Map,Bmp8Map,BmpFMap}; //顯示緩沖
//-------------------------------------------------------------------------------
// 數(shù)碼管顯示驅(qū)動(dòng)
//-------------------------------------------------------------------------------
void SegDisplay(void)
{
static unsigned char i = 0;
unsigned char j;
unsigned char tep;
tep = SegCS; //片選輸出
for(j=0;j<8;j++) //8位
{
if(tep&0x80) SDAT = 1;
else SDAT = 0;
SCLK = 1;
SCLK = 0;
tep = tep<< 1;
}
tep = SegBuf; //數(shù)據(jù)輸出
for(j=0;j<8;j++) //8位
{
if(tep&0x80) SDAT = 1;
else SDAT = 0;
SCLK = 1;
SCLK = 0;
tep = tep<< 1;
}
if(i < 5) i ++; //掃描6位
else i = 0;
}
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
// ADC采集程序
//-------------------------------------------------------------------------------
unsigned int SampleADValue[8]; // 8次采樣
unsigned int AvgADValue = 0; // AD采樣平均值
unsigned char ADConverStep = 0; // AD采樣頻步
void GET_ADValue(void)
{
unsigned char i;
unsigned int ConverValue;
do
{
}while(ADCON0bits.GO_DONE); //等待轉(zhuǎn)換完成
ConverValue = ADRESH; //處理10位結(jié)果
ConverValue = (ConverValue << 8) + ADRESL;
SampleADValue[ADConverStep] = ConverValue;
if (ADConverStep == 7)
{
ConverValue = 0;
for (i = 0; i < 8 ; i++)
{
ConverValue += SampleADValue;
}
AvgADValue = ConverValue >> 3;
ADConverStep = 0;
}
else
{
ADConverStep++;
}
}
//-------------------------------------------------------------------------------
// TMR1定時(shí)器初始化
//-------------------------------------------------------------------------------
void TMR1_Init(void)
{
TMR1H = 0xF0; //4mS 4MHz
TMR1L = 0x98;
T1CONbits.RD16 = 1; //16位定時(shí)方式
T1CONbits.TMR1CS = 0; //內(nèi)部FOSC/4
PIE1bits.TMR1IE = 1; //T1中斷 ON
}
//-------------------------------------------------------------------------------
// ADC初始化
//-------------------------------------------------------------------------------
void ADC_Init(void) // ADC 初始化
{
ADCON0 = 0b00000001; // ADC模塊使能
ADCON1 = 0b00001110; // AN0 ADC輸入
ADCON2 = 0b10111111; // 右對(duì)齊 FRC
}
//-------------------------------------------------------------------------------
// 高優(yōu)先級(jí)中斷向量
//-------------------------------------------------------------------------------
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh(void)
{
_asm
goto Interrupt_High //跳到中斷程
_endasm
}
//-------------------------------------------------------------------------------
// 高優(yōu)先級(jí)中斷服務(wù)程序
//-------------------------------------------------------------------------------
#pragma interrupt Interrupt_High
void Interrupt_High(void)
{
if(PIR1bits.TMR1IF) //T1中斷
{
PIR1bits.TMR1IF = 0; //清除標(biāo)志位
TMR1H = 0xF0; //4MS
TMR1L = 0x98;
SegDisplay(); //掃描顯示
TickClock = 1; //置位
}
if(PIR1bits.RCIF) // 接收中斷
{
PIR1bits.RCIF = 0;
TXREG = RCREG; // 將收到的數(shù)據(jù)發(fā)出
if(RCSTAbits.OERR) // 接收溢出錯(cuò)誤處理
{
RCSTAbits.CREN = 0;
RCSTAbits.CREN = 1;
}
}
}
//-------------------------------------------------------------------------------
// 計(jì)算溫度值
//-------------------------------------------------------------------------------
int GET_TempValue(unsigned int ADCValue)
{
ADCValue = (32*ADCValue)/10; // y = (3300/1024)* x
if(ADCValue >500) ADCValue = (ADCValue - 500); //零上 500mV時(shí) 零度
else ADCValue = (500 - ADCValue); //零下
return ADCValue;
}
void initled()//初始化數(shù)碼管
{
SegBuf[0] = Bmp0Map; // "T"
SegBuf[1] = Bmp0Map; // "P"
SegBuf[2] = Bmp0Map; //千位
SegBuf[3] = Bmp0Map;//百位
SegBuf[4] = Bmp0Map;
SegBuf[5] = Bmp0Map;
}
//-------------------------------------------------------------------------------
// 數(shù)碼管分段顯示函數(shù)
//-------------------------------------------------------------------------------
void LEDisplay(unsigned int ADValue)
{
SegBuf[0] = Bmp0Map; // "T"
SegBuf[1] = Bmp0Map; // "P"
SegBuf[2] = SegCode[ADValue/1000]; //千位
SegBuf[3] = SegCode[ADValue%1000/100];//百位
SegBuf[4] = SegCode[ADValue%100/10]|Smg_dp; //十位 有小數(shù)點(diǎn)
SegBuf[5] = SegCode[ADValue%10]; //個(gè)位
}
//-------------------------------------------------------------------------------
// 主程序部分
//-------------------------------------------------------------------------------
void main(void)
{
unsigned int SystemTick = 0; // 串口發(fā)數(shù)據(jù)定時(shí)
TRISB = 0b11111100; //RB0 RB1 輸出
TMR1_Init(); //定時(shí)器1初始化
ADC_Init(); //ADC初始化
INTCONbits.PEIE = 1; //外設(shè)中斷允許
INTCONbits.GIE = 1; //總中斷允許
T1CONbits.TMR1ON= 1; //使能T1
initled();
while(1)
{
if(TickClock) //采集AD值
{
TickClock = 0;
ADCON0bits.GO_DONE = 1;
SystemTick ++;
GET_ADValue();
}
if(SystemTick > 300) //發(fā)送1次AD采樣值
{
SystemTick = 0;
AvgADValue = GET_TempValue(AvgADValue); //獲取溫度值
LEDisplay(AvgADValue); //顯示溫度值
}
}
}
//-------------------------------------------------------------------------------
我想把數(shù)碼管顯示和定時(shí)器分離,搞74HC146清楚數(shù)碼管到底怎么驅(qū)動(dòng)的。或者哪位大神幫忙注釋下,
|
|