C51使用的晶振频率是11.0592MHz一颗LED灯接在C51的P0.0,现在要求设计程序,让这颗LED灯以1s为间隔闪烁。
我们不只是设计程序,更要对这个单片机项目分析一下
顺便看看这道题的难度~~~~~~~~~~~
顺带一提,本节课要用到单片机定时器》》看我上一篇文章,详细介绍定时器
设计一个电路图,单片机用80C52RC,晶振11.0592MHz,一颗LED接在P0.0
这里说明一下,C51的IO只支持弱上拉,这就意味着单片机的IO上拉的时候只能提供很弱小的电流,这个电流可能不足以点亮一颗LED灯(或者这颗LED灯的亮度很低),为了让LED正常发光,我们使用上拉的方法。这里简单介绍一下使用方法哈
当P0.0低电平的时候LED灯导通,正常点亮,P0.0给高电平的时候LED不导通,熄灭
考虑到手头的资源问题,我使用现成的开发板来完成这个程序设计,这个开发板使用的是上拉LED,LED1接在P1.0,实际电路图修改后如下:
现在对程序分析一下
程序框图
首先我们要明白,我们使用的LED是上拉模式的,P1.0 = 1的时候关闭LED,P1.0 = 0的时候点亮LED
既然要控制LED,这里就讲一下方法
三条特殊的指令
sfr P0 = 0x80;
这条指令存放在reg52.h里面,已经对IO组的寄存器的地址进行定义,像P0,P1,P2这些关键字我们可以直接用。方便我们对IO的寄存器进行操作,值得一提的是,IO寄存器是可以位寻址
sbit LED = P1^0
sbit指令给IO上的一个端口定义名字,比如说给P1.0(写作P1^0)定义一个叫LED的名字,下次对这个IO进行操作的时候用以下方法
sbit LED = P1^0;//这是前面的定义
LED= 1;//给P1.0IO写高电平
LED= 0;//给P1.0IO写低电平电平
此外,还可以直接对整个IO组进行操作,方法
那么,接下来就是程序了
【1】软件延迟实现
所谓的软件延迟,就是通过执行空代码,实现延迟的效果,这种延迟实现的延迟有一个特点,时间不准,因为单片机里面每次执行C语言下的一条操作的时间是不固定的
程序如下
#include< reg52.h >
sbit LED = P1^0;
void delay(unsigned int xms) //调用时需提供参数xms的实际值。
{
unsigned int i,j; //定义无符号整型变量i、j
for(i=0; i< xms; i++) //后面没带";",下一条语句是循环体。参数xms延时x毫秒。
for(j=0; j< 110; j++); //后面带";",表示这个for语句的循环体是空语句。
}//这个值得学习,这里的代码是延迟代码
void main ()
{
LED = 1;//先关闭LED灯
while(1)
{
LED = !LED;//LED状态取反
/*
这里说明一下取反
取反用“!”
取反前,LED = 1,取反后,LED = 0
*/
delay(1000);//软件延迟1000ms = 1s
}
}
这就是效果了,怎么样,还可以吧,但是……
题目要求我们延迟1s,如此精确的提到1s,肯定是希望我们用定时器来完成这个项目
我想,用软件延迟,老师应该会给特别低的分数,而且也体现不出我们的能力
下面我们用定时器完成这一道题
关于定时器的用法
#include< reg52.h >
void main()
{//注意设置定时器初始值要在main函数里面设置
TMOD = 0x01;
/*设置定时器模式寄存器TMOD为 0000 0001
GATE = 0
C/T = 0
M1 =0
M0 = 1
标准16位定时器
*/
//先设置定时器初始值
TL0 = 0x3A;//设置定时器初始值低位
TH0 = 0x8E;//设置定时器初始值高位
TR0 = 0;//记得一定要设置定时器开启
while(1)
{
if (TF0 == 1)
{//这里可以先放下你的定时器计时满了以后要执行的代码
//溢出后你需要先给你的定时器再次设置初始值
TL0 = 0x3A;//设置定时器初始值低位
TH0 = 0x8E;//设置定时器初始值高位
TF0 = 0;//设置好初始值后再复位定时器
}
}
}
我们要设置一个标准的16位定时器,设置方法和流程参考我写过的文章,上面是16位定时器的设置流程
以下是程序框图
下面是代码
#include< reg52.h >
sbit LED = P1^0;
unsigned char counter = 0;
void main()
{//注意设置定时器初始值要在main函数里面设置
TMOD = 0x01;
/*设置定时器模式寄存器TMOD为 0000 0001
GATE = 0
C/T = 0
M1 =0
M0 = 1
标准16位定时器
*/
//先设置定时器初始值
TL0 = 0x4B;//设置定时器初始值低位
TH0 = 0xF5;//设置定时器初始值高位
TR0 = 1;//记得一定要设置定时器开启
while(1)
{
if (TF0 == 1)
{
counter++;
if(counter >200)
{
counter = 0;
LED = !LED;
}
TL0 = 0x4B;//设置定时器初始值低位
TH0 = 0xF5;//设置定时器初始值高位
TF0 = 0;//设置好初始值后再复位定时器
}
}
}
图片