STC12C5A60S2各模块的应用分享大家.docx
- 文档编号:26239643
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:11
- 大小:16.66KB
STC12C5A60S2各模块的应用分享大家.docx
《STC12C5A60S2各模块的应用分享大家.docx》由会员分享,可在线阅读,更多相关《STC12C5A60S2各模块的应用分享大家.docx(11页珍藏版)》请在冰豆网上搜索。
STC12C5A60S2各模块的应用分享大家
STC12C5A60S2各模块的应用分享大家
/*****************串口应用******************/
///////////////////串口一//////////////
#include"12c5a60s2.h"
#include"uart.h"
unsigned
char
buf[3],g;
void
initUart()
{
EA=1;
BRT=0XFD;
//独立波特率发生器9600
AUXR=0X11;
//启动独立波特率发生器,12分频
//TMOD=0X20;
//用定时器1做波特率发生器
//TH1=0XFD;
//TL1=0XFD;
//TR1=1;
REN=1;
SM1=1;
ES=1;
g=0;
}
void
sendDate(unsigned
chardate)
{
SBUF=date;
while(!
TI);
TI=0;
}
voidwork()
{
sendDate(buf[0]);
sendDate(buf[1]);
}
void
res()interrupt4
{
buf[g++]=SBUF;
if(g>;=2)
{
g=0;
work();
}
while(!
RI);
RI=0;
}
////////////////////串口二////////////////
#include;
#include"uart2.h"
#define
S2TI0X02
//不能位寻址
#define
S2RI0X01
//不能位寻址
unsignedchar
shuzhi;
void
initUART2()
{
BRT=0XFD;//定初值9600
AUXR=0X11;//使用波特率独立发生器12分频9600
//AUXR=0X19;//使用波特率独立发生器1分频19200
EA=1;
IE2=0X01;
//ES2=1;
S2CON=0X50;//S2REN=1;S2SM1=1;
}
void
senddate(unsignedchardate)
{
S2BUF=date;
//判断是否是一
if(S2CON&S2TI)
//清零
S2CON&=~S2TI;
}
voiduart2r()interrupt8
{
if(S2CON&S2RI)
//判断是否是一
{
S2CON&=~S2RI;
//清零
shuzhi=S2BUF;
senddate(0x40);
}
}
/******************AD转换*************************/
#include"12c5a60s2.h"
#include"12c5aad.h"
#include;
//寄存器地址声明,有12c5a60s2头文件可省略
//sfrADC_CONTR=0XBC;
//sfrADC_RES=0XBD;
//sfrADC_ERSL=0XBE;
//sfrP1ASF=0X9D;
//宏定义
#defineADC_POWER0X80
//ad电源控制位
#defineADC_FLAG
0x10
//ad转换结束标志位
#defineADC_START
0x08
//ad转换开始控制位
#defineADC_SPEEDLL0x00
//540转换速率
#defineADC_SPEEDL0x20
//360转换速率
#defineADC_SPEEDH0x40
//180转换速率
#defineADC_SPEEDHH0x60
//90转换速率
//ad转换延时函数
void
delayad(unsigned
intz)
{
unsigned
int
x,y;
for(x=5000;x>;0;x--)
for(y=z;y>;0;y--);
}
//ad初始化函数
void
initad()
{
P1ASF=0XFF;//设置P1口为ad转换模式
ADC_RES=0;//ad转换结果寄存器清零
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;//打开ad转换电源,最慢频率
delayad
(2);
//延时待电源稳定提高精确性
}
unsigned
chargetAD(unsignedcharch)//ch通道选择
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
_nop_();_nop_();_nop_();_nop_();
while(!
(ADC_CONTR&ADC_FLAG));
//ad转换完成FALG为1
ADC_CONTR&=~ADC_FLAG;
//FALG置置零
returnADC_RES;
}
/********************PCA/PWM*****************/
/////////////////////中断模式/////////////////////
#include;
#include"pcaint.h"
unsignedcharmiao;
void
initPCAint(void)
{
CCON=0;
CL=0;
CH=0;
CMOD=0X00;//禁止CF中断
CCAPM0=0X11;//(CAPN0负捕获,CAPP0正捕获)本模块负捕获
CCAPM1=0X21;//模块一正捕获
CR=1;
//开计数列阵
EA=1;
//开总中断
}
void
pca()interrupt
7
{
if(CCF0==1)
{
CCF0=0;
//清零模块中断标志位
miao++;
}
if(CCF1==1)
{
CCF1=0;
//清零模块中断标志位
miao--;
}
}
//////////////////////////定时器模式////////////////////
#include;
#include"pcatime.h"
unsigned
intvalue;
//数组赋值
unsignedcharptime;
//ptime=0xb402;50ms定时0x240010ms
void
initPCATime()
{
CCON=0X00;
//标志位清零
CL=0;
//pcaL列阵清零
CH=0;
//PCAH列阵清零
CMOD=0X00;
//选择时钟模式
CCAP1L=value;
//先赋值高位
CCAP1H=value>;>;8;//赋值
CCAPM1=0X49;
//允许比较器ECOM1,MAT1、ECCF1置位允许CCF1中断
CR=1;
//允许列阵
EA=1;
//开总中断
}
void
pcatime()interrupt7//两个PCA模块都是中断7
{
unsigned
inti;
CL=0;
//清零不然是溢出时钟,定时无效
CH=0;
//清零不然是溢出时钟,定时无效
CCF1=0;
CCAP1L=value;
CCAP1H=value>;>;8;
i++;
if(i>;=20)
{
i=0;
ptime++;
}
}
///////////////////////PWM模式//////////////////////
#include"12c5a60s2.h"
#include"12c5apwm.h"
void
initPWM(void)
{
CCON=0;
//关闭PCA计数及标志位清零
CL=0;
//清空pca计数低位
CH=0;
//清空pca计数高位
CMOD=0X08;
//用系统时钟不分频
//CCAP0H=CCAP0L=0x01;//模块0复初值
CCAPM0=0X42;
//允许模块0比较器工作,脉宽调制模式
//CCAP1H=CCAP1L=0X01;//模块1复初值
CCAPM1=0X42;
//允许模块1比较器工作,脉宽调制模式
CR=1;
//启动pca计数
}
voidtiaoj(unsigned
charpwmH,unsignedcharpwmL)
{
CCAP0H=CCAP0L=pwmH;//模块0复值
CCAP1H=CCAP1L=pwmL;//模块1复值
}
/**********************EEPROM*************************/
#include;
#include;
#include"eeporm.h"
#define
Rdeeprom0x01
#define
Wreeprom0x02
#define
ERSeeprom0x03
#define
WTime
0x01//0x020x030x00
sfrISP_DATA=0Xc2;
sfrISP_ADDRH=0Xc3;
sfrISP_ADDRL=0Xc4;
sfrISP_CMD=0Xc5;
sfrISP_TRIG=0Xc6;
sfrISP_CONTR=0Xc7;
unsignedcharmiao,miao2,miao3;
bitint0flag;
voidISP_Open(void)
{
EA=0;
//关中断
ISP_CONTR=ISP_CONTR&0X18;//清零
ISP_CONTR=ISP_CONTR|WTime;//等待时间
ISP_CONTR=ISP_CONTR|0x80;//使能ISP
}
voidISP_Close(void)
{
ISP_CONTR=ISP_CONTR&0X7F;//停止ISP使能
ISP_TRIG=0X00;
//命令触发寄存器清零
EA=1;
//开中断
}
voidISP_Goon(void)
{
//打开ISP
ISP_Open();
ISP_TRIG=0x5a;
//写触发命令
ISP_TRIG=0xa5;
//写触发命令
_nop_();
//等待
}
void
byte_write(unsignedintadd,unsignedchardat)//写某地址数据
{
ISP_ADDRH=(unsigned
char)(add>;>;8);
//地址高位
ISP_ADDRL=(unsigned
char)(add&0x00ff);
//地址低位
ISP_CMD=ISP_CMD&0XF8;
//命令模式复位
ISP_CMD=ISP_CMD|Wreeprom;
//写命令
ISP_DATA=dat;
//读写寄存器赋值
ISP_Goon();
//打开、触发
ISP_Close();
_nop_();
//关闭
}
void
sector(unsignedintadd)
{
ISP_ADDRH=(unsigned
char)(add>;>;8);
//地址高位
ISP_ADDRL=0x00;
//地址低位
ISP_CMD=ISP_CMD&0XF8;
//命令模式复位
ISP_CMD=ISP_CMD|ERSeeprom;
//删命令
ISP_Goon();
//打开、触发
ISP_Close();
_nop_();
}
unsigned
charbyte_read(unsignedintadd)
{
ISP_ADDRH=(unsigned
char)(add>;>;8);
//地址高位
ISP_ADDRL=(unsigned
char)(add&0x00ff);
//地址低位
ISP_CMD=ISP_CMD&0XF8;
//命令模式复位
ISP_CMD=ISP_CMD|Rdeeprom;
//读命令
ISP_Goon();
//打开、触发
ISP_Close();
_nop_();
return(ISP_DATA);
}
void
initc()
{
IT0=1;
EX0=1;
EA=1;
}
void
int0()interrupt0
{
if(int0flag==1)
{
EA=0;
sector(0x00ff);//0000h-03ffh
byte_write(0X00ff,miao3);
EA=1;
}
}
/////////////////////////////////////////////////////////
写的一般,不足之处还望包涵,均测试通过,欢迎提好的建议。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STC12C5A60S2 模块 应用 分享 大家
![提示](https://static.bdocx.com/images/bang_tan.gif)