使用 IAR for 51 实验 LED 灯模拟二进制加减法.

来源:互联网 发布:oracle的sql语句 编辑:程序博客网 时间:2024/06/05 00:03
/********************************************************** 第一次使用 IAR 来搞 51 的程序, 用起来蛋疼, 搞了一晚上, * 居然和 Keil 差别挺大. 看来要慢慢熟悉, 多看文档和手册.* 多使用这些工具, 对比才能知道不同, 学习起来有意思啊!* 2012.5.28 proteus 仿真, LED 模拟加减法运算. IAR 环境的* 一些寄存器定义和声明看头文件就知道. 多数都是以联合体中* 包含位字段形式和 8 位数据格式的寄存器名给出. 使用时要* 看头文件.**********************************************************/#include <ioAT89C52.h>          /* 包含相关头文件 */#include <intrinsics.h>/* 自定义变量别名 */typedef unsigned int  INT16U;   typedef signed   int  INT16S;typedef unsigned char INT8U;volatile INT16S ticks  = 0xFF;  /* 加法运算 LED 显示 */volatile INT8U  second = 0;     /* 1s 计时           *//*** 主函数*/int main( void ){    /* setup timer 0 */    TCON_bit.TF0 = 0;    TCON_bit.TR0 = 1;          /* 启动定时器 0      */    P0 = 0xFF;                 /* 开始时 LED 全灭   */        /* 16 bit timer mode */    TMOD_bit.M00 = 1;    TMOD_bit.M10 = 0;        /*    * Set the timer with 16 bits. To get a repeat interval of    * 50000 cycles we loads TH0:TL0 with 0xFFFF - 1 - 50000 = 0x3CAE.    */    TL0 = 0x3C;    TH0 = 0xAE;        IE_bit.ET0 = 1;         /* Enable timer 0 interrupts */    __enable_interrupt();   /* Enable interrupts         */        for (;;)    {        asm("NOP");         /* 嵌入汇编语句 NOP 指令 */    }}/** 定时器 0 中断* Timer interrupt service routine*/#pragma vector = TF0_int__interrupt void my_Timer1_ISR(void){    TCON_bit.TF0 = 0;     /* 清零溢出标志位, 为下次准备 */        if (second++ > 10) {         second = 0;        --ticks;        P0 = ticks;    }        if (ticks < 0) {      /* 减到 0 即全亮时, 从新开始 */        ticks = 0xFF;    }}
如有不足或错误请指出, 我改. 先谢谢了!!