STC12C5A60S2各模块的应用分享大家

发布者:RoboPilot最新更新时间:2015-03-11 来源: 51hei关键字: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   char date)
{
 SBUF=date;
 while(!TI);
 TI=0;
}
void  work()
{
 sendDate(buf[0]);
 sendDate(buf[1]);
}
void   res()interrupt  4
{
 buf[g++]=SBUF;
 if(g>=2) 
 {
  g=0;
  work();
 }
 while(!RI);
 RI=0;
}
 ////////////////////串口二////////////////
#include<12c5a60s2.h>
#include"uart2.h"
#define   S2TI  0X02    //不能位寻址
#define   S2RI  0X01    //不能位寻址
unsigned  char   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(unsigned  char  date)
{
 S2BUF=date;       //判断是否是一
 if(S2CON&S2TI)      //清零
 S2CON&=~S2TI; 
}
void  uart2r()interrupt  8
{
 if(S2CON&S2RI)    //判断是否是一
 {
  S2CON&=~S2RI;   //清零
     shuzhi=S2BUF;
  senddate(0x40);
  
  }

 /******************AD转换*************************/ 
 #include"12c5a60s2.h"
#include"12c5aad.h"
#include
//寄存器地址声明 ,有12c5a60s2  头文件可省略
//sfr  ADC_CONTR  =0XBC;
//sfr  ADC_RES  =0XBD;
//sfr  ADC_ERSL  =0XBE;
//sfr  P1ASF =0X9D;
//宏定义
#define ADC_POWER  0X80    // ad电源控制位  
#define ADC_FLAG    0x10            //ad转换结束标志位
#define ADC_START   0x08            //ad转换开始控制位
#define ADC_SPEEDLL 0x00            //540 转换速率
#define ADC_SPEEDL  0x20            //360 转换速率
#define ADC_SPEEDH  0x40            //180 转换速率
#define ADC_SPEEDHH 0x60            //90 转换速率

//ad转换延时函数
void   delayad(unsigned   int  z)
{
 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   char  getAD(unsigned  char  ch)  //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置置零
  return  ADC_RES;  
}
 /********************PCA/PWM*****************/
 /////////////////////中断模式/////////////////////
#include<12c5a60s2.h>
#include"pcaint.h"
unsigned  char miao;
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<12c5a60s2.h>
#include"pcatime.h"
unsigned   int value;    //数组赋值
unsigned  char  ptime;
//ptime=0xb402; 50ms定时 0x2400 10ms
void   initPCATime()
{
 CCON=0X00;    //标志位清零 
 CL=0;     //pca L列阵清零
 CH=0;     //PCA H列阵清零
 CMOD=0X00;    //选择时钟模式
 CCAP1L=value;    //先赋值高位
 CCAP1H=value>>8;  //赋值
 CCAPM1=0X49;  //允许比较器ECOM1,MAT1、ECCF1置位允许CCF1中断
 CR=1;     //允许列阵
 EA=1;     //开总中断
}[page]
void   pcatime()interrupt  7//两个PCA模块都是中断7
{
 unsigned   int  i;
  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计数
}
void  tiaoj(unsigned   char pwmH,unsigned  char pwmL)
{
  CCAP0H=CCAP0L=pwmH;// 模块0复值
  CCAP1H=CCAP1L=pwmL;// 模块1复值
}
 /**********************EEPROM*************************/
#include<12c5a60s2.h>
#include
#include"eeporm.h"
#define   Rdeeprom 0x01 
#define   Wreeprom 0x02 
#define   ERSeeprom 0x03 
#define   WTime     0x01  // 0x02  0x03 0x00 
sfr ISP_DATA=0Xc2;
sfr ISP_ADDRH=0Xc3;
sfr ISP_ADDRL=0Xc4;
sfr ISP_CMD=0Xc5;
sfr ISP_TRIG=0Xc6;
sfr ISP_CONTR=0Xc7;
unsigned  char  miao,miao2,miao3;
bit  int0flag;
void  ISP_Open(void)
{
 EA=0;      //关中断
 ISP_CONTR=ISP_CONTR&0X18; //清零
 ISP_CONTR=ISP_CONTR|WTime; //等待时间
 ISP_CONTR=ISP_CONTR|0x80; //使能ISP
}
void  ISP_Close(void)
{
 ISP_CONTR=ISP_CONTR&0X7F;  //停止ISP使能
 ISP_TRIG=0X00;      //命令触发寄存器清零
 EA=1;        //开中断
}
void  ISP_Goon(void)
{          //打开ISP
 ISP_Open();
 ISP_TRIG=0x5a;     //写触发命令
 ISP_TRIG=0xa5;     //写触发命令
 _nop_();
//等待
}
void   byte_write(unsigned  int add,unsigned  char dat)  //写某地址数据
{
 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(unsigned  int add)
{
 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   char byte_read(unsigned  int  add)
{
 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()interrupt 0
{  
 if(int0flag==1)
 {      
  EA=0;
  sector(0x00ff);   //0000h-03ffh
  byte_write(0X00ff,miao3);
  EA=1;      
 } 
}
/////////////////////////////////////////////////////////
写的一般,不足之处还望包涵,均测试通过,欢迎提好的建议。
关键字:STC12C5A60S2 引用地址:STC12C5A60S2各模块的应用分享大家

上一篇:IEEE32数据传输格式分解
下一篇:单片机按键处理程序(长按 短按 松手检测)

推荐阅读最新更新时间:2024-03-16 13:54

STC12C5A60S2系列双串口1T 8051单片机头文件
//-------------------------------------------------------------------------------- //新一代 1T 8051系列 单片机内核特殊功能寄存器 C51 Core SFRs // 7 6 5 4 3 2 1 0 Reset Value sfr ACC = 0xE0; //Accumulator 0000,0000 sfr B = 0xF0; //B Register
[单片机]
stc12c5a60s2单片机spwm发生程序带仿真文件
包含文件和仿真文件的下载地址:http://www.51hei.com/f/stc12c5a60s2_spwm.zip 下面是主程序部分: #include stc.h #include sin.h #define uint unsigned int uchar index; uchar a; void init_pca(void)//pca计数器初始化函数 { CMOD=0x04;//计数器0的溢出为PCA计数器的时钟源 CCON=0x00; CCAPM0=0x42;//8位PWM输出,无中断 CL=0x00;//清零pca计数器 CH=0x00; CCAP0L=pwm ; //初始化spwm输出的占空比
[单片机]
stc12c5a60s2单片机简单实现DHT11源程序
网络上有很多实现DHT11的程序,单大多都是89c52的。而有关stc12c5a60s2的很少。 本人是新手一枚,在写关于stc12串口接收dht11数据时,发现接收到的都是0。 这是为什么呢?在网上查了一堆资料后,明白是时序的原因。 stc12系列的处理速度比89c52的速度快,且我们写的延时函数所延时的时间与参数不成正比。需要示波器。 硬件:芯片:stc12c5a60s2 晶振:110592mhz 部分代码: main.c中: DHT11数据读取 串口发送 波特率9600 STC12C5A60S2 /**************************************************/ #incl
[单片机]
STC12C5A60S2单片机IO口工作模式设定
STC12C5A60S2单片机IO口工作模式设定   STC12C5A60S2 系列单片机其所有I/O口均可由软件配置成4种工作类型之一。4种类型分别为:准双向口(标准8051 输出模式)、推挽输出、仅为输入(高阻)或开漏输出功能。 每个口由2个控制寄存器中的相应位控制每个引脚工作类型。 STC12C5A60S2系列单片机上电复位后为准双向口(传统8051的I/O口)模式。2V以上时为高电平,0.8V以下时为低电平。 I/O口工作类型设定 PxM1 PxM0 I/O 口模式 0 0 准双向口 (传统 8051I/O口模式 ),灌电流可达20mA, 拉电流为230uA 0 1
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved