下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 STC12C5A60S2单片机c语言程序代码调试例程

STC12C5A60S2单片机c语言程序代码调试例程.doc

STC12C5A60S2单片机c语言程序代码调试例程

繁华的只有寂寞
2017-09-16 0人阅读 举报 0 0 暂无简介

简介:本文档为《STC12C5A60S2单片机c语言程序代码调试例程doc》,可适用于职业岗位领域

STCCAS单片机c语言程序代码调试例程****************************************************************************STCCAS可编程时钟模块说明:STCCAS单片机有三路可编程时钟输出CLKOUTTPCLKOUTTP、CLKOUTP涉及寄存器:AUXR(辅助寄存器)、WAKECLKO(时钟与系统掉电唤醒控制寄存器)BRT(独立波特率发生器定时器寄存器)程序说明:本程序可选实现P输出CLKOUT时钟、P输出CLKOUT时钟P输出CLKOUT时钟****************************************************************************#include<STCCASH>#include<intrinsh>#definePortBRT如果想测试独立波特率发生器时钟输出请打开此句若想测试CLKOUT和CLKOUT请注释此句#ifdefPortBRT*条件编译独立波特率发生器时钟输出**********************************CLKOUT时钟初始化*********************************voidCLKOUTinit(void){WAKECLKO=xBitBRTCLKO允许P配置为独立波特率发生器的时钟输出BRT工作在T模式下时的输出频率=Sysclk(BRT)BRT工作在T模式下时输出频率=Sysclk(BRT)AUXR=xBitBRTR允许独立波特率发生器运行BitBRTxBRT工作在T模式下BRT=xff更改该寄存器的值可实现对输出的时钟频率进行分频}#else*条件编译CLKOUT时钟输出**********************************CLKOUT时钟和CLKOUT初始化*********************************voidCLKOUTinit(void){WAKECLKO=x允许将PT脚配置为定时器的时钟输出CLKOUTT工作在T模式时的输出频率=SYSclk(TH)T工作在T模式时的输出频率=SYSclk(TH)T指的是每个时钟加,是普通C的倍T指的是每个时钟加与普通C一样允许将PT脚配置为定时器的时钟输出CLKOUT,只能工作在定时器模式下T工作在T模式时的输出频率=SYSclk(TH)T工作在T模式时的输出频率=SYSclk(TH)T指的是每个时钟加,是普通C的倍T指的是每个时钟加与普通C一样AUXR=xcT定时器速度是普通的倍,即工作在T模式下T定时器速度是普通的倍,即工作在T模式下TMOD=x定时器工作模式为方式,自动装载时间常数定时器工作模式为方式,自动装载时间常数TH=xff更改该寄存器的值可实现对输出的时钟频率进行分频TL=xffTH=xff更改该寄存器的值可实现对输出的时钟频率进行分频TL=xffTR=TR=}#endif**********************************主程序**********************************voidmain(){CLKOUTinit()while()}****************************************************************************STCCAS系统时钟模块说明:STCCAS单片机有两个时钟源内部RC振荡时钟和外部晶体时钟出厂标准配置是使用外部晶体或时钟涉及寄存器:CLKDIV(时钟分频寄存器)由该寄存器的Bit组合可实现对时钟源进行、、、、、、分频程序说明:对外部时钟进行分频得到Sysclk,然后经过P的独立波特率时钟输出功能Sysclk输出时钟频率****************************************************************************#include<STCCASh>#include<intrinsh>#defineBusclk若要修改系统时钟直接在此处修改为M的sysclk为M的sysclk为M的sysclk为M的sysclkkHz的sysclk为为kHz的sysclk为kHz的sysclk为kHz的sysclk*********************************************系统时钟初始化*********************************************voidSysclkinit(void){WAKECLKO=x配置P口为频率输出AUXR=x允许波特率时钟工作工作模式为TBRT=xff#if(Busclk==)CLKDIV=x#elif(Busclk==)CLKDIV=x#elif(Busclk==)CLKDIV=x#elif(Busclk==)CLKDIV=x#elif(Busclk==)CLKDIV=xBusclk==)#elif(CLKDIV=x#elif(Busclk==)CLKDIV=x#elif(Busclk==)CLKDIV=x#endif}**********************************************主程序**********************************************voidmain(){Sysclkinit()while()}****************************************************************************STCCAS系统省电模块说明:STCCAS单片机有三种省电模式以降低功耗空闲模式低速模式掉电模式涉及寄存器:PCON(电源控制寄存器)BitIDL控制单片机进入IDLE空闲模式BitPD控制单片机进入掉电模式程序说明:程序实现让单片机先工作一阵子(通过P^指示灯显示)然后进入掉电状态,利用外部中断口来唤醒单片机工作唤醒后单片机将通过P^口的灯闪烁显示开始工作****************************************************************************#include<STCCASh>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedintucharPowerDownFlag=进入掉电状态标志sbitChipStartLED=P^单片机开始工作指示灯sbitPowerDownLEDINT=P^INT口掉电唤醒指示灯sbitNPowerDownLEDINT=P^INT口没有唤醒指示灯sbitNormalWorkLED=P^正常工作指示灯sbitPowerDownWakeupINT=P^外中断唤醒输入口voidDelayms(uinttime)voidNormalwork(void)voidIntpinit(void)voidAfterPowrDown(void)***********************************软件延时***********************************voidDelayms(uinttime){uintt延时时间=(time*)uswhile(time){for(t=t<t)}}***********************************正常工作指示***********************************voidNormalwork(void){NormalWorkLED=Delayms()NormalWorkLED=Delayms()}voidAfterPowerDown(void){ucharii<i)for(i={P=xfDelayms()P=xDelayms()}}***********************************中断初始化***********************************voidIntpinit(void){IT=外部中断源为低电平触发EX=允许外部中断EA=开总中断}***********************************STCCAS单片机各个模块程序代码stccas主程序***********************************voidmain(){ucharj=ucharwakeupcounter=记录掉电次数P=xChipStartLED=单片机开始工作Intpinit()外中断初始化while(){P=wakeupcounterwakeupcounterfor(j=j<j){Normalwork()系统正常工作指示}PowerDownFlag=系统开始进入掉电状态PCON=xnop()nop()nop()nop()AfterPowerDown()掉电唤醒后}}**********************************中断服务**********************************voidINTService(void)interrupt{if(PowerDownFlag)掉电唤醒状态指示{PowerDownFlag=PowerDownLEDINT=while(PowerDownWakeupINT==){nop()等待高电平}PowerDownLEDINT=}else未掉电状态{NPowerDownLEDINT=不是掉电唤醒指示while(PowerDownWakeupINT==){nop()}NPowerDownLEDINT=}}****************************************************************************STCCASAD转换模块说明:STCCAS单片机有路位高速AD转换器,P^P^涉及寄存器:PASF(模拟功能控制寄存器)、ADCCONTR(ADC控制寄存器)ADCRES、ADCRESL(转换结果寄存器)注意:、初次打开内部AD模拟电源需适当延时等内部模拟电源稳定后,再启动AD转换启动AD后,在转换结束前不改变任何IO口的状态,有利于高精度AD转换若能将定时器串行中断系统关闭更好。、AD转换模块使用的时钟为内部RC振荡器所产生的系统时钟、由于使用两套时钟,设置好ADCCONTR后要加个空延时操作才可以正确读到ADCCONTR寄存器的值程序说明:本程序实现P^口作为AD采集输入口,对外部电压的测量并将测量结果通过和串口显示出来****************************************************************************#include<STCCASh>#include<intrinsh>#include"lcdh"#defineADCPOWERxAD电源控制#defineADCSTARTxAD转换控制#defineADCFLAGxAD转换完成#defineSpeedxclk#defineSpeedxclk#defineSpeedxclk#defineSpeedxclk#defineADCxP#defineADCxP#defineADCxP#defineADCxP#defineADCxP#defineADCxP#defineADCxP#defineADCxPvoidADinit(void)doubleResultCalculate(void)voidSendData(ucharbyte)**********************************AD初始化**********************************voidADinit(void){AUXR=x转换结果高位放在ADCRES的低位中,低位放在ADCRESL中PASF=xP口作为模拟功能AD使用ADCRES=x结果清零ADCRESL=xADCCONTR=ADCPOWER|Speed|ADC|ADCSTART打开电源,CLK周期转换,选择P作输入nop()nop()nop()nop()nop()nop()nop()nop()EADC=允许AD转换中断EA=开总中断}****************************************串口初始化****************************************voidUARTinit(void){SM=选择串口为方式工作SM=位数据波特率可变REN=BRT=xDCAUXR=x选择独立波特率发生器为串行口的波特率发生器,模式为T}******************************************转换结果计算******************************************doubleResultCalculate(void){uinttempdoubleresulttemp=ADCRES*ADCRESLresult=temp*returnresult}******************************************串口发送数据******************************************voidSendData(ucharbyte){SBUF=bytewhile(!TI)TI=}******************************************主程序******************************************voidmain(){InitLCD()ADinit()UARTinit()while()}******************************************AD中断服务******************************************voidADService(void)interrupt{ADCCONTR=!ADCFLAG清标志PrintfDecimal(ResultCalculate())ADCRES=xADCRESL=xADCCONTR=ADCPOWER|Speed|ADCSTART开始下一次转换nop()nop()nop()nop()}#include<intrinsh>#include<STCCASh>#defineucharunsignedchar#defineuintunsignedintsbitPSB=P^串并行接口选择并行串行sbitRS=P^并行数据命令选择,串行片选指令数据sbitRW=P^并行读写选择写读串行数据口sbitE=P^并行使能,串行同步时钟voidDelayms(uinttime)延时ucharBusy(void)读忙ucharReadStatus(void)读状态读数据ucharReadDate(void)voidWriteCmd(ucharcmd)写命令voidWriteDate(uchardate)写数据voidInitLCD(void)初始化LCDvoidLocation(ucharx,uchary)设定显示位置voidClearScreen(void)清屏voidWritestr(uchar*p)voidPrintfDecimal(doubleNum)#include"lcdh"externvoidSendData(ucharbyte)***********以下部分为LCD的驱动程序************************************************名称:Delayms()*功能:实现软件延时*输入:time时间参数*输出:无**********************************voidDelayms(uinttime){uintt,延时时间=(time*)uswhile(time),延时时间=(time*)us{for(t=t<t)}STCCAS单片机各个模块程序代码stccas}***********************************名称:Busy()*功能:读取忙状态*输入:无*输出:忙空闲**********************************ucharBusy(void){ucharbusy,flagDelayms()busy=ReadStatus()if(busyx)flag=elseflag=Delayms()returnflag}***********************************名称:ReadStatus()*功能:读状态*输入:无*输出:status当前状态**********************************ucharReadStatus(void){ucharstatusRS=RW=E=nop()nop()nop()E=Delayms()status=PDelayms()E=nop()nop()returnstatus}***********************************名称:WriteCmd()*功能:向写命令*输入:cmd命令参数*输出:无**********************************voidWriteCmd(ucharcmd){RS=RW=E=Delayms()P=cmdDelayms()等待数据稳定E=Delayms()E=}***********************************名称:WriteDate()*功能:向写数据*输入:date待写入的数据输出:无***********************************voidWriteDate(uchardate){while(Busy())RS=RW=E=nop()nop()P=dateDelayms()待数据稳定E=Delayms()E=nop()nop()}***********************************名称:ReadDate()*功能:向读数据*输入:无*输出:date返回的数据**********************************ucharReadDate(void){uchardatewhile(Busy())忙RS=RW=E=nop()nop()nop()E=Delayms()date=PDelayms()E=nop()returndate}***********************************名称:InitLCD()*功能:初始化LCD*输入:无*输出:无**********************************voidInitLCD(void){Delayms()PSB=并行方式Delayms()WriteCmd(xc)开显示关游标Delayms()ClearScreen()清屏}***********************************名称:Location()*功能:设定显示位置*输入:x,yX轴点Y轴点*x只能是中的一个数*Y只能是中的一个数*输出:无**********************************voidLocation(ucharx,uchary){ucharposition)if(x==x=xelseif(x==)x=xelseif(x==)x=xelseif(x==)x=xposition=xyWriteCmd(position)Delayms()}***********************************名称:ClearScreen()*功能:清屏*输入:无*输出:无**********************************voidClearScreen(void){WriteCmd(x)扩充指令Delayms()msWriteCmd(x)基本指令Delayms()WriteCmd(x)清屏Delayms()}***********************************名称:Writestr()*功能:向里写字符串*输入:*p字符串地址*输出:无**********************************voidWritestr(uchar*p){while(*p!=''){WriteDate(*p)p}}**********************************名称:PrintfDecimal()*功能:打印浮点类型数据*输入:doubleNum要打印的数据*输出:无*********************************voidPrintfDecimal(doubleNum){uchars={,,,,}uinttt=(uint)(Num*)s=ts=ts=ts=ts=tLocation(,)Writestr(s)SendData(s)SendData(s)SendData(s)SendData(s)SendData(s)SendData(s)SendData('t')}****************************************************************************STCCASPCAPWM模块说明:STCCAS单片机有两路可编程计数器阵列(PCA)模块,可用于软件定时器,外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出涉及寄存器:CMOD(PCA工作模式寄存器)CCON(PCA控制寄存器)CCAPM,CCAPM(PCA比较捕获寄存器)CH,CL(PCA的位计数器)、CCAPnLCCAPnH(PCA捕捉比较寄存器)PCAPWM,PCAPWM(PCA模块PWM寄存器)AUXR(辅助寄存器)程序说明:本程序实现对PCAPWM模块的四种工作模式的测试。注意:当选择相应的模式时,需在主函数内和中断服务内更改相应模式的初始STCCAS单片机各个模块程序代码stccas化和相应的中断服务程序。去掉注释就可以,若要更改相应模式的功能,需在相应的初始化函数里更改相应的参数,脉宽调制(PWM)默认设置为无中断方式****************************************************************************#include<STCCASH>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint*******高速模式变量更改*********#defineFOSC#defineTKHz(FOSC)高速脉冲输出频率计算:f=PCA模块的时钟源(*CCAPL)CCAPL=PCA时钟源f*******定时模式变量更改*********#defineTms(*FOSC)定时计数值=T(PCA的时钟源)*******PWM模式变量更改**********#defineDRxf占空比#defineDRx占空比*******时钟源选择*******#defineCLKxSysclk#defineCLKxSysclk#defineCLKx定时器的溢出脉冲#defineCLKxECIP(P)输入的外部时钟#defineCLKxSysclk#defineCLKxaSysclk#defineCLKxdSysclk#defineCLKxeSysclk****************模式选择#defineHmodelxd高速输出模式,中断模式#defineTmodelx定时模式#definePmodelx无中断PWM模式#definePLmodelx由低变高可中断PWM模式#definePHmodelx由高变低可中断PWM模式#definePHLmodelx高低都可中断PWM模式#defineCUmodelx位捕获,上升触发中断模式#defineCDmodelx位捕获,下降触发中断模式#defineCUDmodelx位捕获,跳变触发中断模式uintvalue=TKHzkHz时的CCAPL值uinttime=Tmsms时的CCAPL和CCAPH值uinttest=测试用,要删除sbitLED=P^用来观测定时模式和捕获模式的现象定时模式时MS闪烁,捕获模式时捕获一次时取反*****函数声明*****voidHPinit(void)高速模式初始化voidPPinit(void)PWM模式初始化voidTPinit(void)定时器模式初始化voidCDinit(void)捕获模式初始化********************************Hmodel初始化********************************voidHPinit(void){CMOD=CLKPCA时钟源为SysclkCCAPM=Hmodel高速输出模式CCAPL=valueCCAPH=value>>value=TKHzCR=开启PCA计数器EA=开总中断}********************************Pmodel初始化********************************voidPPinit(void){CMOD=CLK时钟源为SysclkCCAPM=Pmodel无中断PWM模式CCAPL=DR占空比CCAPH=DR当CL值大于CCAPL时输出为高,反之输出为低当CL溢出时CCAPH的值装载到CCAPL中CR=开启PCA计数器当不使用定时溢出为时钟源时,PWM输出的频率=PCA的时钟源使用定时器溢出的时钟源时,可设定定时器的值对输出频率的改变分频为分频}********************************Tmodel初始化********************************voidTPinit(void){CMOD=CLK时钟源为SysclkCCAPM=Tmodel定时模式CCAPL=timeCCAPH=time>>定时mstime=TmsCR=EA=}********************************CDmodel初始化********************************voidCDinit(void){CMOD=CLKCCAPM=CDmodelCR=EA=}********************************主程序********************************voidmain(){CDinit()PPinit()HPinit()TPinit()while(){}}*******************************中断服务*******************************voidCDService(void)interrupt{CCF=LED=~LED}*voidTPService(void)interrupt{CCF=清除PCA计数器溢出中断标志testif(test==){test=LED=~LED}CCAPL=timeCCAPH=time>>time=Tms}**voidHPService(void)interrupt{CCF=清除PCA计数器溢出中断标志CCAPL=valueCCAPH=value>>value=TKHz}*****************************************************************************STCCAS串行通信模块说明:STCCAS单片机有个采用UART工作方式的全双工串行通信接口两个串口都有种工作方式,两种波特率可变两种波特率固定的串口为TxDP引脚RxDP引脚串口为当在P口时TxDP引脚RxDP引脚当在P口时TxDP引脚RxDP引脚涉及寄存器:BRT(独立波特率发生器)AUXR(辅助寄存器)SCON(串行控制寄存器)SBUF(数据缓冲寄存器)PCON(电源控制寄存器)IE(中断控制寄存器)IP(中断优先级寄存器)IPH()SADEN()SADDR()WAKECLKO(时钟唤醒寄存器)BitPD控制单片机进入掉电模式程序说明:程序实现从PC端发送数据到单片机,单片机将接收到的数据通过显示出来****************************************************************************#include<STCCASh>#include<intrinsh>#include"LCDh"#defineucharunsignedchar#defineuintunsignedint#defineBTL若要更改波特率直接更改此处,当波特率大于时需修改相应的接收程序,可选波特率有以下:否则有可能出现乱码波特率为波特率为波特率为波特率为波特率为波特率为波特率为波特率为波特率为ucharSendBflag=正在发送标志ucharReceiveBflag=正在接送标志ucharResbitLED=P^sbitLED=P^voidUARTinit(void)voidDelay(uinttime)voidReceive(void)voidPrintf(uchar*p)****************************************串口初始化****************************************voidUARTinit(void){SM=选择串口为方式工作SM=位数据波特率可变REN=#if(BTL==)BRT=x#elif(BTL==)BRT=xB#elif(BTL==)波特率设置为BRT=xDC#elif(BTL==)BRT=xE#elif(BTL==)BRT=xEE#elif(BTL==)BRT=xF#elif(BTL==)STCCAS单片机各个模块程序代码stccasBRT=xF#elif(BTL==)BRT=xFA#elif(BTL==)BRT=xFD#endifAUXR=x选择独立波特率发生器为串行口的波特率发生器,模式为TES=允许串口中断IPH=XPSH=IP=XPS=串口中断为最高优先级中断EA=开总中断}************************************************发送一个字节数据************************************************voidSendbyte(ucharbyte){SBUF=bytewhile(!TI)TI=}************************************************打印字符************************************************voidPrintf(uchar*p){while(*p!=''){Sendbyte(*p)p}}************************************************接收函数************************************************voidReceive(void){WriteDate(SBUF)Reif(Re==)Location(,)if(Re==)Location(,)if(Re==)Location(,)if(Re==){Re=ClearScreen()Location(,)}ReceiveBflag=}************************************************主函数************************************************voidmain(){InitLCD()UARTinit()while(){if(RI==){RI=Receive()Printf("Success!")}if(TI==){TI=}}}***********************************************串口中断服务***********************************************voidComService(void)interrupt{EA=EA=}****************************************************************************STCCASSPI接口模块说明:STCCAS单片机提供一种高速串行通信接口SPI接口,SPI是一种全双工高速同步的通信总线,有两种操作模式:主模式和从模式。涉及寄存器:SPCTL(SPI控制寄存器)、SPSTAT(SPI状态寄存器)、SPDAT(数据寄存器)AUXR(辅助寄存器)程序说明:本程序为SPI的主机程序,主机通过从串口接收数据并将数据通过SPI传输给SPI的从机。****************************************************************************#include<STCCASH>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint************对SPCTL寄存器的设置位宏定义*************#defineSSIGxSS引脚忽略#defineSPENxSPI使能位#defineDORDxSPI数据发送LSB最先发送#defineMSTRx主从模式选择#defineCPOLxSPICLK空闲时为高电平#defineCPHAx数据在SPICLK的前时钟沿驱动,并在后时钟沿采样#defineSPCLKxSPI时钟频率为CPUCLK#defineSPCLKxSPI时钟频率为CPUCLK#defineSPCLKxSPI时钟频率为CPUCLK#defineSPCLKxSPI时钟频率为CPUCLK************对SPSTAT寄存器的设置位宏定义************#defineSPIFx传输完成标志#defineWCOLxSPI写冲突标志************SPI口切换宏定义***************#defineSPIPxSPI从P口切换到P口sbitSPISS=P^用来选择从机************串口波特率设定*************************#defineBTL若要更改波特率直接更改此处,当波特率大于时需修改相应的接收程序,可选波特率有以下:否则有可能出现乱码波特率为波特率为波特率为波特率为波特率为波特率为波特率为波特率为波特率为voidUARTinit(void)ucharReceive(void)voidPrintf(uchar*p)voidInitSPI(void)voidSendbyte(ucharbyte)****************************************串口初始化****************************************voidUARTinit(void){SM=选择串口为方式工作SM=位数据波特率可变REN=允许串口接收SCON=x#if(BTL==)BRT=x波特率设置为#elif(BTL==)BRT=xB#elif(BTL==)BRT=xDC#elif(BTL==)BRT=xE#elif(BTL==)BRT=xEE#elif(BTL==)BRT=xF#elif(BTL==)BRT=xF#elif(BTL==)BRT=xFA#elif(BTL==)BRT=xFD#endifAUXR=x选择独立波特率发生器为串行口的波特率发生器,模式为TES=允许串口中断IPH=XPSH=IP=XPS=串口中断为最高优先级中断EA=开总中断}************************************************发送一个字节数据************************************************voidSendbyte(ucharbyte){SBUF=bytewhile(!TI)TI=}************************************************打印字符************************************************voidPrintf(uchar*p){while(*p!=''){Sendbyte(*p)p}}************************************************接收函数************************************************ucharReceive(void){ucharbytenop()nop()nop()nop()if(RI==){RI=byte=SBUF}returnbyte}************************************名称:InitSPI()*功能:对SPI进行初始化*输入:无*输出:无***********************************voidInitSPI(void){清空数据寄存器SPDAT=SPSTAT=SPIF|WCOL清空SPI状态寄存器STCCAS单片机各个模块程序代码stccasSPCTL=SPEN|MSTRSPI设置为主机模式IE=x允许SPI中断}************************************名称:main*功能:*输入:无*输出:无***********************************voidmain(){ucharflag=UARTinit()InitSPI()EA=开总中断while(){flag=Receive()if(flag)当PC端有发送数据时才进行SPI传输数据{SPISS=SPDAT=flagflag=}}}************************************名称:SPIISR()*功能:SPI中断服务*输入:无*输出:无***********************************voidSPIISR(void)interruptusing使用工作寄存器组{SPSTAT=SPIF|WCOL清标志Printf("SendData:")Sendbyte(SPDAT)从从机中把主机上一次发送的值读回来Sendbyte('t')SPISS=}****************************************************************************STCCASSPI接口模块说明:STCCAS单片机提供一种高速串行通信接口SPI接口,SPI是一种全双工高速同步的通信总线,有两种操作模式:主模式和从模式。涉及寄存器:SPCTL(SPI控制寄存器)、SPSTAT(SPI状态寄存器)、SPDAT(数据寄存器)AUXR(辅助寄存器)程序说明:本程序为SPI的从机程序,从机通过SPI接收主机发送过来的数据,并通过串口显示到PC端,****************************************************************************#include<STCCASH>#include<intrinsh>#defineucharunsignedchar#defineuintunsignedint************对SPCTL寄存器的设置位宏定义*************#defineSSIGxSS引脚忽略#defineSPENxSPI使能位#defineDORDxSPI数据发送LSB最先发送#defineMSTRx主从模式选择#defineCPOLxSPICLK空闲时为高电平#defineCPHAx数据在SPICLK的前时钟沿驱动,并在后时钟沿采样#defineSPCLKxSPI时钟频率为CPUCLK#defineSPCLKxSPI时钟频率为CPUCLK#defineSPCLKxSPI时钟频率为CPUCLK#defineSPCLKxSPI时钟频率为CPUCLK************对SPSTAT寄存器的设置位宏定义************#defineSPIFx传输完成标志#defineWCOLxSPI写冲突标志************SPI口切换宏定义***************#defineSPIPxSPI从P口切换到P口************波特率选择********************#defineBTL若要更改波特率直接更改此处,当波特率大于时需修改相应的接收程序,可选波特率有以下:否则有可能出现乱码波特率为波特率为波特率为波特率为波特率为波特率为波特率为波特率为波特率为voidUARTinit(void)ucharReceive(void)voidPrintf(uchar*p)voidInitSPI(void)voidSendbyte(ucharbyte)****************************************串口初始化****************************************voidUARTinit(void){SM=选择串口为方式工作SM=位数据波特率可变REN=允许串口接收SCON=x#if(BTL==)BRT=x波特率设置为#elif(BTL==)BRT=xB#elif(BTL==)BRT=xDC#elif(BTL==)BRT=xE#elif(BTL==)BRT=xEE#elif(BTL==)BRT=xF)#elif(BTL==BRT=xF#elif(BTL==)BRT=xFA#elif(BTL==)BRT=xFD#endifAUXR=x选择独立波特率发生器为串行口的波特率发生器,模式为TES=允许串口中断IPH=XPSH=IP=XPS=串口中断为最高优先级中断EA=开总中断}************************************************发送一个字节数据************************************************voidSendbyte(ucharbyte){SBUF=bytewhile(!TI)TI=}************************************************打印字符************************************************voidPrintf(uchar*p){while(*p!=''){Sendbyte(*p)p}}************************************************接收函数************************************************ucharReceive(void){ucharbytenop()nop()nop()nop()if(RI==){RI=byte=SBUF}returnbyte}************************************名称:InitSPI()*功能:对SPI进行初始化*输入:无*输出:无***********************************voidInitSPI(void){SPDAT=清空数据寄存器SPSTAT=SPIF|WCOL清空SPI状态寄存器SPCTL=SPENSPI设置为从机模式IE=x允许SPI中断}************************************名称:main*功能:*输入:无*输出:无***********************************voidmain(){ucharflag=UARTinit()InitSPI()EA=开总中断while(){flag=Receive()if(flag)当PC端有给从机发送数据时把从机当前的SPDAT值发送出来{Sendbyte(SPDAT)flag=}}}************************************名称:SPIISR()*功能:SPI中断服务*输入:无*输出:无***********************************voidSPIISR(void)interruptusing使用工作寄存器组{SPSTAT=SPIF|WCOL清标志Printf("ReceiveData:")P=PLED灯表示接收的次数Sendbyte(SPDAT)读出主机发送过来的数据SPDAT=SPDAT把上一次接收到的值传回主机Sendbyte('t')}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/63

STC12C5A60S2单片机c语言程序代码调试例程

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利