实时时钟的演示:毫秒级计时输出;串口输出;中断的使用

发布者:tony520最新更新时间:2021-10-14 来源: eefocus关键字:实时时钟  串口输出  中断 手机看文章 扫描二维码
随时随地手机看文章

/**************************************************************************************
龙丘MC9S12XS128 多功能开发板
Designed by Chiu Sir
E-mail:chiusir@163.com
软件版本:V1.1
最后更新:2009年2月28日
相关信息参考下列地址:
博客:  http://longqiu.21ic.org
淘宝店:http://shop36265907.taobao.com
------------------------------------
Code Warrior 4.7
Target : MC9S12XS128
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz

演示程序使用说明:
1.实时时钟的演示:
2.毫秒级计时输出;
3.串口输出速率:9600bps.
4.中断的使用。
*****************************************************************************************/
 
#i nclude      
#i nclude    
#i nclude
#pragma LINK_INFO DERIVATIVE "mc9s12xs128" 

volatile dword u32_time_cnt=0;    

//====================中断函数==================================  

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 7 RTI_ISR(void) {   // 32.75ms timer overflow  
  ++u32_time_cnt;        
  PORTB_PB2=~PORTB_PB2;
  CRGFLG|=0X80;//Write 1 to clear RTIF bit  
}


// 函 数 名: void DLY_ms(word x)
// 功能描述: 毫秒级延时
void DLY_ms(int ms)  //x取值1~255;
{
  int ii,jj;
   if (ms<1) ms=1;
   for(ii=0;ii     for(jj=0;jj<2770;jj++);    //32MHz--1ms 
}
//-----------------------------------------------------
static void Port_Init(void)

    DDRA = 0xff; 
    PORTA= 0x00;         
    DDRB = 0xff;  //LED  PTB0--7,
    PORTB= 0xff;  //LEDs off 
}
//-----------------------------------------------------
static void SCI_Init(void)
{
    SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable
    SCI0BDH=0x00; //busclk  8MHz,19200bps,SCI0BDL=0x1a
    SCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)                  
                  //busclk 16MHz, 9600bps,SCI0BDL=0x68                  
}                
void uart_putchar(unsigned char ch)
{
  if (ch == '/n') 
  {
      while(!(SCI0SR1&0x80)) ;    
      SCI0DRL= 0x0d;            //output'CR'
     return;
  }
  while(!(SCI0SR1&0x80)) ;       //keep waiting when not empty 
  SCI0DRL=ch;
}

void putstr(char ch[])
{
  unsigned char ptr=0;
  while(ch[ptr]){
      uart_putchar((unsigned char)ch[ptr++]);
  }
}
// setup of the RTI interrupt frequency    
static void RTI_Init(void)
{              
    RTICTL=0x77;   //8x2^16 =>32,75ms,30.5175Hz                    
    //CRGINT=0X80;   //enable RTI Interrupt
    CRGINT=0X80;   //enable RTI Interrupt
}
// PLL初始化子程序   BUS Clock=16M
void setbusclock(void)
{  
   CLKSEL=0X00;    // disengage PLL to system
    PLLCTL_PLLON=1;   // turn on PLL
    SYNR=0x00 | 0x01;  // VCOFRQ[7:6];SYNDIV[5:0]
                        // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
                        // fPLL= fVCO/(2 × POSTDIV)
                        // fBUS= fPLL/2
                        // VCOCLK Frequency Ranges  VCOFRQ[7:6]
                        // 32MHz <= fVCO <= 48MHz    00
                        // 48MHz <  fVCO <= 80MHz    01
                        // Reserved                  10
                        // 80MHz <  fVCO <= 120MHz   11    
    REFDV=0x80 | 0x01;  // REFFRQ[7:6];REFDIV[5:0]
                        // fREF=fOSC/(REFDIV + 1)
                        // REFCLK Frequency Ranges  REFFRQ[7:6]
                        // 1MHz <= fREF <=  2MHz       00
                        // 2MHz <  fREF <=  6MHz       01
                        // 6MHz <  fREF <= 12MHz       10
                        // fREF >  12MHz               11                        
                        // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
    POSTDIV=0x00;       // 4:0, fPLL= fVCO/(2xPOSTDIV)
                        // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).
    _asm(nop);          // BUS CLOCK=16M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;          //engage PLL to system; }
//-----------------------------------------------------
#pragma CODE_SEG DEFAULT
void Init_Dev(void)
{
    setbusclock();
    Port_Init();
    SCI_Init();     
    RTI_Init();
}

//====================main()==================================
#pragma CODE_SEG DEFAULT    
void main(void)   
{
  
  char  txtbuf[66]="";
  byte  u8_mintes=0;
  word  u16_sec=0,u16_ms=0;   
   
  Init_Dev(); 
  PORTB=0x00;
  putstr("/nLongQiu s.&t. Co. Ltd.");   
  putstr("/nhttp://shop36265907.taobao.com");   
  DLY_ms(1000);    
  PORTB=0xFF;
  EnableInterrupts;   
  for(;;)
  {
//----------时钟计时器---------------------------------
    u16_sec=u32_time_cnt*131/4;//理论值为32.75ms,时间计算部分 
    u16_ms=u16_sec%1000;       
    u16_sec=u16_sec/1000;   
    sprintf(txtbuf,"/n%d:%02ds-%03dms ",u8_mintes,u16_sec,u16_ms);    
    putstr(txtbuf);          
    if(u16_sec>58)
    {
      u8_mintes++;
      u32_time_cnt=0;
    }
//--------------------------------------------------------   
    PORTB_PB0=~PORTB_PB0;
    DLY_ms(50);        
  }//for(;;)
} //main


关键字:实时时钟  串口输出  中断 引用地址:实时时钟的演示:毫秒级计时输出;串口输出;中断的使用

上一篇:mc9s12dg128使用定时器的输出比较产生定时中断代码亮1S灭1S
下一篇:freescale codewarrior编译器的使用

推荐阅读最新更新时间:2024-11-22 10:17

关于单片机 C中断函数
定义中断服务函数 函数类型 函数名 (形式参数) interrupt n 中断号 中断源 中断向量 0 外部中断0 0003H 1 定时器/计数器0 000BH 2 外部中断1 0013H 3 定时器/计数器1 001BH 4 串行口 0023H interrupt 关键字是不可缺少的,由它告诉编译器该函数是中断服务函数,并由后面的 n 指明所使用的中断号。n 的取值范围为0-31,但具体的中断号要取决于芯片的型号,像 AT89C51 实际上就使用0-4 号中断。每个中断号都对应一个中断向量,具体地址为8n+3, 中断源响应后处
[单片机]
中断的响应,两级中断嵌套,中断优先级别设置
;知识要点:中断的应用;熟悉中断的地址入口,中断的返回与响应;中断的优先级 ;开始主程序数码管显示0,按p32显示1,延时10秒返回主程序 ;按p33显示2 延时2秒返回主程序, ;如果按p32显示1后再按p33,那么显示完成后继续显示1,完成后返回主程序显示0 ;由于p33的优先级别高, 首先响应,请仔细体会这个程序 ORG 0000H LJMP MAIN;跳到主程序 ORG 0003H;中断0 入口 LJMP INSER0;到中断服务0 ORG 0013H;中断1入口地址 LJMP INSER1;到中断服
[单片机]
<font color='red'>中断</font>的响应,两级<font color='red'>中断</font>嵌套,<font color='red'>中断</font>优先级别设置
AVR的中断应用设计要点
AVR的中断源比较多,尤其是ATmega128,一共有35个外部以及内部中断源。通常情况下,Flash程序存储器空间的最低位置(0x0000-0x0045)定义为复位和中断向量空间。完整的中断向量见第二章表2-23。在中断向量表中,处于低地址的中断向量所对应的中断拥有高优先级,所以,系统复位RESET拥有最高优先级。 A.中断设计注意点: 1.具备Bootloader功能的AVR,其中断向量区可以在Flash程序存储器空间最低位置和Bootloader区的头部来回迁移,这主要用于配合Bootloader程序的应用。如果不使用Bootloader功能,一般不要中断向量区进行迁移。 2.Flash较小的AVR芯片,其一个中断向量占
[单片机]
GYJ-0126-A-NPN 16路输入输出可编程晶体管工控 串口485通讯
*********************************************************************/ #include hedder\STC12C5A60S2.h #include hedder\DODI.h #define uchar unsigned char #define uint unsigned int uchar dat; /******************************************************************** 串口初始化 ******************************
[单片机]
GYJ-0126-A-NPN 16路输入<font color='red'>输出</font>可编程晶体管工控 <font color='red'>串口</font>485通讯
PIC单片机中断程序的设计技巧总结
所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般
[单片机]
1天搞定单片机中断——基础知识大全
注意: Stc89c51/52单片机的P0口为开漏输出,若作为普通I/O口试,需要加上拉电阻,不然输出不了高电平。(注:P1、P2、P3都是准双向输出) 其中上拉电阻的作用: 1、加大普通IO口的驱动能力。 2、起到限流的作用。 3、抵抗电磁干扰。 1、单片机时钟时序单位(晶振周期/拍节、状态、机器周期、指令周期): 2、单片机最小系统组成5部分:单片机、晶振电路、复位电路、电源电路、下载电路 3、单片机引脚解释:单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。 ⒈ 电源: ⑴ VCC - 芯片电源,接+5V; ⑵ VSS - 接地端; ⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端
[单片机]
1天搞定单片机<font color='red'>中断</font>——基础知识大全
STM32单片机(2) 外部中断
学习资料 李想stm32视频教程49集 http://pan.baidu.com/s/1kTyt03P STM32的中断(上中下)外部中断(寄存器、库函数) STM32的函数说明(中文).pdf http://download.csdn.net/detail/leytton/7630851 中断管理函数.pdf http://wenku.baidu.com/view/b90e5b82360cba1aa811dad3.html 概念基础 STM32共76个中断,16个内核中断,60个外部中断,即可屏蔽中断 中断分5组:0-4,所有中断只能放在同一组里 ISER 、ISER 是32位的中断使能寄存器数组,ISER 的bi
[单片机]
STM32单片机(2) 外部<font color='red'>中断</font>
51 单片机的定时器中断寄存器
中断是为使单片机具有对外部或内部随机发生的事件进行处理而设置的。51单片机有5种中断源,即有5种对应的情况发生时会使单片机去处理中断程序(中断函数)。 此篇主要整理定时器中断笔记。采用定时器中断会涉及中断寄存器,定时器/计数器相关寄存器(TCON,TMOD),中断函数等知识点。 其中,中断寄存器,定时器/计数器相关寄存器本身或者相关位用来做初始化,中断函数的内容主要是体现发生中断后所需要的操作(在中断函数内写代码)。 1.中断允许寄存器IE 图1.中断寄存器IE 中断寄存器用来设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H~AFH,该寄存器运行位寻址
[单片机]
51 单片机的定时器<font color='red'>中断</font>寄存器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved