基于8051F350的AD转换显示存储程序.docx
《基于8051F350的AD转换显示存储程序.docx》由会员分享,可在线阅读,更多相关《基于8051F350的AD转换显示存储程序.docx(28页珍藏版)》请在冰豆网上搜索。
基于8051F350的AD转换显示存储程序
#include
#include
#include
//-----------------------------------------------------------------------------
//16-bitSFRDefinitionsfor'F35x
//-----------------------------------------------------------------------------
/*
需求:
1、AD转换,24位精度:
AIN0.0
2、四个按键:
K1=P1^4,K2=P1^5,K3=P1^6,K=P1^7
3、1602液晶屏显示AD值:
LCD1602_RS=P0^6,
LCD1602_EN=P0^7,
DB4=P1^0,DB0=
DB5=P1^1,
DB6=P1^2,
DB7=P1^3
4、存储(24C02):
SDA=P0^0,SCL=P0^1
函数:
1、voidmain(void)//主函数
{
while
(1)
{
//连续不间断地得到AD值
ADZ=(AD值);
}
}
2、voidKeyScan(void)
{
if(K1==0)
{
K1OK=1;
}
}
3、voidT2_ISR(void)interrupt5
{
//定时器,定时扫描按键,当有按键按下时,显示ADZ
TF2H=0;
KeyScan();
if(K1OK==1)
{
K1OK=0;
//LCD1602第一行显示字母“ADZ”,第二行显示数字ADZ,24C02存储此值
}
}
*/
/*****
1602高四位
LCD1602_RS=P0^6,
LCD1602_EN=P0^7,
DB4=P1^0,
DB5=P1^1,
DB6=P1^2,
DB7=P1^3
AD转换,24位精度:
AIN0.0,Verf+接100K可调电阻测试,满量程2500mv
四个按键:
K1=P1^4,K2=P1^5,K3=P1^6,K=P1^7
存储(24C02):
SDA=P0^0,SCL=P0^1(和T2扫描按键有冲突,应该实时存储)
*****/
/////////////Routines
sfr16ADC0DEC=0x9A;//ADC0DecimationRatioRegister
sfr16TMR3RL=0x92;//Timer3reloadregisters
sfr16TMR3=0x94;//Timer3counterregisters
sfr16TMR2RL=0xCA;//Timer2ReloadRegister
sfr16TMR2=0xCC;//Timer2Register
sbitSDA=P0^0;//SMBusonP0.0
sbitSCL=P0^1;//andP0.1
sbitK1=P1^4;//四个按键
sbitK2=P1^5;
sbitK3=P1^6;
sbitK4=P1^7;
//-----------------------------------------------------------------------------
//GlobalCONSTANTS
//-----------------------------------------------------------------------------
//--------------------------------------------------------------------------------
#defineSYSCLK24500000//SYSCLKfrequencyinHz
#defineMDCLK2457600//ModulatorclockinHz(idealis
//(2.4576MHz)
#defineOWR20//DesiredOutputWordRateinHzADC0输出字速率,最大960
#defineBAUDRATE115200//BaudrateofUARTinbps
//------------------------------------------------------------------
#defineSMB_FREQUENCY50000//TargetSCLclockrate
//Thisexamplesupportsbetween10kHz
//and100kHz
#defineWRITE0x00//SMBusWRITEcommand
#defineREAD0x01//SMBusREADcommand
#defineEEPROM_ADDR0xA0//Deviceaddressforslavetarget
//Note:
Thisaddressisspecified
//intheMicrochip24LC02B
//datasheet.
//SMBusBufferSize
#defineSMB_BUFF_SIZE0x08//Definesthemaximumnumberofbytes
//thatcanbesentorreceivedina
//singletransfer
//Statusvector-top4bitsonly
#defineSMB_MTSTA0xE0//(MT)starttransmitted
#defineSMB_MTDB0xC0//(MT)databytetransmitted
#defineSMB_MRDB0x80//(MR)databytereceived
//-----------------------------------------------------
//----------------------------------------------------------------定时器2常量
#defineTOGGLE_RATE1000//每50ms检测按键1次
#defineTIMER_TICKS_PER_MSSYSCLK/8/1000//定时器每ms触发扫描次
#defineAUX1TIMER_TICKS_PER_MS*TOGGLE_RATE
#defineAUX2-AUX1
#defineTIMER2_RELOADAUX2//ReloadvalueforTimer2
//-------------------------------------------------------------
#defineucharunsignedchar
#defineuintunsignedint
//---------------------------------------------------------------------------------
sbitlcdrs=P0^6;//数据/命令选择端,低电平为指令,高电平为数?
sbitlcden=P0^7;
//---------------------------------------------------------------------------------------------
ucharD1,D2,D3,D4,D5,D6,D7,D8;
uchar*pSMB_DATA_IN;//GlobalpointerforSMBusdata
//Allreceivedataiswrittenhere
ucharSMB_SINGLEBYTE_OUT;//Globalholderforsinglebytewrites.
uchar*pSMB_DATA_OUT;//GlobalpointerforSMBusdata.
//Alltransmitdataisreadfromhere
ucharSMB_DATA_LEN;//Globalholderfornumberofbytes
//tosendorreceiveinthecurrent
//SMBustransfer.
ucharWORD_ADDR;//GlobalholderfortheEEPROMword
//addressthatwillbeaccessedin
//thenexttransfer
ucharTARGET;//TargetSMBusslaveaddress
bitSMB_BUSY=0;//Softwareflagtoindicatewhenthe
//EEPROM_ByteRead()or
//EEPROM_ByteWrite()
//functionshaveclaimedtheSMBus
bitSMB_RW;//Softwareflagtoindicatethe
//directionofthecurrenttransfer
bitSMB_SENDWORDADDR;//Whenset,thisflagcausestheISR
//tosendthe8-bit
//aftersendingtheslaveaddress.
bitSMB_RANDOMREAD;//Whenset,thisflagcausestheISR
//tosendaSTARTsignalaftersending
//thewordaddress.
//Forthe24LC02BEEPROM,arandomread
//(areadfromaparticularaddressin
//memory)startsasawritethen
//changestoareadaftertherepeated
//startissent.TheISRhandlesthis
//switchoverifthe
//bitisset.
bitSMB_ACKPOLL;//Whenset,thisflagcausestheISR
//tosendarepeatedSTARTuntilthe
//slavehasacknowledgeditsaddress
staticucharK1OK,K2OK,K3OK,K4OK;
staticucharge,shi,bai,qian;
staticunsignedlongADC_OutputVal;//得到的份数
staticunsignedlongaccumulator=0;//ADC累积测量N次值的和
staticuintmeasurements=0;//ADC测量的次数
staticunsignedlongresult=0;
uinti,k;
ucharnum;
ucharcodetable1[]="ADZ:
";
ucharcodetable2[]="testdata.";
//-----------------------------------------------------------------------------
//FunctionPROTOTYPES
//-----------------------------------------------------------------------------
voidOscillator_Init(void);
voidPort_Init(void);
voidUART0_Init(void);
voidADC0_Init(void);
voiddelay(uintx);
voidLcd_1602_init();
voidLcd_1602_write(ucharcom,date);
voidLcd_1602_write1();
voidSMBus_Init(void);
voidTimer0_Init(void);
voidTimer3_Init(void);
voidSMBus_ISR(void);
voidTimer2_Init(void);
voidKeyScan();
voidTimer3_ISR(void);
voidEEPROM_ByteWrite(unsignedcharaddr,unsignedchardat);
voidEEPROM_WriteArray(unsignedchardest_addr,unsignedchar*src_addr,
unsignedcharlen);
unsignedcharEEPROM_ByteRead(unsignedcharaddr);
voidEEPROM_ReadArray(unsignedchar*dest_addr,unsignedcharsrc_addr,
unsignedcharlen);
//-----------------------------------------------------------------------------
//MAINRoutine
//-----------------------------------------------------------------------------
voidmain(void)
{
charin_buff[11]={0};
PCA0MD&=~0x40;//WDTE=0(clearwatchdogtimer
//enable)
Oscillator_Init();//Initializesystemclock
while(!
SDA)
{
//Provideclockpulsestoallowtheslavetoadvanceout
//ofitscurrentstate.ThiswillallowittoreleaseSDA.
XBR1=0x40;//EnableCrossbar
SCL=0;//Drivetheclocklow
for(i=0;i<255;i++);//Holdtheclocklow
SCL=1;//Releasetheclock
while(!
SCL);//Waitforopen-drain
//clockoutputtorise
for(i=0;i<10;i++);//Holdtheclockhigh
XBR1=0x00;//DisableCrossbar
}
Port_Init();//InitializeCrossbarandGPIO
//UART0_Init();//InitializeUART0forprintf's
Lcd_1602_init();
ADC0_Init();//InitializeADC0
AD0INT=0;
ADC0MD=0x83;//Startcontinuousconversions
Timer0_Init();//ConfigureTimer0foruseasSMBus
Timer2_Init();//clocksource
Timer3_Init();//ConfigureTimer3forusewithSMBus
//lowtimeoutdetect
SMBus_Init();//ConfigureandenableSMBus
EIE1|=0x01;//EnabletheSMBusinterrupt
EA=1;//Enableglobalinterrupts
//加入按键测试-------------------
/*
EEPROM_WriteArray(0x50,table2,sizeof(table2));
EEPROM_ReadArray(in_buff,0x50,sizeof(in_buff));
while(K1==0)
{
voidLcd_1602_init();
delay(3);
for(i=0;i{
Lcd_1602_write(1,in_buff[i]);
delay(3);
}
}
//--------------------------
*/
while
(1){//Spinforever
}
}
//-----------------------------------------------------------------------------
//InitializationSubroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------
//1602程序部分
voidLcd_1602_init()
{
Lcd_1602_write(0,0x28);//0x28=00101000,将液晶设置为16*2显示,5*7点阵,4位数据口
delay(5);//
lcden=1;//
lcden=0;
Lcd_1602_write(0,0x28);//显示方式设置
Lcd_1602_write(0,0x0e);//设置开显示,不显示光标
Lcd_1602_write(0,0x06);//默认(0x06)写入新数据后光标右移屏幕不移动
Lcd_1602_write(0,0x01);//显示清0,数据指针清0
}
voidLcd_1602_write(ucharcom,date)
{
uchari;
uchartemp;
lcdrs=com;//将形参传给lcdrs
for(i=0;i<2;i++)//每次写四位,写完一个数据/命令(8位)需要两次
{
temp=date;
lcden=1;
P1=(P1&0xF0)|((temp&0xF0)>>4);//将date的高四位送入P1第四位,同时保持P1的高四位不变
//如果使用P1的低四位的话,则该处应该改为:
P1=(P1&0xf0)|((date>>4)&0x0f);
delay(3);//适当延时,数据稳定
lcden=0;//送入数据
date<<=4;//低四位左移到高四位
}
}
voidLcd_1602_write1(ucharcom,date)
{
uchari;
uchartemp;
lcdrs=com;//将形参传给lcdrs
for(i=0;i<2;i++)//每次写四位,写完一个数据/命令(8位)需要两次
{
temp=date;
lcden=1;
P1=(P1&0xF0)|((temp&0xF0)>>4);//将date的高四位送入P1第四位,同时保持P1的高四位不变
//如果使用P1的低四位的话,则该处应该改为:
P1=(P1&0xf0)|((date>>4)&0x0f);
delay(3);//适当延时,数据稳定
lcden=0;//送入数据
date<<=4;//低四位左移到高四位
}
}
voiddelay(uintx)//延时x毫秒
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//---------------------------------------------------------------------------
voidOscillator_Init(void)
{
OSCICN=0x83;//配置内部振荡器,不分频
RSTSRC=0x04;//Enablemissingclockdetector
}
//-----------------------------------------------------------------------------
//Port_Init
//-----------------------------------------------------------------------------
//
//ReturnValue:
None
//Parameters:
None
//
//ThisfunctioninitializestheGPIOandtheCrossbar初始化GPI0和交叉开关
//
//Pinout:
//
//P0.4-UARTTX(digital,push-pull)
//P0.5-UARTRX(digital,open-drain)
//
//AIN0.2-ADC0input
//
//-----------------------------------------------------------------------------
voidPort_Init(void)
{
XBR1=0x40;//弱上拉使能,交叉开关使能。
P0MDOUT|=0xC0;//P0.6P