欣欣学习网,老工程师带你学习单片机技术,欢迎来坐坐。
首  页 | 学习NIOSII | 学习C51 | 学习CPLD | 51+CPLD实验板 | | | MY-RTOS

本栏目的实验需在 WinXp 上操作。建议在 Virtual Box 虚机上安装WinXp系统,使用更方便。

 学习板概述
 安装keil C51软件
 在线烧写程序
 keil C51使用入门
 使用keil C51仿真调试
 使用标准输入输出设备
 点灯程序
 跑马灯程序
 LED数码管扫描显示程序
 键盘扫描程序
 键盘数码管联合扫描
 计时秒表程序
 蜂鸣器发声程序
 产生音阶程序
 字符LCD控制程序
 Flash读写程序
 使用ADC检测模拟量程序
 相关软件与文档


单片机/C51学习板

点灯程序


本实验通过一个点灯的程序,示例如何点亮实验板上的数码管。

1.

点击 这里 下载示例工程,保存并解压到 D: 盘根目录下。

2.

启动 ISP 软件,将 D:\lamp1 下的 mon51.hex 文件烧写到实验板上,关闭 ISP 软件。如果实验板上已有调试代理程序,可略过这一步。ISP 软件的使用方法参见:在线烧写程序

3.

启动 Keil uVision2 集成开发软件,打开 D:\lamp1 下的 lamp1.Uv2 工程,重新编译。Keil uVision2 软件的使用方法见:keil C51使用入门

4.

设置好 Monitor-51 Driver 所使用的串口号后,在 Debug 菜单下,点击 Start/Stop Debug session 命令,启动调试界面。如何设置串口号,请参阅:使用keil C51仿真调试

5.

在命令行窗口里,输入 pc = 0x2000 命令,然后按 F5 键,执行该程序。

程序代码如下:

#include <reg52.h>       /* special function register declarations   */
#include <absacc.h>      /* for the intended 8051 derivative         */

#include <stdio.h>       /* prototype declarations for I/O functions */

/***************************************************
 * A型板,定义 model 为 1,B型板,定义 model 为 2。*
 ***************************************************/

#define model 2

#if model == 1
sbit SCC=P3^2;
#else
sbit SCC=P1^7;
#endif

sbit SCR=P3^3;
sbit SCI0=P3^5;
sbit SCI1=P3^4;

unsigned int i;

unsigned char timer1=0;

/***************************************************
 * 主程序入口。                                    *
 ***************************************************/
void main (void)  
{ 

/***************************************************
 * 设置 T0 定时器的工作模式为16位计数              *
 ***************************************************/
  TMOD |= 0x01;

/***************************************************
 * 设置 TH0 寄存器的初值,因为在中断处理程序里还要 *
 * 对其付值,所以这里所付的数值对定时长度没有影响。* 
 ***************************************************/        
  TH0   = 0xff;

/***************************************************
 * 起动 T0 定时器。                                *
 ***************************************************/
  TR0   = 1;       

/***************************************************
 * 允许 T0 定时器中断,并将全局中断控制位置为允许。*
 ***************************************************/
  IE   |= 0x82;     

/***************************************************
 * SCR 是4017的复位控制信号,置"1"将4017复位,其输 *
 * 出信号的Q0为高电平,选通第一个数码管。          *
 ***************************************************/            
  SCR = 1;                        

  while(1){ 
  
/***************************************************
 * 向 XDATA 地址空间的 0xb000 地址写一个 0x80 的数 *
 * 据。位于该地址的是一个74HC377锁存器,用于驱动   *
 * LED 数码管的段。输出 0x80 则只选通数码管的 dp   *
 * 段,也就是只点亮小数点。                        *
 ***************************************************/
    XBYTE[0xb000] = 0x80;


/***************************************************
 * 延时1秒钟。T0 定时器每1毫秒中断一次,每中断一次 *
 * 给变量 timer1 加 1,累计 1000 次,就是 1 秒钟。 *
 ***************************************************/
    i = 0; 
    timer1 = 0;
    while(i<10){
      if(timer1>=100){
        i++;
        timer1 = 0;
      }
    } 

/***************************************************
 * 还是向 XDATA 空间写数据,这次是 0x00,也就是已  *
 * 点亮的灯息灭。                                  *
 ***************************************************/
    XBYTE[0xb000] = 0x00;

/***************************************************
 * 再延时 1 秒钟。                                 *
 ***************************************************/
    i = 0;
    timer1 = 0;
    while(i<10){
      if(timer1>=100){
        i++;
        timer1 = 0;
      }
    }    

/***************************************************
 * 返回到上面的 while(1)。                         *
 ***************************************************/   
  }                              
}                               

/***************************************************
 * T0 的中断处理程序,每1毫秒执行一次,给变量      *
 * timer1 加 1。                                   *
 ***************************************************/

dir() interrupt 1
{
  TL0=0x67;
  TH0=0xfc;

  timer1++;
}




管理员信箱: stonewayqi@hotmail.com

欣 欣 学 习 网

粤ICP备2023138008号