找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1684|回复: 0
收起左侧

单片机的PCA模块实现电子时钟程序 通过UART把时间发送出来

[复制链接]
ID:451507 发表于 2018-12-21 14:14 | 显示全部楼层 |阅读模式
实验六 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;
    }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表