编程实现:通过P1口依次逐个点亮8个发光二极管,频率为5HZ,并循环

2025-04-09 11:31:59
推荐回答(1个)
回答1:

附件里有Proteus仿真、Keil C工程和程序文件,可以看看效果。

#include 
#include 
#define uchar unsigned char
#define uint unsigned int
//变量
uchar Count,LED;
//主程序
void main()
{
 P0=0xff;
 Count=0;
 LED=0x01;
 TMOD=0x01;
 //12MHZ晶振 C51单片机对其12分频
 //实际定时器“加1”频率为1MHZ 也就是1us
 //用定时器中断时间间隔 是从“开启定时器加1”到“溢出”的时间
 //对于工作在模式1的定时器0来说 也就是从“开启定时器加1”到“(TH0 TL0)=(0xff 0xff)+1”的时间
 //0xffff+1=65536
 //如果(TH0 TL0)初始值是(65536-50000) 那么初始值到溢出需要“加1”50000次
 //1次是1us 50000次就是50000us=50ms
 //如果我们对定时器的中断次数进行计数,每20次算作一个时间段,那么这样的一个时间段就是20*50ms = 1000ms = 1s
 //这就是利用定时器计时的原理
 //因为TH0和TL0分别是高字节和低字节,所以赋初值时也要将(65536-50000)分成高低字节分别赋值给TH0和TL0
 //高字节 是除以256后的到的商 低字节 是除以256后的到的余数
 //另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值
 //所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值
 TH0=(65536-50000)/256;//50ms 定时
 TL0=(65536-50000)%256;
 ET0=1;
 EA=1;
 TR0=1;//启动T0
 while(1)
 {
  //显示
  P1=LED;  
 }
}
//T0 中断函数
void Int_T0() interrupt 1
{
 //另外,因为在模式1中,每次定时器溢出后,单片机不会自动对TH0和TL0重新赋值
 //所以每当定时器中断,我们都要首先对TH0和TL0人工重新赋值
 TH0=(65536-50000)/256;// 恢复初值
 TL0=(65536-50000)%256;
 //Count每中断一次加1 以20为周期 每当等于20时候说明1s到了
 if(++Count==4)
 {
  Count=0;
  LED=_crol_(LED,1);
 }
}