📄 复件 main.c
字号:
/*********************************************************
程序名称:一个单片机控制数码显示块的正计时程序;
描述:单片机的P0口并行输出,驱动数码管的A-G的各段位,
P2口的前三个口通过三极管选择各数码管。
P1、P3做数码块的初始值设定。
通过T0的方式1做计时,计时不太准确。
适用:只显示安全的天数,要求不太精确的地方。
缺点:计时时从加电时开始计时,增加变化时在加电时刻(以后天数)
***********************************************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
code uchar a[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar k,m,n;
int timer;
delay(void){
uchar i,j;
for(i=0;i<50;i++){
for(j=0;j<50;j++){;}
}
}
/***定时器初始化程序*************/
void timer_init(void)
{
TMOD = 0x01; /*定时器0方式1*/
TH0=0xB1; /* 计数初值写入TH0 */
TL0=0xDF; /* 写入计数初值到TL0 */
ET0=1; /* 定时器0中断允许*/
EA=1; /* 全局中断允许 */
TF0=0; /* 定时器0中断标志位清0 */
TR0 = 1;
}
//定时器中断处理
void timer_0() interrupt 1 using 1
{
TH0=0xB1; /* 计数初值写入TH0 */
TL0=0xDF; /* 写入计数初值到TL0 20MS*/
if(timer == 100) {
if(n<9){
n++;
}else{
if(m<9){
n = 0;m++;
}else{n = 0;m = 0;k++;}
}
timer = 0;
}else{
timer++;
}
}
void main(void){
P1 = P3 = 0xFF;
timer_init();
/*确定个位的初始值*/
switch (P1&0x0F)
{
case 0: n = 0;break;
case 1: n = 1;break;
case 2: n = 2;break;
case 3: n = 3;break;
case 4: n = 4;break;
case 5: n = 5;break;
case 6: n = 6;break;
case 7: n = 7;break;
case 8: n = 8;break;
default: n = 9;break;
}
/*确定十位的初始值*/
switch (P1&0xF0)
{
case 0: m = 0;break;
case 16: m = 1;break;
case 32: m = 2;break;
case 48: m = 3;break;
case 64: m = 4;break;
case 80: m = 5;break;
case 96: m = 6;break;
case 112: m = 7;break;
case 128: m = 8;break;
default: m = 9;break;
}
/*确定百位的初始值*/
switch (P3&0x0F)
{
case 0: k = 0;break;
case 1: k = 1;break;
case 2: k = 2;break;
case 3: k = 3;break;
case 4: k = 4;break;
case 5: k = 5;break;
case 6: k = 6;break;
case 7: k = 7;break;
case 8: k = 8;break;
default: k = 9;break;
}
while(1){
P2 = 0x01; P0 = a[k];
delay();
P2 = 0x02; P0 = a[m];
delay();
P2 = 0x04; P0 = a[n];
delay();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -