专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

STC12C5A60S2各模块的应用分享大家

作者:huqin   来源:本站原创   点击数:  更新时间:2014年04月01日   【字体:

/*****************串口应用 ******************/
///////////////////串口一
//////////////                         
#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<intrins.h>
//寄存器地址声明 ,有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;     //开总中断
}
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<intrins.h>
#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;     
 } 
}
/////////////////////////////////////////////////////////
写的一般,不足之处还望包涵,均测试通过,欢迎提好的建议。
关闭窗口

相关文章