当前位置:文档之家› (完整word版)51单片机流水灯

(完整word版)51单片机流水灯

51单片机的流水灯控制
班级:100712
姓名:***
学号:********
一、设计要求
用51单片机设计一个流水灯的控制方案,要求采用定时器定时,利用中断法控制流水灯的亮灭,画出电路图和程序流程图,写出程序代码以及代码注释。

二、电路原理图
原理图分析:
本原理图采用STC89S52单片机控制8个LED灯,其中8个LED灯的负极接单片机的P1端口,正极通过1KΩ排阻连接到电源上。

原理图中还给出了晶振与复位端,以保证控制器的稳定工作。

三、程序流程图
四、程序代码及注解
1.非中断定时器控制
#include<reg52.h>
#include<intrins.h>//包含了_crol_函数的头文件
#define uchar unsigned char
#define uint unsigned int
uint i=0;
uchar a=0xfe;
void main()
{
TMOD=0x01;//设置工作方式为定时器0,16位手动重装初值
TH0=(65536-46080)/256;//50毫秒定时赋初值
TL0=(65536-46080)%256;
TR0=1;//启动定时器0
while(1)
{
If(TF==1)//读溢出标志位
{
TH0=(65536-46080)/256;//重新赋初值
TL0=(65536-46080)%256;
i++;
if(i==10)//500毫秒定时
{
i=0;
P1=a;//P1端口赋值
a=_crol_(a,1);//循环左移
}
TF=0;//清除定时器溢出标志
}
}
}
程序分析:本程序采用非中断定时器法控制流水灯,核心语句在于读取标志位TF位,TF为定时器溢出标志位,溢出时硬件自动置一,所以循环读取标志位以判断定时器是否溢出,而每次溢出需要手动清零,否则定时器无法再次溢出,利用标志i读取10次即可达到500毫秒的定时。

另外需要注意的是单片机晶振为11.0592MHz,所以计时一个数的时间为12/11.0592=1.085us,故定时50毫秒的计数为50000/1.085=46080。

2.中断定时器控制
#include<reg52.h>
#include<intrins.h>//包含了_crol_函数的头文件
#define uart unsigned char
#define uint unsigned int
uint i=0;
uchar a=0xfe;
void Timer0_init();
void main()
{
Timer0_init();//定时器中断初始化
while(1);
}
Timer0_init()
{
TMOD=0x01;//设置定时器方式为定时器0,16位手动重装初值
TH0=(65536-46080)/256;//50毫秒定时赋初值
TL0=(65536-46080)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//开启定时器0
}
void timer0() interrupt 1//定时器0中断服务程序
{
TH0=(65536-46080)/256;//重装初值
TL0=(65536-46080)%256;
i++;
if(i==10)//500毫秒定时
{
P1=a;//P1端口赋值
a=_crol_(a,1);//循环左移
}
}
程序分析:本程序采用定时器中断法控制流水灯,核心语句在于中断的产生上,主程序中定时器初始化一次之后用一个while循环让程序停留在此处等待中断的产生,此句话是为了防止程序跑飞设计。

而定时器计数溢出后将产生中断,定时器0的中断服务程序标志是interrupt 1,定时溢出后将自动跳转到此中断服务程序中执行,通过读取10次来达到500毫秒的定时,注意初值的重置与标志位的清零即可。

相关主题