/*****************串口应用 ******************/
///////////////////串口一//////////////
#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;
}
}
/////////////////////////////////////////////////////////
写的一般,不足之处还望包涵,均测试通过,欢迎提好的建议。