/*****************串口應(yīng)用 ******************/
///////////////////串口一//////////////
#include"12c5a60s2.h"
#include"uart.h"
unsigned char buf[3],g;
void initUart()
{
EA=1;
BRT=0XFD; //獨立波特率發(fā)生器9600
AUXR=0X11; //啟動獨立波特率發(fā)生器,12分頻
// TMOD=0X20; //用定時器1做波特率發(fā)生器
// 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; //使用波特率獨立發(fā)生器 12分頻 9600
// AUXR=0X19; //使用波特率獨立發(fā)生器 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轉(zhuǎn)換*************************/
#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轉(zhuǎn)換結(jié)束標(biāo)志位
#define ADC_START 0x08 //ad轉(zhuǎn)換開始控制位
#define ADC_SPEEDLL 0x00 //540 轉(zhuǎn)換速率
#define ADC_SPEEDL 0x20 //360 轉(zhuǎn)換速率
#define ADC_SPEEDH 0x40 //180 轉(zhuǎn)換速率
#define ADC_SPEEDHH 0x60 //90 轉(zhuǎn)換速率
void delayad(unsigned int z)
{
unsigned int x,y;
for(x=5000;x>0;x--)
for(y=z;y>0;y--);
}
void initad()
{
P1ASF=0XFF;//設(shè)置P1口為ad轉(zhuǎn)換模式
ADC_RES=0;//ad轉(zhuǎn)換結(jié)果寄存器清零
ADC_CONTR=ADC_POWER|ADC_SPEEDLL; //打開ad轉(zhuǎn)換電源 ,最慢頻率
delayad(2); //延時待電源穩(wěn)定提高精確性
}
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轉(zhuǎn)換完成 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; //開計數(shù)列陣
EA=1; //開總中斷
}
void pca()interrupt 7
{
if(CCF0==1)
{
CCF0=0; //清零模塊中斷標(biāo)志位
miao++;
}
if(CCF1==1)
{
CCF1=0; //清零模塊中斷標(biāo)志位
miao--;
}
}
//////////////////////////定時器模式////////////////////
#include<12c5a60s2.h>
#include"pcatime.h"
unsigned int value; //數(shù)組賦值
unsigned char ptime;
//ptime=0xb402; 50ms定時 0x2400 10ms
void initPCATime()
{
CCON=0X00; //標(biāo)志位清零
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; //關(guān)閉PCA計數(shù)及標(biāo)志位清零
CL=0; // 清空pca計數(shù)低位
CH=0; // 清空pca計數(shù)高位
CMOD=0X08; // 用系統(tǒng)時鐘 不分頻
// CCAP0H=CCAP0L=0x01; // 模塊0復(fù)初值
CCAPM0=0X42; //允許模塊0比較器工作,脈寬調(diào)制模式
// CCAP1H=CCAP1L=0X01; //模塊1復(fù)初值
CCAPM1=0X42; //允許模塊1比較器工作,脈寬調(diào)制模式
CR=1; //啟動pca計數(shù)
}
void tiaoj(unsigned char pwmH,unsigned char pwmL)
{
CCAP0H=CCAP0L=pwmH;// 模塊0復(fù)值
CCAP1H=CCAP1L=pwmL;// 模塊1復(fù)值
}
/**********************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_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; //關(guān)中斷
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; //命令觸發(fā)寄存器清零
EA=1; //開中斷
}
void ISP_Goon(void)
{ //打開ISP
ISP_Open();
ISP_TRIG=0x5a; //寫觸發(fā)命令
ISP_TRIG=0xa5; //寫觸發(fā)命令
_nop_();
//等待
}
void byte_write(unsigned int add,unsigned char dat) //寫某地址數(shù)據(jù)
{
ISP_ADDRH=(unsigned char)(add>>8); //地址高位
ISP_ADDRL=(unsigned char)(add&0x00ff); //地址低位
ISP_CMD=ISP_CMD&0XF8; //命令模式復(fù)位
ISP_CMD=ISP_CMD|Wreeprom; //寫命令
ISP_DATA=dat; //讀寫寄存器賦值
ISP_Goon(); //打開、觸發(fā)
ISP_Close();
_nop_(); //關(guān)閉
}
void sector(unsigned int add)
{
ISP_ADDRH=(unsigned char)(add>>8); //地址高位
ISP_ADDRL=0x00; //地址低位
ISP_CMD=ISP_CMD&0XF8; //命令模式復(fù)位
ISP_CMD=ISP_CMD|ERSeeprom; //刪命令
ISP_Goon(); //打開、觸發(fā)
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; //命令模式復(fù)位
ISP_CMD=ISP_CMD|Rdeeprom; //讀命令
ISP_Goon(); //打開、觸發(fā)
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;
}
}
/////////////////////////////////////////////////////////
寫的一般,不足之處還望包涵,均測試通過,歡迎提好的建議。