程序开始运行,系统处于正计数状态。当按键第一次按下时,系统从正计数切换至倒计数;下次再被按下时,又从倒计数切换至正计数。每次都在正计数和倒计数之间轮流切换。用中断方式识别开关SW1是否被从上往下按。
设z=学号+20,正计数循环显示0,1,2,…,z-1,z;倒计数循环显示z,z-1,z-2,…,1,0;正计数与倒计数均采用十进制。每个数字停顿1秒钟,关于1秒钟的时间控制,必须用定时器/计数器加中断实现。
要求切换计数方式后,系统从当前值开始正计数或倒计数。
#include
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9共阴
#define dula P1//数码管段选
#define wela P2 //数码管位选
uchar num,num_ge,num_shi;
uchar byCounter;//中断次数,20次为1s(500ms定时)
uchar btFlag;//计数方式 0:加,1:减
/*****************************函数声明************************************/
void init();
void count();
void disp();
void delay(uchar);
/****************************主函数***************************/
void main()
{
init();//初始化
while(1)
{
disp();//显示
}
}
/*******************************初始化****************************/
void init()
{
wela=0;
num=0;
num_ge=0;
num_shi=0;
byCounter=0;
btFlag=0;
TR0=1;//开定时器
TMOD=0x01;//定义定时器0工作与方式1
TH0=(65536-50000)/256; //定时器赋初值
TL0=(65536-50000)%256;
IT0=1;//边沿触发
EA=1;//开总中断
EX0=1;//开外部中断0
ET0=1;//开T0中断
}
/******************************延时**********************************/
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0l;i--)
for(j=255;j>0;j--);
}
/**************************定时器0中断***********************************/
void t0()interrupt 1
{
TH0=(65536-50000)/256;//重赋初值
TL0=(65536-50000)%256;
byCounter++;
if(byCounter==20)//到了1s
{
byCounter=0;
count();//计数加1
}
}
/**************************外部0中断***********************************/
void int0()interrupt 0
{
btFlag=~btFlag;
}
/****************************计数***********************************/
void count()
{
if(btFlag==0)
{
num++;//加1
if(num==(34+20+1))//如果加到 学号+20
{
num=0;
}
}
else
{
num--;
if(num==0)//如果减到0
{
num=(34+20);
}
}
}
/****************************显示***********************************/
void disp()
{
num_ge=num%10;//个位
num_shi=num/10;//十位
//循环扫描
wela=0x7F;
dula=table[num_ge];//个位
delay(10);
wela=0xBF;
dula=table[num_shi];//十位
delay(10);
}
关键字:89c51 按键选择 计数模式 数码管显示
引用地址:
89c51按键选择计数模式通过数码管显示
推荐阅读最新更新时间:2024-03-16 15:21
用扫描法读出4×4矩阵键盘,在数码管显示按键值
//电路说明如下。 //单片机:使用51系列兼容的即可; //4 4矩阵键盘:接在P1口; //两位数码显示器: P0口输出七段码,P2口输出位选码。 //============================================================== //C语言程序如下。 /************************************************************* * 文件名: KEY_LED.c * 功能 : 对4 4矩阵键盘进行输出,在数码管后两位显示按键值。 ***************************************************
[单片机]
数码显示管显示按键序号 89c51单片机编程实例
题目:AT89C51单片机P1口接8个按键(button),P2口接1个共阴极数码显示管,当有键按下时,数码显示管显示按键的序号 电路图: 源码如下: org 00h sjmp start org 30h start: mov P2,#00h start1: mov r1,#00h mov dptr,#table next: mov a,p1 cpl a jz next mov r5,#1 acall delay mov a,p1 cpl a jz next clr c shift: rrc a jc d
[单片机]
7段数码管静态显示程序
/*************************************************** 7段 数码管 静态显示程序 ***************************************************/ #include reg52.h /* 4个7段数码管锁存器地址 */ #define LED1ADDR 0x80 #define LED2ADDR 0x81 #define LED3ADDR 0x82 #define LED4ADDR 0x83 // 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f /* 0-9 a-f 的7段数码管显示编码 */ unsigned
[单片机]
89C51中断系统介绍(外部中断)
0、89C51中断系统分类: 分为三种: 1)、外部中断 2)、定时器中断 3)、串口中断 1、中断的概念 中断触发后,CPU会从主函数调到中断函数中。 外部中断1: 低电平触发:P3.2 是0 下降沿触发:p3.2电平:1变为0则触发。 外部中断2同1。 2、中断允许控制 EA是总开关;EX0、ET0、EX1、ET1、ES为分开关。 3、中断请求标志 4、中断优先级 2个优先级,故可实现2级嵌套。 INT0和INT1两个外部中断,T0、T1两个定时器中断,RX和TX为一个串口中断。 硬件中断优先级最高,串口优先级最低。 5、中断响应条件 6、中断
[单片机]
基于AT89C51单片机的雨量数码管显示设计
一.系统概述 系统使用的模块有AT89C51单片机+8位共阴极数码管+ADC0808(模拟雨量)+ULN2003电机驱动模块+电机。 系统使用AT89C51单片机作为主控,通过ADC0808和电位器模拟雨量的变化,单片机会将采集到的雨量数据处理并将其显示在数码管上,雨量的上限和下限通过程序进行了设定,分别是130和120,当雨量超过120后电机就会运转,当雨量超过130运转速度加快。 二.仿真概述 1.8位共阴极数码管显示雨量。 2.电位器模拟雨量检测模块检测雨量。 3.当雨量达到120时雨刷器开始工作。 4.当雨量达到130时雨刷器的速度加快。 三.程序设计 使用 Keil 51进行程序设计,打开
[单片机]
51单片机驱动CT1642数码管显示源程序
拆解电视机顶盒找到带CT1642控制的数码管 在网上找到代码修改了一下 没有解决按键检测的问题 可根据自己的需求修改对应引脚 制作出来的实物图如下: 单片机源程序如下: sbit DAT=P2^2; sbit CLK=P2^1; sbit KEY=P2^0; u8 NixieTable ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; u8 NixieTablepos ={0,0x02,0x04,0x08}; void CT1642_Write(u8 Pos, u8 Val) { u8 i,Posn; // 1、移18位:对应C1--C4、6位空、Q2--Q9 P
[单片机]
基于三八译码器控制八个数码管同时显示内容的问题
在单片机开发板上,很多时候为了节省IO口的资源,扩展和利用IO口,我们很经常使用的一个方法是使用三八译码器,这将由三个IO口变成了八个IO口的控制,但三八译码器的三个口输入口只能同时控制一个输出口,那么,问题就来了,比如我们很经常用一个三八口去按一个八位或者四位的数码管,那么我们怎么样才能够让这八个数码管同时工作,让我们看上去八个IO口显示不同的内容呢? 下面我就把今天刚在杨老师指导下编写的程序以及原理作一个简单的分析吧。我的开发板是P0低三位(38数码管的输入端口)口控制数码管的位选的,八个输出口分别控制八个数码管工作的。 程序: ;作者:李俊轩 ;时间:2010年10月21日 ;通过三八译码器让三个IO口控制八个数码管的工作
[单片机]
基于89C51单片机的环境噪声测量仪
1 引 言 环境噪声监测,是人类提高生活质量,加强环境保护的一个重要环节,在各大城市的繁华街区和居民区,已有大型环境噪声显示器竖立街头。但目前国内的便携式噪声测试仪,多为价格昂贵的进口专用设备,除卫生、计量等环保专业部门拥有外,无法作为民用品推广普及。本文介绍一种以89C51单片机为核心,采用V/F转换技术构成的低成本、便携式数字显示环境噪声测量仪。该仪器工作稳定、性能良好,经校验定标后能满足一般民用需要,可广泛应用于工矿企业、机关、学校等需要对环境噪声进行测量和控制的场合。 2 声压级的测量机理 人耳的听阈一般是20μPa,痛阈一般是200 Pa,其间相差107倍,这样宽广的声压范围很不易测量,
[单片机]