MC96F8208现代芯片C语言程序.docx
《MC96F8208现代芯片C语言程序.docx》由会员分享,可在线阅读,更多相关《MC96F8208现代芯片C语言程序.docx(51页珍藏版)》请在冰豆网上搜索。
MC96F8208现代芯片C语言程序
//==============================================================================
//Project:
MC96F8208SDemoProgram
//Date:
2013.07.2
//Author:
Tom
//Device:
MC96F8208S(20SOP)
//Voltage:
5V
//Frequency:
internal8MHzRCoscillator
//ADCrange:
5V(Vdd)
//edittool:
KeiluVision4
//History:
/*
2013-07-21.ReferenceProgramStart
_________________________________________
0V-->1|VSSVDD|20<--5V
XOUT/BUZ<-->2|P37/XOUTDSDA/AN0/P00|19<--OCDinterface
XIN/LEDh<-->3|P36/XINDSCL/AN1/P01|18<--OCDinterface
LEDg<-->4|P35/EINT10/PWM0/T0OAN2/AVREF/EINT0/P02|17<--AD2input
RESETB/LEDf<-->5|P32/RESETBAN3/EINT1/P03|16<--AD3input
RXD/LEDe<-->6|P31/RXD/(SCL)AN8/BUZO/EINT11/P11|15<--COM1
TXD/LEDd<-->7|P30/TXD/(SDA)AN9/PWM1/EINT11/P12|14<--COM2
LEDc<-->8|P25/SCLAN10/PWM2/EINT12/P13|13-->PWM2
LEDb<-->9|P24/SDAAN11/MISO/P14|12<--COM3
LEDa<-->10|P16/AN13/SCKAN12/MOSI/P15|11<--COM4
-------------------------------------------
*/
//------------------------------------------------------------------------------
//Includefileandvariable
#include
#definefocus0
#include"Variable.h"
#include"Main.h"
//initialpart
voidDelay1ms(unsignedcharDelayCount)
{
unsignedchari,j;
for(i=0;i{for(j=0;j<250;j++){nop;}}}voidMCUInitialSetting(){//SystemClockSelect&builtinresetlevelselect#ifCRYSTALP3FSR=0xC0;//7=1:P37_XOUT,6=1:P36_XINSCCR=0x00;//INTRCOSC(fIRC)forsystemclockOSCCR=0x22;//externalOSCenablestart,INT-RC/2(8MHz)Delay1ms(100);//16msSCCR=0x01;//external4.194304MHzmainOSC(fxin)forSystemclockOSCCR=0x06;//internalRCOSCdisable,externalmainOSCenable#elseSCCR=0x00;//INTRCOSC(fIRC)forsystemclockOSCCR=0x20;//internalRCOSC8MHz#endifLVRCR=0x00;//builtinreset1.6Vset,LVRCR.0=0enable!!!//b7b6b5b4b3b2b1b0//AN3AN2DSCLDSDAP0IO=0x03;//----ininoutoutP0OD=0x03;//----PPPPODOD//0Push-pulloutput,1Open-drainoutputP0PU=0x03;//----offoffononP0=0x03;//----0011P03DB=0x00;//00P35DB---P03DBP02DB76=01:fx/4=1usnoisefiltering//ConfigureDebounce---DisableP0FSR=0x18;//00011000//b7b6b5b4b3b2b1b0//I/Ocom4com3PWM2com2com1P1IO=0xff;//-outoutoutoutoutout-P1OD=0x00;//-PPPPPPPPPPPP-P1PU=0x00;//-offoffoffoffoffoff-P1=0x36;//-011011-P12DB=0x00;//----P13DBP12DBP11DB-//ConfigureDebounce---DisableP1FSRH=0x00;//00P160P150P140//I/OPortP1FSRL=0x20;//0PWM20P120P1100//I/OPort//b7b6b5b4b3b2b1b0//I/OI/OP2IO=0x30;//--outout----P2OD=0x00;//--PPPP----P2PU=0x00;//--oFFoFF----P2=0x00;//--00----P2FSR=0x00;//------00//P25isI/O,P24isI/O//b7b6b5b4b3b2b1b0//BUZI/OI/OI/OI/OI/OP3IO=0xff;//OUTOUTout--outOUTOUTP3OD=0x00;//PPPPPP--PPPPPPP3PU=0x00;//offoffoff--offoFFoFFP3=0x00;//000--000//P3FSR=0xE1;//111--001EIPOL1=0x00;//ExtInt8fallingedgetriggerEIPOL0L=0x00;//ExtInt3~0PolarityRegisterLowEIPOL0H=0x00;//ExtInt7~4PolarityRegisterHighEIFLAG0=0x00;//ExtIntFlagRegister0EIFLAG1=0x00;//ExtIntFlagRegister1//b7b6b5b4b3b2b1b0IE=0x80;//(EA)-ExG0--Ex12Ex11Ex10IE1=0x00;//---(TX)(RX)I2CEx6Ex5IE2=0x0e;//--ExG1-T2(T1)T0T0VIE3=0x04;//---BITWDT(WT)SPIADC//AD寄存器初始化ADCCRH=0x07;//clock=fx/8,LSBsaveADCvalue,高8位AD使用低4位3:0,低8位AD全部使用7:0ADCCRL=0x90;//内部VDD作为参考T1_1s=0;T1_minute=0;T1_hour=0;Menu=0;Vpoc=1;EEPword=0;}//------------------------------------------------------------------------------//task:TimerandInterruptstart//------------------------------------------------------------------------------voidTimer_Start(){#ifCRYSTAL//externalOSC4.194304MHzT0CR=0x85;//PCS=4.194304MHz/8=524288Hz(1.9073486us),Timer0enableT0DR=0x83;//1.9073486usx131=249.862666usWTCR=0x81;//61.03515625uswatchtimer--mainosc4.194304MHz/256=16.384KHz(61.03515625us)WTDR=0xD2;//61.03515625usx82=5.00488msinterval//WT中断计算公式:Fwck=Fx/128=32768;WT频率=Fwck/2^14=2Hz;即每周期生产一个中断=500ms;T1CRH=0x80;//Timer1enableT1ADR=259;//15.258789usx260=3.9998msintervalT1CRL=0x40;//pcs=4.194304MHz/64=65.536KHz(15.258789us)T1CRH=0x81;//Timer1startT2CRH=0xb0;//Timer2enable,PWM2O是重复模式T2ADR=259;//15.258789usx260=3.9998msinterval频率周期为4msT2CRL=0x40;//pcs=4.194304MHz/64=65.536KHz(15.258789us)T2CRH=0xb1;//Timer2startBITCR=0x4E;//BIT=4.19MHz/128=32.768KHz(30.517578us)30.517578us*128=3.906msWDTDR=0xfa;//3.906x250=976.5mswatchdogrefreshcycleWDTCR=0xE0;//WDTenableandrefresh#else//internalRCOSC8MHzT0CR=0x85;//PCS=8MHz/8=1000000Hz(1us),Timer0enableT0DR=0xF9;//1usx250=250usWTCR=0x81;//32uswatchtimer--mainosc8MHz/256=31.25KHz(32us)WTDR=0xfc;//32*125=4ms溢出,清计数器//WT中断计算公式:Fwck=Fx/128=32768;WT频率=Fwck/2^14=2Hz;即每周期生产一个中断=500ms;T1CRH=0x80;//Timer1enableT1ADR=3999;//1usx4000=4msintervalT1CRL=0x60;//pcs=8MHz/8=1usT1CRH=0x81;//Timer1startT2CRH=0xb0;//Timer2enable,PWM2O是重复模式//T2ADR=3999;//1usx4000=4msinterval频率周期为4msT2ADR=19;//1usx20=20usinterval频率周期为20usT2CRL=0x60;//pcs=8MHz/8=1usT2CRH=0xb1;//Timer2startBITCR=0x4E;//BIT=8MHz/128=62.5KHz(16us)16us*128=2.048msWDTDR=0xfa;//2.048x250=512mswatchdogrefreshcycleWDTCR=0xE0;//WDTenableandrefresh#endif}//+++++++++++++++++++++++++++++++++++++++++++//ADC//input:AN//output:8bitADCvalue//+++++++++++++++++++++++++++++++++++++++++++ucharADdata(ucharAn)//带变量的函数{ucharTempData=0;ADCCRL&=0xf0;//清通道选择位nop;nop;nop;nop;nop;nop;ADCCRL|=An;//选择通道nop;nop;nop;nop;nop;nop;ADCCRL|=ADST;//开启ADC转换nop;nop;nop;nop;nop;nop;//等待转换完成while(!(ADCCRL&0x10));//为真,转换AD完成--此处一定要用按位&运算符,用逻辑&&会出现AD通道错乱现象TempData=ADCDRL>>4;TempData|=ADCDRH<<4;ADCCRL&=~ADST;//STOPADCnop;nop;nop;returnTempData;//TempData的值返回给了ADdata()函数}voidAD_AN2(void){uchari;for(i=0;i<8;i++){rADC[0]+=ADdata(AN2);//TempData的值返回给了ADdata()带变量的函数}AD2=rADC[0]/8;//取8次平均值rADC[0]=0;CapacityV=0;CapacityV=AD2/5;//每5个AD为0.1V}voidAD_AN3(void){uchari;for(i=0;i<8;i++){rADC[1]+=ADdata(AN3);}AD3=rADC[1]/8;//取8次平均值rADC[1]=0;AdAn3=0;for(i=0;i<201;i++){if(AD3elsei=202;//不成立,提前退出,不进行空等待}if(AdAn3>=200)AdAn3=200;}//++++++ADCProcess+++++++++++++++++++++++++++++++++++++voidProcess_AD(void){AD_AN3();}/*-------------------------------------------------------------------------*/voidBeeperOn(void){buzon=1;m_State|=BZSTATE_SOUND;//m_state控制BUZON&BUZOFFm_Tmr=m_OnTime;}/*-------------------------------------------------------------------------*/voidBeeperOff(void){buzon=0;m_State&=(~BZSTATE_SOUND);//m_state控制BUZON&BUZOFFm_Tmr=m_OffTime;}/*-------------------------------------------------------------------------*/voidBeeperSet(ucharp_OnTime,ucharp_OffTime,ucharp_Repeat){m_OnTime=p_OnTime;m_OffTime=p_OffTime;m_Repeat=p_Repeat;if(p_Repeat){BeeperOn();}else{BeeperOff();}}/*-------------------------------------------------------------------------*//*-------------------------------------------------------------------------*/voidBeeperControl(void){if((Tick10ms&TICK10MS_BEEP)==0)//1111,1111&0000,0010=0000,0010=1{return;}Tick10ms=Tick10ms&(~TICK10MS_BEEP);//0000,0010&~0000,0010=0000,0010&1111,1101=0000,0000if(m_Repeat==0)//蜂鸣次数,多少次{return;}/*dutycheck*/if(m_Tmr)//蜂鸣的开或关的时间长短{m_Tmr--;return;}/*toggle*/if(m_State&BZSTATE_SOUND)//m_state控制BUZON&BUZOFF{m_Repeat--;BeeperOff();}else{BeeperOn();}}//-----------------------------------------------------------------//ReadKey//-----------------------------------------------------------------voidReadKey(){//数码管注意是共阴com4=1;com1=1;com2=1;com3=1;//关所有显示nop;nop;nop;LEDa=0;LEDb=0;LEDc=0;LEDd=0;LEDe=0;LEDf=0;LEDg=0;LEDh=0;//关所有显示nop;nop;nop;P2PU=0x30;//RupP2IO=0x00;//inputP3PU|=0x7f;//RupP3IO&=0x80;//P37OUTPUT,Otherinputnop;nop;nop;P2=0xff;P3|=0x7f;nop;nop;nop;if(xiao_dou_time<=2000)xiao_dou_time++;if(KEY1==0){if(xiao_dou_time==12){Menu++;Vpoc=0;//只要有任一按键按下AN2为普通I/O对电容充电P0FSR=0x10;//AN2isI/O,AN3isADP0IO=0x07;//AN2isoutputP0=0x04;//AN2为高电平对电容进行充电DelayBUZ=1;count_1s=0;//每1秒钟数字加11us19usT2BDR=1
for(j=0;j<250;j++)
nop;
}
voidMCUInitialSetting()
//SystemClockSelect&builtinresetlevelselect
#ifCRYSTAL
P3FSR=0xC0;//7=1:
P37_XOUT,6=1:
P36_XIN
SCCR=0x00;//INTRCOSC(fIRC)forsystemclock
OSCCR=0x22;//externalOSCenablestart,INT-RC/2(8MHz)
Delay1ms(100);//16ms
SCCR=0x01;//external4.194304MHzmainOSC(fxin)forSystemclock
OSCCR=0x06;//internalRCOSCdisable,externalmainOSCenable
#else
OSCCR=0x20;//internalRCOSC8MHz
#endif
LVRCR=0x00;//builtinreset1.6Vset,LVRCR.0=0enable!
!
//b7b6b5b4b3b2b1b0
//AN3AN2DSCLDSDA
P0IO=0x03;//----ininoutout
P0OD=0x03;//----PPPPODOD//0Push-pulloutput,1Open-drainoutput
P0PU=0x03;//----offoffonon
P0=0x03;//----0011
P03DB=0x00;//00P35DB---P03DBP02DB76=01:
fx/4=1usnoisefiltering//ConfigureDebounce---Disable
P0FSR=0x18;//00011000
//I/Ocom4com3PWM2com2com1
P1IO=0xff;//-outoutoutoutoutout-
P1OD=0x00;//-PPPPPPPPPPPP-
P1PU=0x00;//-offoffoffoffoffoff-
P1=0x36;//-011011-
P12DB=0x00;//----P13DBP12DBP11DB-//ConfigureDebounce---Disable
P1FSRH=0x00;//00P160P150P140//I/OPort
P1FSRL=0x20;//0PWM20P120P1100//I/OPort
//I/OI/O
P2IO=0x30;//--outout----
P2OD=0x00;//--PPPP----
P2PU=0x00;//--oFFoFF----
P2=0x00;//--00----
P2FSR=0x00;//------00//P25isI/O,P24isI/O
//BUZI/OI/OI/OI/OI/O
P3IO=0xff;//OUTOUTout--outOUTOUT
P3OD=0x00;//PPPPPP--PPPPPP
P3PU=0x00;//offoffoff--offoFFoFF
P3=0x00;//000--000
//P3FSR=0xE1;//111--001
EIPOL1=0x00;//ExtInt8fallingedgetrigger
EIPOL0L=0x00;//ExtInt3~0PolarityRegisterLow
EIPOL0H=0x00;//ExtInt7~4PolarityRegisterHigh
EIFLAG0=0x00;//ExtIntFlagRegister0
EIFLAG1=0x00;//ExtIntFlagRegister1
IE=0x80;//(EA)-ExG0--Ex12Ex11Ex10
IE1=0x00;//---(TX)(RX)I2CEx6Ex5
IE2=0x0e;//--ExG1-T2(T1)T0T0V
IE3=0x04;//---BITWDT(WT)SPIADC
//AD寄存器初始化
ADCCRH=0x07;//clock=fx/8,LSBsaveADCvalue,高8位AD使用低4位3:
0,低8位AD全部使用7:
0
ADCCRL=0x90;//内部VDD作为参考
T1_1s=0;
T1_minute=0;
T1_hour=0;
Menu=0;
Vpoc=1;
EEPword=0;
//task:
TimerandInterruptstart
voidTimer_Start()
#ifCRYSTAL//externalOSC4.194304MHz
T0CR=0x85;//PCS=4.194304MHz/8=524288Hz(1.9073486us),Timer0enable
T0DR=0x83;//1.9073486usx131=249.862666us
WTCR=0x81;//61.03515625uswatchtimer--mainosc4.194304MHz/256=16.384KHz(61.03515625us)
WTDR=0xD2;//61.03515625usx82=5.00488msinterval
//WT中断计算公式:
Fwck=Fx/128=32768;WT频率=Fwck/2^14=2Hz;即每周期生产一个中断=500ms;
T1CRH=0x80;//Timer1enable
T1ADR=259;//15.258789usx260=3.9998msinterval
T1CRL=0x40;//pcs=4.194304MHz/64=65.536KHz(15.258789us)
T1CRH=0x81;//Timer1start
T2CRH=0xb0;//Timer2enable,PWM2O是重复模式
T2ADR=259;//15.258789usx260=3.9998msinterval频率周期为4ms
T2CRL=0x40;//pcs=4.194304MHz/64=65.536KHz(15.258789us)
T2CRH=0xb1;//Timer2start
BITCR=0x4E;//BIT=4.19MHz/128=32.768KHz(30.517578us)30.517578us*128=3.906ms
WDTDR=0xfa;//3.906x250=976.5mswatchdogrefreshcycle
WDTCR=0xE0;//WDTenableandrefresh
#else//internalRCOSC8MHz
T0CR=0x85;//PCS=8MHz/8=1000000Hz(1us),Timer0enable
T0DR=0xF9;//1usx250=250us
WTCR=0x81;//32uswatchtimer--mainosc8MHz/256=31.25KHz(32us)
WTDR=0xfc;//32*125=4ms溢出,清计数器
T1ADR=3999;//1usx4000=4msinterval
T1CRL=0x60;//pcs=8MHz/8=1us
//T2ADR=3999;//1usx4000=4msinterval频率周期为4ms
T2ADR=19;//1usx20=20usinterval频率周期为20us
T2CRL=0x60;//pcs=8MHz/8=1us
BITCR=0x4E;//BIT=8MHz/128=62.5KHz(16us)16us*128=2.048ms
WDTDR=0xfa;//2.048x250=512mswatchdogrefreshcycle
//+++++++++++++++++++++++++++++++++++++++++++
//ADC
//input:
AN
//output:
8bitADCvalue
ucharADdata(ucharAn)//带变量的函数
ucharTempData=0;
ADCCRL&=0xf0;//清通道选择位
ADCCRL|=An;//选择通道
ADCCRL|=ADST;//开启ADC转换
//等待转换完成
while(!
(ADCCRL&0x10));//为真,转换AD完成--此处一定要用按位&运算符,用逻辑&&会出现AD通道错乱现象
TempData=ADCDRL>>4;
TempData|=ADCDRH<<4;
ADCCRL&=~ADST;//STOPADC
returnTempData;//TempData的值返回给了ADdata()函数
voidAD_AN2(void)
uchari;
for(i=0;i<8;i++)
rADC[0]+=ADdata(AN2);//TempData的值返回给了ADdata()带变量的函数
AD2=rADC[0]/8;//取8次平均值
rADC[0]=0;
CapacityV=0;
CapacityV=AD2/5;//每5个AD为0.1V
voidAD_AN3(void)
rADC[1]+=ADdata(AN3);
AD3=rADC[1]/8;//取8次平均值
rADC[1]=0;
AdAn3=0;
for(i=0;i<201;i++)
if(AD3elsei=202;//不成立,提前退出,不进行空等待}if(AdAn3>=200)AdAn3=200;}//++++++ADCProcess+++++++++++++++++++++++++++++++++++++voidProcess_AD(void){AD_AN3();}/*-------------------------------------------------------------------------*/voidBeeperOn(void){buzon=1;m_State|=BZSTATE_SOUND;//m_state控制BUZON&BUZOFFm_Tmr=m_OnTime;}/*-------------------------------------------------------------------------*/voidBeeperOff(void){buzon=0;m_State&=(~BZSTATE_SOUND);//m_state控制BUZON&BUZOFFm_Tmr=m_OffTime;}/*-------------------------------------------------------------------------*/voidBeeperSet(ucharp_OnTime,ucharp_OffTime,ucharp_Repeat){m_OnTime=p_OnTime;m_OffTime=p_OffTime;m_Repeat=p_Repeat;if(p_Repeat){BeeperOn();}else{BeeperOff();}}/*-------------------------------------------------------------------------*//*-------------------------------------------------------------------------*/voidBeeperControl(void){if((Tick10ms&TICK10MS_BEEP)==0)//1111,1111&0000,0010=0000,0010=1{return;}Tick10ms=Tick10ms&(~TICK10MS_BEEP);//0000,0010&~0000,0010=0000,0010&1111,1101=0000,0000if(m_Repeat==0)//蜂鸣次数,多少次{return;}/*dutycheck*/if(m_Tmr)//蜂鸣的开或关的时间长短{m_Tmr--;return;}/*toggle*/if(m_State&BZSTATE_SOUND)//m_state控制BUZON&BUZOFF{m_Repeat--;BeeperOff();}else{BeeperOn();}}//-----------------------------------------------------------------//ReadKey//-----------------------------------------------------------------voidReadKey(){//数码管注意是共阴com4=1;com1=1;com2=1;com3=1;//关所有显示nop;nop;nop;LEDa=0;LEDb=0;LEDc=0;LEDd=0;LEDe=0;LEDf=0;LEDg=0;LEDh=0;//关所有显示nop;nop;nop;P2PU=0x30;//RupP2IO=0x00;//inputP3PU|=0x7f;//RupP3IO&=0x80;//P37OUTPUT,Otherinputnop;nop;nop;P2=0xff;P3|=0x7f;nop;nop;nop;if(xiao_dou_time<=2000)xiao_dou_time++;if(KEY1==0){if(xiao_dou_time==12){Menu++;Vpoc=0;//只要有任一按键按下AN2为普通I/O对电容充电P0FSR=0x10;//AN2isI/O,AN3isADP0IO=0x07;//AN2isoutputP0=0x04;//AN2为高电平对电容进行充电DelayBUZ=1;count_1s=0;//每1秒钟数字加11us19usT2BDR=1
elsei=202;//不成立,提前退出,不进行空等待
if(AdAn3>=200)AdAn3=200;
//++++++ADCProcess+++++++++++++++++++++++++++++++++++++
voidProcess_AD(void)
AD_AN3();
/*-------------------------------------------------------------------------*/
voidBeeperOn(void)
buzon=1;
m_State|=BZSTATE_SOUND;//m_state控制BUZON&BUZOFF
m_Tmr=m_OnTime;
voidBeeperOff(void)
buzon=0;
m_State&=(~BZSTATE_SOUND);//m_state控制BUZON&BUZOFF
m_Tmr=m_OffTime;
voidBeeperSet(ucharp_OnTime,ucharp_OffTime,ucharp_Repeat)
m_OnTime=p_OnTime;
m_OffTime=p_OffTime;
m_Repeat=p_Repeat;
if(p_Repeat)
BeeperOn();
else
BeeperOff();
voidBeeperControl(void)
if((Tick10ms&TICK10MS_BEEP)==0)//1111,1111&0000,0010=0000,0010=1
return;
Tick10ms=Tick10ms&(~TICK10MS_BEEP);//0000,0010&~0000,0010=0000,0010&1111,1101=0000,0000
if(m_Repeat==0)//蜂鸣次数,多少次
/*dutycheck*/
if(m_Tmr)//蜂鸣的开或关的时间长短
m_Tmr--;
/*toggle*/
if(m_State&BZSTATE_SOUND)//m_state控制BUZON&BUZOFF
m_Repeat--;
//-----------------------------------------------------------------
//ReadKey
voidReadKey()
{//数码管注意是共阴
com4=1;
com1=1;
com2=1;
com3=1;//关所有显示
LEDa=0;
LEDb=0;
LEDc=0;
LEDd=0;
LEDe=0;
LEDf=0;
LEDg=0;
LEDh=0;//关所有显示
P2PU=0x30;//Rup
P2IO=0x00;//input
P3PU|=0x7f;//Rup
P3IO&=0x80;//P37OUTPUT,Otherinput
P2=0xff;
P3|=0x7f;
if(xiao_dou_time<=2000)xiao_dou_time++;
if(KEY1==0)
if(xiao_dou_time==12)
Menu++;
Vpoc=0;
//只要有任一按键按下AN2为普通I/O对电容充电
P0FSR=0x10;//AN2isI/O,AN3isAD
P0IO=0x07;//AN2isoutput
P0=0x04;//AN2为高电平对电容进行充电
DelayBUZ=1;
count_1s=0;//每1秒钟数字加11us19us
T2BDR=1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1