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++;
}
仿真结果: