C51 Programming Cont.

今天终于学习了一直以来想学的中断功能,也是单片机中三大核心之一(定时器、中断、串口通信)

还是挺好玩的,下面还是一些课后习题:

1、利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay1s(void);

uchar xdata status,i;

void main()
{
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;
 while(1)
 {
  for (status=0; status<20; i++)
  P0=~0x01;
  status=0;
  for (status=0; status<20; i++)
  P0=~0x00;
  status=0;
 }
}

void delay1s(void)
{
    unsigned char a,b,c;
    for(c=95;c>0;c–)
        for(b=26;b>0;b–)
            for(a=185;a>0;a–);
}

void exter0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 status++;
}

另外,如果需要定时器1来执行,则需要这么写:

void exter1() interrupt 3
{
 TH1=(65536-50000)/256;
 TL1=(65536-50000)%256;
 status++;
}

main()

 TMOD=0x10;
 TH1=(65536-50000)/256;
 TL1=(65536-50000)%256;
 EA=1;
 ET1=1;
 TR1=1;

2、利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay1s(void);

uchar xdata status,i,j,t;

void main()
{
 TMOD=0x10;
 TH1=(65536-50000)/256;
 TL1=(65536-50000)%256;
 EA=1;
 ET1=1;
 TR1=1;
 while(1)
 {
  P0=~0x01;
  for (i=0;i<8;i++)
  {
   t=_crol_(P0,1);
   for (status=0;status<2;j++)
   P0=~0x00;
   status=0;
   for (status=0;status<2;j++)
   P0=t;
   status=0;
  }
 }
}

void delay1s(void)
{
    unsigned char a,b,c;
    for(c=95;c>0;c–)
        for(b=26;b>0;b–)
            for(a=185;a>0;a–);
}

void exter1() interrupt 3
{
 TH1=(65536-50000)/256;
 TL1=(65536-50000)%256;
 status++;
}

3、同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波。

这道题费的时间比较长,可能是没有完全掌握双定时器优先级的缘故,搞了一晚上,除了这道题,其余三道题基本上都是十几分钟内就搞定的。

PS: 暂时先放弃这道题吧…………

 

4、用定时器以间隔500MS在6位数码管上依次显示0、1、2、3….C、D、E、F,重复。

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay1s(void);

uchar xdata status,status1;
sbit Lock=P3^6;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void main()
{
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;
 Lock=1;
 while(1)
 {
  P2=~0x01;
  for (status1=0; status1<16; status1++)
  {
   while (status<10);
   status=0;
   Lock=1;
   P0=~table[status1];
   Lock=0;
   P2=_crol_(P2,1);
  }
 }
}

void delay1s(void)
{
    unsigned char a,b,c;
    for(c=95;c>0;c–)
        for(b=26;b>0;b–)
            for(a=185;a>0;a–);
}

void exter0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 status++;
}