基于8051F350的AD转换显示存储程序文件.docx
- 文档编号:11099023
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:34
- 大小:23.78KB
基于8051F350的AD转换显示存储程序文件.docx
《基于8051F350的AD转换显示存储程序文件.docx》由会员分享,可在线阅读,更多相关《基于8051F350的AD转换显示存储程序文件.docx(34页珍藏版)》请在冰豆网上搜索。
基于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;//弱上拉使能,交叉开关使
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 8051 F350 AD 转换 显示 存储 程序 文件