@薄浩楠
這是數(shù)據(jù)采樣的程序#include#include#include#defineuintunsignedint#defineucharunsignedchar#defineADC_FLAG0X10#defineVCC220ucharcodeSMGduan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};//數(shù)碼管位選碼ucharcodeSMGwei[]={0xfe,0xfd,0xfb};unsignedcharpdatabufRxd[64];//接收字節(jié)緩沖區(qū)/***********************延時(shí)函數(shù)*******************************/voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=114;y>0;y--);}/************************采用器初始化******************************/voidInitADC(void){P1M1=0xff;//1^012開(kāi)啟高阻態(tài)P1M0=0x00;//其余端口當(dāng)普通端口使用P1ASF=0Xff;//P^1DC_VADC_RES=0;ADC_CONTR=0X80;//10000000開(kāi)電源,最低速delay(50);}/**************************采樣函數(shù)******************************/uintGetADC(ucharch){uintresult=0;ADC_CONTR=0x88|ch;//選擇通道開(kāi)始AD轉(zhuǎn)換e8ADC最快,88,ADC最慢_nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FLAG));//查詢ADC_FLOG是否置位1轉(zhuǎn)換結(jié)束ADC_CONTR&=!ADC_FLAG;//清除ADC中斷標(biāo)志result=ADC_RES;//(ADC_RES
這是終端做顯示,控制功能的程序
#include
#include "pic18.h" /* PIC18系列的頭文件 */
#define MAIN_Fosc 22118400L //定義主時(shí)鐘
#define e RC5 //LCD使能IO
#define rs RC3 //LCD寫數(shù)據(jù)或命令控制IO
#define rw RC4 //LCD讀寫控制IO
#define AT24C02_ADDR 0xa0 //AT24C02地址
#define PCF8591_ADDR 0x90 //PCF8591地址
#define VCC 500
unsigned char CXPOS; //列方向地址指針(用于CHARLCDPOS子程序)
unsigned char CYPOS; //行方向地址指針(用于CHARLCDPOS子程序)
unsigned char receive232[10]={0xfc,0xfc,3,4,5,6,7,8}; /* 接收數(shù)據(jù)數(shù)組 */
unsigned char send232[10]={0xfc,0xfc,3,4,5,6,7,8}; /* 發(fā)送數(shù)據(jù)數(shù)組 */
unsigned char receive_count=0; /* 接收數(shù)據(jù)個(gè)數(shù)計(jì)數(shù) */
unsigned char send_count=1; /* 發(fā)送數(shù)據(jù)個(gè)數(shù)計(jì)數(shù) */
unsigned char *pointer; /* 發(fā)送數(shù)據(jù)指針 */
unsigned char i; /* 程序中用到的循環(huán)變量 */
unsigned char SciReceiveFlag; /* =1,接收到8個(gè)數(shù)據(jù) */
unsigned char Send_Mode=1; /* 不為0,中斷方式發(fā)送;=0,非中斷方式發(fā)送 */
//#define key RC0
typedef unsigned char uchar;
typedef unsigned int uint;
//------變量定義
uchar nu[6]={34,06,52,44,66,66,} ;
uchar aa[11]; //數(shù)字量接收數(shù)組
uchar aa1[11]; //數(shù)字量溢出標(biāo)志位
uchar bc[9];uchar xc=0; //={34,06,52,44,66,66,44,66,66,}
uchar a=0; uchar bb=0;
char web[] = {"Ua"};
uchar U[] = {"****Voltage*****"};
uchar Uv[] = {"V"};
uchar Ua[] = {"Ua="};
uchar Ub[] = {"Ub="};
uchar Uc[] = {"Uc="};
int iu;
int result=0x38;
int Ucc=500;
int Scc=200;
int Icc=500;
int xz;
int pd;
void WriteDataLCD(unsigned char WDLCD)
{
PORTB = WDLCD;
RC3 = 1;
RC4 = 0;
RC5 = 0; //若晶振速度太高可以在這后加小的延時(shí)
RC5 = 0; //延時(shí)
RC3 = 1;
}*/
void sciinitial() /* 串行通訊初始化子程序 */
{
TXSTA=0x04; /* 選擇異步高速方式傳輸8位數(shù)據(jù) */
RCSTA=0x80; /* 允許串行口工作使能 */
TRISC=TRISC|0X80; /* :將RC7(RX)設(shè)置為輸入方式 */
TRISC=TRISC&0Xbf; /* RC6(TX)設(shè)置為輸出 */
SPBRG=143; /* 4M晶振且波特率為9600時(shí),SPBRG設(shè)置值為25 */
PIR1=0x00; /* 清中斷標(biāo)志 */
PIE1=PIE1|0x20; /* 允許串行通訊接口接收中斷使能 */
RCIP=0; /* 設(shè)置SCI接收中斷為低優(yōu)先級(jí)中斷 */
CREN=1; /* 允許串口連續(xù)接收數(shù)據(jù) */
if(0==Send_Mode) TXEN=1; /* Send_Mode=0,非中斷方式發(fā)送,串口發(fā)送數(shù)據(jù)使能 */
else /* Send_Mode=1,中斷方式發(fā)送 */
{
PIE1=PIE1|0x10; /* 允許中斷發(fā)送 */
TXIP=0; /* 發(fā)送低優(yōu)先級(jí)中斷 */
}
}
void interrupt low_priority LOW_ISR() /* 低優(yōu)先級(jí)中斷子程序 */
{
if(RCIF==1) /* RS232接收中斷 */
{
RCIF=0; /* 清中斷標(biāo)志 */
receive232[receive_count]=RCREG;
send232[receive_count]=RCREG; /* 接收數(shù)據(jù)存放到發(fā)送緩沖數(shù)組 */
receive_count++; /* 接收計(jì)數(shù)器加1 */
if(receive232[0]==0xfc&&receive232[1]==0xfc);//前兩位是否為0xfc
else {receive_count=0;return;}//不是則重新加載數(shù)據(jù)
if(receive_count==10) /* 如果已經(jīng)接收到8個(gè)數(shù)據(jù) */
{
receive_count=0; /* 接收計(jì)數(shù)器清0 */
SciReceiveFlag=1; /* 置接收到8個(gè)數(shù)據(jù)標(biāo)志 */
}
}
else if((0!=Send_Mode)&&(TXIF==1)) /* 中斷發(fā)送數(shù)據(jù)方式且為發(fā)送中斷 */
{
if(send_count==1) /* 已經(jīng)發(fā)送完8個(gè)數(shù) */
{
TXEN=0; /* 發(fā)送不使能 */
return;
}
else
{
TXREG=pd; /* 發(fā)送當(dāng)前應(yīng)發(fā)送數(shù)據(jù),發(fā)送指針加1 */
send_count++; /* 發(fā)送計(jì)數(shù)器加1 */
}
}
}
void init()
{
TRISC3=0;TRISB=0x00; TRISA=0xFF;
TRISC4=0; TRISC5=0;
PORTB=0x00;//LATA=0xFF;
RCSTA=0X90;
}
void UartInit(void)//初始化函數(shù)
{
INTCONbits.GIEL = 1; //使能外設(shè)中斷
}
void lcdwc(unsigned char c) //送控制字到液晶顯示控制器子程序
{
lcdwaitidle(); //HD44780液晶顯示控制器忙檢測(cè)
RC3=0; //RS=0 RW=0 E=高電平
RC4=0;
PORTB=c;
RC5=1;
RC5=0;
}
//-------------------------------------------------------------------------------
//子程序名稱:void lcdwd(unsigned char d).
//功能:送數(shù)據(jù)到液晶顯示控制器.
//修改日期:2009.08.12
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwd(unsigned char d) //送控制字到液晶顯示控制器子程序
{
lcdwaitidle(); //HD44780液晶顯示控制器忙檢測(cè)
RC3=1; //RS=1 RW=0 E=高電平
RC4=0;
PORTB=d;
RC5=1;
RC5=0;
}
//-------------------------------------------------------------------------------
//子程序名稱:unsigned char lcdrd(void).
//功能:讀數(shù)據(jù)到液晶顯示控制器.
//-------------------------------------------------------------------------------
unsigned char lcdrd(void) //讀數(shù)據(jù)子程序
{ unsigned char d;
lcdwaitidle(); //HD44780液晶顯示控制器忙檢測(cè)
PORTB=0xff;
RC3=1; //RS=1 RW=1 E=高電平
RC4=1;
RC5=1;
d=PORTB;
RC5=0;
return d;
}
//-------------------------------------------------------------------------------
//子程序名稱:void lcdwaitidle(void).
//功能:忙檢測(cè).
//-------------------------------------------------------------------------------
void lcdwaitidle(void) //忙檢測(cè)子程序
{ unsigned char i;
PORTB=0xff;
RC3=0; //RS=0 RW=1 E=高電平
RC4=1;
RC5=1;
for(i=0;i<20;i++)
if((PORTB&0x80) == 0) break; //D7=0 表示LCD控制器空閑,則退出檢測(cè)
RC5=0;
}
void Delay_Ms(unsigned int ms)
{
unsigned int i;
do{
i = MAIN_Fosc / 96000;
while(--i) ; //96T per loop
}while(--ms);
}
void delay()
{
int i;
for (i=0;i<5000;i++);
}
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
X&=0X0f; //X位置范圍(0到15)
Y&=0X03; //Y位置范圍(0到1)
if(Y==0) //(第一行)X: 第0----15個(gè)字符
lcdwc(X|0x80); // DDRAM: 0----0FH
else if (Y==1) //(第二行)X: 第0----15個(gè)字符
lcdwc(X|0xC0); // DDRAM: 40----4FH
else if (Y==2) //(第三行)X: 第0----15個(gè)字符
lcdwc(X|0x90); // DDRAM: 10----1FH
else //(第四行)X: 第0----15個(gè)字符
lcdwc(X|0xD0);
lcdwd(DData);
}