實驗六 PCA實驗
一、實驗目的
1. 了解單片機的PCA的工作原理。
2. 掌握單片機的PCA的應用。
二、實驗內容
//1. 用單片機的PCA模塊實現一個簡單的電子時鐘。要求通過UART把時間發送出來,每秒更新一次并換行,時間格式為:hh:mm:ss。
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned char uchar;
typedef unsigned int uint;
#include <stc15.h>
#include <intrins.h>
#define FOSC (11059200)
#define TMS(t) (t*FOSC/12000)
#define THZ(hz) (FOSC/24/hz)
//void SmgInit();
void PcaInit();
void UartInit(void); //19200bps@11.0592MHz
void UartSend( u8 dat );
// uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
// uchar wei=1;
u8 addr=0x00;
u8 rxdbuf[20];
u8 uart = 0;
u8 txd=0;
uint val0 = TMS(1000);
uint val1 = TMS(2);
uint val2 = THZ(100);
uchar s=55, m=59, h=23;
uint ms=0;
void main()
{
// SmgInit();
PcaInit();
UartInit(); //19200bps@11.0592MHz
UartSend(0x66);
EA=1;
while(1)
{
}
}
// void SmgInit()
// {
// P0M0 |= 0xF0;
// P0M1 &= 0x0F;
// P1M0 = 0xFF;
// P1M1 = 0x00;
// }
void PcaInit()
{
CMOD = 0x00;
CL = 0;
CH = 0;
CCAP0L = val0;
CCAP0H = val0>>8;
val0 = val0 + TMS(1000);
CCAPM0 = 0x49;
CCAP1L = val1;
CCAP1H = val1>>8;
val1 = val1 + TMS(2);
CCAPM1 = 0x49;
CCAP2L = val2;
CCAP2H = val2>>8;
val2 = val2 + THZ(100);
CCAPM2 = 0x4D;
CCON = 0x40;
}
void PcaSevr() interrupt 7
{
if( CCF0==1 )
{
// UartSend(h%10+'0');
CCF0 = 0;
CCAP0L = val0;
CCAP0H = val0>>8;
val0 = val0 + TMS(1000);
UartSend('h');
UartSend('h');
UartSend(':');
UartSend(h/10%10);
UartSend(h%10);
UartSend('m');
UartSend('m');
UartSend(':');
UartSend(m/10%10);
UartSend(m%10);
UartSend('s');
UartSend('s');
UartSend(':');
UartSend(s/10%10);
UartSend(s%10);
}
if( CCF1==1 )
{
CCF1 = 0;
CCAP1L = val1;
CCAP1H = val1>>8;
val1 = val1 + TMS(2);
ms++;
if( ms>=500 )
{
ms = 0;
s++;
if( s>=60 )
{
s = 0;
m++;
if( m>=60 )
{
m = 0;
h++;
if( h>=24 )
{
h = 0;
}
}
}
}
// switch( wei )
// {
// case 1:
// P07 = 1;
// P1 = tab[h/10%10];
// P04 = 0;
// wei = 2;
// break;
// case 2:
// P04 = 1;
// if( ms<10 )
// {
// P1 = tab[h%10] | 0x80;
// }
// else
// {
// P1 = tab[h%10];
// }
// P05 = 0;
// wei = 3;
// break;
// case 3:
// P05 = 1;
// P1 = tab[m/10%10];
// P06 = 0;
// wei = 4;
// break;
// case 4:
// P06 = 1;
// P1 = tab[m%10];
// P07 = 0;
// wei = 1;
// break;
// }
}
if( CCF2==1 )
{
CCF2 = 0;
CCAP2L = val2;
CCAP2H = val2>>8;
val2 = val2 + THZ(100);
}
}
///////////////////////////////////////////////////////////
void UartInit(void) //19200bps@11.0592MHz
{
SCON = 0x50; //8位數據,可變波特率
AUXR |= 0x01; //串口1選擇定時器2為波特率發生器
AUXR |= 0x04; //定時器2時鐘為Fosc,即1T
T2L = 0x70; //設定定時初值
T2H = 0xFF; //設定定時初值
ES = 1; //打開串口1的中斷
AUXR |= 0x10; //啟動定時器2
}
void UartSend( u8 dat )
{
while( txd==1 );
SBUF = dat;
txd = 1;
}
//串口自動下載命令:96 69 00 ff 02 fd 5a a5 ff
void Uart2Sevr() interrupt 4
{
static u8 zt=0, bz=0;
static u8 num=0, sum=0;
u8 ch;
if( RI )
{
RI = 0;
ch = SBUF;
switch( zt )
{
case 0://初始狀態
if( ch==0x96 )
{
zt = 1;
}
break;
case 1://同步狀態
if( ch==0x69 )
{
zt = 2;
}
else
{
zt = 0;
}
break;
case 2://地址認證狀態
if( bz==0 )
{
if( ch==addr )
{
bz = 1;
}
else
{
zt = 0;
}
}
else
{
if( ch==~addr )
{
zt = 3;
}
else
{
zt = 0;
}
bz = 0;
}
break;
case 3://長度認證狀態
if( bz==0 )
{
rxdbuf[0] = ch;
bz = 1;
}
else
{
if( ch==~rxdbuf[0] )
{
zt = 4;
num = 1;
sum = 0;
}
else
{
zt = 0;
}
bz = 0;
}
break;
case 4://數據接收狀態
rxdbuf[num++] = ch;
sum = sum + ch;
if( num>rxdbuf[0] )
{
zt = 5;
}
break;
case 5://數據累加和校驗狀態
if( sum == ch )
{
if( (rxdbuf[1]==0x5a)&&(rxdbuf[2]==0xa5) )
{
IAP_CONTR = 0x60;
}
uart = 1;
}
zt = 0;
break;
}
}
if( TI )
{
TI = 0;
txd = 0;
}
}
|