|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
P89LPC900单片机演示程序:用TRIM寄存器调整片内RC振荡器的频率 |
作者:LPC900 栏目:MCU技术 |
/* 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 于 2005/10/18 8:38:00 发布:
程序中有两条语句是多余的 它们是: #define CCLK 7372800L #define BaudRate 9600L 实际上,程序中并没有用到UART串行口。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |