试验1 单片机并口简单应用(流水灯)
实验目的
1、了解单片机C语言程序的基本结构
2、了解单片机C语言程序的设计和调试方法
3、掌握顺序控制程序的简单编程
4、熟悉51单片机的端口使用
实验仪器
单片机开发试验仪、稳压电源、计算机
实验原理
1、硬件电路
如图1所示,流水灯硬件电路由发光二极管、单片机并口(P0)、限流电阻等组成。
发光二极管连接成共阳极结构。
发光二极管点亮的条件是:阳极接高电平、各阴极接低电平。
因此,二极管公共端阳极就接成高电平,然后再按一定规则从P0口输出数据,发光二极管就会点亮。
图1 流水灯电路图
2、程序流程图如下。
实验内容:1、开发板接线图
延时
P0口初态循环右移1位
P0口状重新赋值0XFE
开始
P0口输出0XFE
P0是否等于0X00
Y
N
2、开发环境设置
打开keil软件,版本μ Vision2 ,μvision3,μvision4 都一样,在这里用μvision4版本演示,打开之后如下图,有的时候会默认打开上次使用的工程,单击Project 菜单,选择 Close Project 关闭了默认打开的工程,显示下图界面:
我们要建立新的工程,选择Project→ newμ vision projiect…
选择工程要保存的路径,输入工程文件名,如图
点击保存后会弹出一个对话框,要求用户选择单片机型号,可以根据用户使用的单片机来选择,我们使用的STC90单片机是兼容51内核的,Keil C51 几乎支持所有的51内核单片机,51内核具有通用型,如果程序用的资源不是太复杂,我们可以选择任意一款51单片机内核就行。
例程以添加Atmel 的AT89C51来说明。
如图,然后,单击确定(OK)。
功能描述
如果出现下面的界面:单击是就可以,意思是将单片机的启动代码添加到工程,我们不用修改。
到目前我们还没建立一个完整的工程,只是有工程的名字,框架,工程中还没有任何文件代码,(除了启动代码,有的keil 版本不显示启动代码),接下来我们添加文件及代码。
单击菜单File→New 选项,或者单击界面上的快捷图标,新建文件串口如下。
界面显示的Text1就是我们刚刚加入的文件,但是这个文件与我们的工程还没有直接联系起
来,单击图标,保存我们当前的text1文件,输入要保存的文件名,同时要输入文件扩展名,扩展名很关键,用C语言编写的程序,则必须为**.c,汇编语言必须为**.asm(**为文件名),文件名是用户自己取的。
填好文件名后单击保存。
回到编辑界面,单击Target1 前面的“+”号,然后在Source Group 1 上右键单击,选择
Add Files to Group Source Group1,选中我们刚才建立的.c文件,这里是led test.c,
单击add,只需单击一次。
之后单击Close就可以。
回到主界面后,单击Source Group 1前的“+”号,刚刚添加的文件显示在里面。
通过以上步骤我们就建立好了一个工程。
接下来就可以写代码了。
在写代码之前介绍介个常用的按钮:
按钮:用来编译我们正在操作的文件。
按钮:用来编译修改过的文件,并生成应用程序共单片机下载。
按钮:用来重新编译当前工程中所有的文件,并生成应用程序共单片机下载。
因为很多工程不止有一个文件,当有多个文件时,用它进行编译。
按钮:用来打开“Option for Target”对话框,对当前工程进行设置。
工程的各个参数都可以在这里设置,具体的设置方法用到的时候,再和大家详细讲述。
以上几个按钮是常用的,其他按钮在使用的时候再介绍。
3、编写程序
实验名: 流水灯实验
实验说明 : 延时实现LED流水灯效果P0口八个灯作跑马灯。
//--包含你要使用的头文件
#include <reg52.h> //此文件中定义了52的一些特殊功能寄存器
#include <intrins.h>
//--声明全局函数--//
void Delay10ms(unsigned int c); //延时10ms
/****************************************************************************** * 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
******************************************************************************/
void main()
{
unsigned char LED;
LED = 0xfe; //0xfe = 1111 1110
while (1)
{
P0 = LED;
Delay10ms(50);
LED = LED << 1; //循环右移1位,点亮下一个LED "<<"为左移位
if (P0 == 0xFF) //当它全灭的时候,重新赋值
{
LED = 0xfe; // 0xfe = 1111 1110
}
}
}
/****************************************************************************** * 函数名 : Delay10ms
* 函数功能 : 延时函数,延时10ms
* 输入 : 无
* 输出 : 无
******************************************************************************/
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--// for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}。