|
单片机/C51学习板
跑马灯程序
|
|
本实验通过一个跑马点灯的程序,示例如何选通实验板上的每个数码管。 |
1. |
点击 这里 下载示例工程,保存并解压到 D: 盘根目录下。 |
2. |
启动 ISP 软件,将 D:\lamp2 下的 mon51.hex 文件烧写到实验板上,关闭 ISP 软件。如果实验板上已有调试代理程序,可略过这一步。ISP 软件的使用方法参见:在线烧写程序 。 |
3. |
启动 Keil uVision2 集成开发软件,打开 D:\lamp2 下的 lamp2.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 k=0;
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为高电平,选通第一个数码管。4017 复位 *
* 后,要将该信号置"0",这样加在 4017 时钟引脚上的 *
* 时钟信号才能起作用。 *
***************************************************/
SCR = 1;
SCR = 0;
/***************************************************
* 向 XDATA 地址空间的 0xb000 地址写一个 0x80 的数 *
* 据。位于该地址的是一个74HC377锁存器,用于驱动 *
* LED 数码管的段。输出 0x80 则只选通数码管的 dp *
* 段,也就是只点亮小数点。 *
***************************************************/
XBYTE[0xb000] = 0x80;
while(1){
/***************************************************
* k是用来记录位置的变量,表明那个灯正在被点亮。 *
***************************************************/
k++;
if(k>=6){
/***************************************************
* 如果上一步被点亮的灯是第6个灯,复位4017,再第 *
* 1灯开始。 *
***************************************************/
k=0;
SCR = 1;
SCR = 0;
} else {
/***************************************************
* 如果不是第6个灯,就向4017的时钟引脚发出一个高脉 *
* 冲,使4017的高电平输出信号后移1位,选通下一个数 *
* 码管。4017 的节拍次序是:Q0->Q1->Q2->Q->Q3->Q4- *
* >Q5->Q6->Q7->Q8->Q9->Q0。 *
***************************************************/
SCC = 1;
SCC = 0;
}
/***************************************************
* 延时1秒钟。T0 定时器每1毫秒中断一次,每中断一次 *
* 给变量 timer1 加 1,累计 1000 次,就是 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++;
}
|
|
|
|