使用Protues画原理图并写程序:
用定时器1的方式1实现n个发光管200ms间隔闪烁,用定时器0的方式1实现数码管前两位59s循环计时,后两位显示学号(最后两位)。
学号除6取余数,余数加2.结果是这个led灯的数目n。
数码管显示前两位循环计时,加上显示学号后两位。总共显示四位。 部分源程序如下:
#include<reg52.h> //52系列单片机头文件
#define ucharunsigned char //宏定义
#define uintunsigned int
sbitdula=P2^6; //申明U1锁存器的锁存端
sbitwela=P2^7; //申明U2锁存器的锁存端
sbitled1=P1^0; //LED灯说明
sbit led2=P1^1;
uchar codetable[]={ //数码管显示编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelayms(uint);
voiddisplay(uchar,uchar);
ucharnum,num1,num2,shi,ge;
void main() //主函数
{
TMOD=0x11; //设置定时器0和1为工作方式1(0001 0001)
TH0=(65536-458720)/256; //装初值
TL0=(65536-458720)%256;
TH1=(65536-458720)/256; //装初值
TL1=(65536-458720)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
TR0=1; //启动定时器0
TR1=1; //启动定时器1
while(1) //程序在这里不停的对数码管动态扫描同时等待中断发生
{
display(shi,ge);
}
}
voiddisplay(uchar shi,uchar ge) //显示子函数
{
wela=1;
P0=0xfe; //送入位选信号
wela=0;
dula=1;
P0=table[shi]; //送入段选信号
dula=0;
P0=0xff; //消影
delayms(5); //延时5毫秒
wela=1;
P0=0xfd;
wela=0;
dula=1;
|