2个定时中断,2个按钮中断
#include
#define seg p2 //数码管 断码口
#define scanp p1 //数码管 com扫描口
sbit oc = p0^0; //定义573锁存器使能口,我是用的573驱动7段数码管
sbit pb0=p3^2; //按钮0
sbit pb1=p3^3; //按钮1
/********************
知识:
ie寄存器
tcon寄存器
tmod 寄存器
第一个定时器
********************/
#define count_m1 50000 // 0.05s mode 1 一个机器周期1us 这里12mhz 机器周期=1/(12/12) 定时时间=定时个数*机器周期=50000*1us =0.05s
#define th_m1 (65536-count_m1)/256 //mode 1 高4位
#define tl_m1 (65536-count_m1)%256 //mode 1 低4位
int count_t0=0; /***定义中断次数,第一个中断***/
/**********************
第2个定时器
**********************/
#define count_m2 250 //mode 2 250*1us = 0.25s
#define th_m2 (256-count_m2) //方式2 高4位
#define tl_m2 (256-count_m2) //方式1 低4位
char count_t1=0; /***定义中断次数 ,第2个中断***/
char code tab[10]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67 }; // 共阴极
char disp[2]={ 0x3f,0x3f }; // 数码管开始显示 0 0
char seconds=0;
char scan=0;
void delay(void);
main()
{
oc = 0; //锁存置0 ,点亮数码管
ie=0x8f; // 1000 1111 1000开启总中断 1111开启4个中断
tcon=0x00; //低电平0触发
tmod=0x21; // 0010 0001 timer1采用方式2 timer0采用方式1
th0=th_m1; //t0高4位 mode 1
tl0=tl_m1; //t0低4位 mode 1
tr0=0; //不启动 t0
th1=th_m2; //设置t1自动加载值,计数值 mode2
tl1=tl_m2; // t1 mode2
tr1=1; //启动t1
p3 =0xff; //设置按钮输入
while(1);
}
/**************
中断0 计算并显示秒数
***************/
void t0_1s(void) interrupt 1
{
th0=th_m1;
tl0=tl_m1;
if (++count_t0==20) //中断计数20次 0.05*20 = 1s
{
count_t0=0;
seconds++;
if (seconds==60)
seconds=0;
}
disp[1]=tab[seconds/10]; //十位
disp[0]=tab[seconds%10]; //个位
}
/***********************
中断1 扫描
************************/
void t1_8ms(void) interrupt 3
{ if (++count_t1==32) //0.25us * 32 ==8ms
{
count_t1=0;
if (++scan==3) //不能超过十位
scan=1;
seg=0xff;
scanp=~scan;
seg=disp[scan-1];
}
}
/************************
按钮 0 中断 码表开始/暂停
*************************/
void int0_sw(void) interrupt 0
{
tr0=~tr0; //启动/暂停定时器
while(pb0==0);
delay(); //延时去抖动
}
/************************
中断1 按钮 1 复位
************************/
void int1_rst(void) interrupt 2
{
while(pb1==0);
delay();
seconds=0;
disp[0]=disp[1]=0xc0;
}
void delay(void) //延时去抖动
{
int i;
for(i=0;i《2400;i++); // 2400 * 8 = 19200us = 20ms
}
GPU的巨大压力即将到来
使用51单片机控制红外遥控芯片的资料和解码程序
哪些因素会导致MCU复位
英特尔落后微软 英特尔能否重塑昔日辉煌?
3分钟轻松实现串口连接MCGS触摸屏应用案例
单片机实现一分钟定时器功能的设计
什么是西门子SiVArc :触屏画面生成器
探索物联网时代下的金融业发展与落地应用
试想一下,未来的传感器会有什么样的光景
国内首个AI医疗三类证的科亚医疗欲通过IPO补血
手机拍照哪家强?华为P10、美图T8、OPPOR11优缺点评测分析
ios15息屏显示功能开启
mstp协议原理详解
作为Fab-Liter战略的一部份,安森美剥离晶圆制造厂
IR2117 单通道MOSFET或IGBT栅极驱动器集成电路
电力系统中变压器的中性点为什么要接地?
详解八层PCB主板设计要点
宽带无线电需要宽动态范围转换器
Systemverilog中的Driving Strength讲解
逆变器和转换器的差别,经久耐用而广泛应用