登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

P89LPC900单片机演示程序:用TRIM寄存器调整片内RC振荡器的频率

作者:LPC900 栏目:MCU技术
P89LPC900单片机演示程序:用TRIM寄存器调整片内RC振荡器的频率
/*
P89LPC900单片机实验程序:
    用TRIM寄存器调整RC振荡器频率
知识点:
    在LPC900单片机中,TRIM寄存器(SFR地址:96H)的第0~5位是TRIM值,可以
    用来调整片内RC振荡器地频率。复位时,TRIM寄存器载入出厂预编程值。在芯
    片封装测试阶段已经把RC振荡器的频率调到了7.3728MHZ的标称,精度可达1%。
    用户一般不需要去调整TRIM值,但如果有特殊需求时也可以通过修改TRIM值来
    调整RC振荡器的频率。当增加TRIM值时,频率是减小的。
实验说明:
    采用DP-932A1开发实验仪做实验(如果没有购买,也可以自己临时搭块实验板)
    跳线J4接KEY1(P0.0),J26接KEY2(P0.1)
    跳线J13接MISI(P2.2),J16接SS(P2.4),J17接SPICLK(P2.5)
    用MiniICP在线下载程序,振荡器类型选则内部RC振荡器
    程序运行后用频率计或示波器观测XTAL2引脚,标称频率为3.6864MHZ
    按KEY1和KEY2键增大和减小TRIM值,输出频率相应减小和增大
    TRIM的值以串行方式输出到74HC595,并以LED灯的方式显示出来
*/



#include <REG932.H>


#define CCLK        7372800L
#define BaudRate    9600L


//定义I/O接口
sbit KEY1 = P0^0;            //按键1,使TRIM值增加
sbit KEY2 = P0^1;            //按键2,使TRIM值减小
sbit HC595_SH_CLK = P2^5;    //74HC595的移位时钟,上升沿有效
sbit HC595_DAT = P2^2;        //74HC595的移位数据
sbit HC595_ST_CLK = P2^4;    //74HC595的输出时钟,上升沿有效


/*
函数:Delay()
功能:延时0.001~65.536s
参数:
    t>0时,延时(t*0.001)s
    t=0时,延时65.536s
说明:
    CPU时钟=7.3728MHZ
    使用之前,应当把T0设置成模式1,即16位定时器模式
*/

void Delay(unsigned int t)
{
    do
    {
        TH0 = 0xF1;
        TL0 = 0x9A+16;
        TR0 = 1;
        while ( !TF0 );
        TF0 = 0;
        TR0 = 0;
    } while ( --t != 0 );
}


//键盘扫描
CHAR KeyScan()
{
    if ( KEY1 == 0 ) return '+';
    if ( KEY2 == 0 ) return '-';
    return '\0';
}


//输出数据到74HC595
void Put595(CHAR c)
{
    unsigned CHAR n;
    c = ~c;        //LED是低电平点亮的,所以先要按位取反
    n = 8;
    do
    {
        HC595_DAT = (bit)(c & 0x01);
        c >>= 1;
        HC595_SH_CLK = 1;
        HC595_SH_CLK = 0;
    }while ( --n != 0 );
    HC595_ST_CLK = 1;
    HC595_ST_CLK = 0;
}


//系统初始化
void SysInit()
{
//设置T0为16位定时器
    TMOD &= 0xF0;
    TMOD |= 0x01;
//设置KEY1和KEY2对应的P0.0和P0.1引脚为准双向I/O模式
    P0M1 &= 0xFC;
    P0M2 &= 0xFC;
//设置操作74HC595的I/O口为准双向模式并初始化
    P2M1 &= 0xCB;
    P2M2 &= 0xCB;
    HC595_SH_CLK = 0;
    HC595_DAT = 0;
    HC595_ST_CLK = 0;
//P3.0/XTAL2设置为准双向I/O模式
    P3M1 &= 0xFE;
    P3M2 &= 0xFE;
//使能TRIM寄存器中的ENCLK位,使P3.0引脚输出频率为CCLK/2的方波振荡
    TRIM |= 0x40;
//输出TRIM值
    Put595(TRIM & 0x3F);
}


void main()
{
    unsigned CHAR a,b;    //临时变量
    CHAR key;
    SysInit();
    for (;;)
    {
    //键盘扫描
        for (;;)
        {
            Delay(50);
            key = KeyScan();
            if ( key != '\0' ) break;
        }
    //处理按键
        a = TRIM & 0xC0;
        b = TRIM & 0x3F;
        SWITCH (key)
        {
        case '+':
            if ( b < 63 ) b++;
            break;
        case '-':
            if ( b > 0 ) b--;
            break;
        default:
            break;<
2楼: >>参与讨论
LPC900
程序中有两条语句是多余的
它们是:
#define CCLK        7372800L
#define BaudRate    9600L
实际上,程序中并没有用到UART串行口。

参与讨论
昵称:
讨论内容:
 
 
相关帖子
原来LPC938没有CCU?
借我一双慧眼吧,让我把这LPC938看得明明白白清清楚楚真真切切…
Uart扩展的利器
看看我自制的微型MiniICP插头,比原装的小80%
你知道吗——LPC9xx的UART有专门的波特率发生器,不再占用定时器
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号