|
单片机/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++;
}
|
|
|
|