51单片机:有趣的定时器实验

51单片机:有趣的定时器实验

本以为考完试搞完课设就没啥单片机啥事了,结果莫名的来了软件工程软件基础训练,训练Proteus和Keil软件。我嘞天,之前天天用好不?这课程安排的emmmmm,我还要其他课设好不?真是没办法。不过还好,软件训练时遇到了一个好玩的题目给了点心里安慰,分享一下。

题目描述:

单片机运行后,显示器会显示“00”字样,每过1s,显示的内容就会变化一次,依次显示“01”、“02”等字样,直到显示“09”字样后又回到“00”循环显示。于此同时两个LED灯每隔10s轮流点亮一次。

电路设计:

在这里插入图片描述

示例代码:

#include<reg52.h>
unsigned int a,num,shi,ge,c,b,n,x=1;
char code tamble[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //共阴极数码管
sbit D7 = P1^6;  //定义灯
sbit D6 = P1^7;  //定义灯
void delay(unsigned int i);  //延时函数
void xs(unsigned int m);     //数码管显示和灯切换

//----------------------------------
//          主函数
//----------------------------------
void main()
{
	a  = num = shi = ge = c = b = n = 0;
	init();
	{
		while(1)
		{
			if(x%2 == 0) P0 = 1;
			else P0 = 2;
			if(a == 20)      // a值为20正好保证定时1s
			{
				if(num == 9) x++;
				num++;
				a = 0;
				if(num == 10)
					num = 0;
			}
			xs(num);
		}
	}
}

//-------------------------------------
//         初始化
//-------------------------------------
void init ()
{
	TMOD = 0x01;                 //定时器为方式1
	TH0 = (65536 - 50000)/256;   //进入中断时间为50ms
	TL0 = (65536 - 50000)%256;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
}


//--------------------------------------
//         延时函数
//--------------------------------------
void delay(unsigned int i)
{
	int j;
	for(i;i > 0;i--)
	for(j = 20;j > 0;j--);
}

//-----------------------------------
//       数码管显示和灯切换
//-----------------------------------
void xs(unsigned int m)
{
	shi = 0;
	ge  = m;
	D7 = 1;
	D6 = 1;
	P3 = ~tamble[shi];  //仿真电路图接的是共阳极数码管,故取反
	D7 = 0;
	D6 = 1;
	P2 = 0x44;
	delay(10);
	P2 = 0;
	D7 = 1;
	D6 = 1;
    P3 = ~tamble[ge];   //仿真电路图接的是共阳极数码管,故取反
	D7 = 0;
	P2 = 0x88;
	delay(1);
	P2 = 0;
}

//-------------------------------
//       中断
//--------------------------------
void exit() interrupt 1 
{
	TH0 = (65536 - 50000)/256;    //重装初值
	TL0 = (65536 - 50000)%256;
	a++;
	b++;
}

仿真结果:

动态图没录好
刚开始
10秒后另一个灯亮

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值