#include
#define uchar unsigned char
#define uint unsigned int
unsigned char code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
sbit P32=P3^2;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
uint cnt;
void init(void)
{
EX0=1;
IT0=1;
EA=1;
ET0 = 1; //定时器0中断打开
TMOD = 0x1; //设定时器0为模式1,16位模式
TH0=0xd8;
TL0=0xf0; //设定时值为10000us(10ms)
TR0 = 1;
PT0=1;
}
/***************************************************************/
void delay(uint k)
{
uint data i,j;
for(i=0;i
{
for(j=0;j<121;j++){;}
}
}
/************************************************************/
void ledshow()
{
if(cnt>999)cnt=0;
P0=tab[cnt/100];
P25=0;
delay(1);
P25=1;
P0=tab[(cnt%100)/10];
P26=0;
delay(1);
P26=1;
P0=tab[cnt%10];
P27=0;
delay(1);
P27=1;
}
void display(void) interrupt 1 using 2
{
TH0=0xd8;
TL0=0xf0; //设定时值为10000us(10ms)
ledshow();
}
void main(void)
{
init();
while(1);
}
/************************************************/
void extern_int0(void) interrupt 0 using 0
{
EX0=0;
delay(10);
if(P32==0){
cnt++; }
while(!P32);
EX0=1;
}
关键字:51单片机 中断计数器
引用地址:
51单片机外中断计数器C语言程序设计
推荐阅读最新更新时间:2024-03-16 15:17
51单片机各中断初始化及子程序模板
/************************************************************ *51单片机各中断初始化及子程序模板,几乎包括了传统51单片机的全部中断 *1、外部中断0 *2、定时器中断0 *3、外部中断1 *4、定时器中断1 *5、串行中断 *6、定时器中断2---本中断在52时才有 *以上所有中断已经在Keil软件环境上经过测试,工作正常 *在使用定时中断的时候需要根据实际需要重设定时器的初值和工作方式 *在串行通讯中,使用11.0592M晶振,通讯波特率为9600bps *为了保证文件的单一和方便保存,本项目只用了一个文件, 没有进
[单片机]
c51单片机学习笔记-IO扩展(串转并)实验 - 74HC595
目的:通过 74HC595 模块控制 LED 点阵以一行循环滚动显示。 编译软件:keil5 过程: (1)先定义好74HC595 控制管脚,以及点阵列控制口 //定义 74HC595 控制管脚 sbit SRCLK=P3^6; //移位寄存器时钟输入 sbit RCLK=P3^5; //存储寄存器时钟输入 sbit SER=P3^4; //串行数据输入 #define LEDDZ_COL_PORT P0 //点阵列控制端口 u8 ghc595_buf ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; (2)重新定义了一个 ms 级延时函数 delay_ms,该函数与前面 de
[单片机]
C51单片机串口通讯注意点
今天在利用C51单片机发数据给PC时,出现了一个小小的问题:如果我要用一个按键来触单片发送5个数据到PC,当单片机复位后,第一次发送的数据总是只有一个数据,而不是5个,当第二次后又正常了。原因是在程序中开了串口中断(ES = 1);大概程序如下: ES = 1; TOMD = 0x20; TR1 = 1; main() {P1.0 = 1; while(P1.0); send(0x00); send(0x01); send(0x02); send(0x03); send(0x04); } 。。。。。。 如果是以上程序,当单片每复位后,按第一次P1.0将只发送00,第二次后会是00,01,02,03,04;
[单片机]
51单片机水温控制LCD显示加VB上位机温度曲线绘制
现功能,1L水由1KW电炉加热,要求水温在一定范围内人工设定,并能随着环境温度改变自动调节,以维持设定的温度不变。 矩阵键盘输入设定温度,LCD1602显示温度值,VB上位机绘制温度曲线 /******************************************************************************* * 实验名 :温度显示实验 * 使用的IO : * 实验效果 :1602显示温度 * 注意 : *************************************************
[单片机]
51单片机电容测量电路+程序设计
非原创,和大家分享一下 基于AT89C51单片机和555芯片构成的多谐振荡电路设计一电容测量电路,这种测量方法主要是通过一块555芯片来测量电容大小。让555芯片工作在直接反馈无稳态的状态下,555芯片输出一定频率的方波,其频率的大小跟被测量的电容之间的关系是:f=0.772/(R*Cx) ,固定R的大小,其公式就可以写为:f=k/Cx,只要能够测量出555芯片输出的频率,就可以计算出测量的电容。计算频率的方法可以利用单片机的计数器T0和中断INT0配合使用来进行测量。 1.3.1 系统硬件电路设计 该电路主要由单片机AT89C51、按键、继电器、74HC08、LCD16028、555芯片等构成,整体设计电路如图1-7所示。
[单片机]
51单片机return怎么用?单片机return的用法
函数写法1: u8 is_timeout(tick start_time, tick interval) { return (get_diff_tick(get_tick(), start_time) interval); } 函数写法2: u8 is_timeout(tick start_time, tick interval) { u8 status; status = get_diff_tick(get_tick(), start_time) interval); return status; } 函数调用方式: if (is_timeout(start_time, 1000)
[单片机]
51单片机定时器和中断的介绍
最近在学习51单片机,学到了定时器这块,由于自己的基础不太扎实,在这方面花了很多时间,这里通过对定时器和中断的介绍,用简易时钟这个例子来对学习的内容进行加深巩固,把自己的经验分享给大家,希望对大家能够有帮助。 一、定时器的功能以及定时器的结构 定时器的功能 其实就是单片机的内部,通过系统时钟的每一个机器周期产生一个记数脉冲,即每一个机器周期计数器加一。 比如,这里我的实验板的晶振是12MHZ,1MHZ信号每个脉冲的持续时间为1us,如果定时器T0对1MHZ的信号进行计数,从0~65536us,当达到最大的65536us的时候,定时器计数达到最大值,会溢出,于是产生中断信号,向中断系统申请中断,中断系统接受中断请求,执行中断
[单片机]
8051单片机的历史_8051单片机的应用领域
目前,有关8051单片机的说法很多:8051单片机是Intel发明的,可与8位系列处理器一起使用。现在,8051单片机已广泛应用于各个行业以及家庭的各种家用电器上。 一、8051单片机的历史 如果我们回顾历史,8051单片机是由微处理器巨头Intel于1980年首次发明的,并且逐渐被全世界所接受,并且随着未来的每一天,8051单片机的重要性正在不断提高。当它由英特尔发明时,它是通过NMOS技术开发的,但作为NMOS技术却不是很有效。 为了提高效率和生产率,英特尔通过实施CMOS技术对它进行了改型,并出现了一个新版本,名称中带有字母“C”,比如:“80C51”。新版8051单片机具有两条总线,一条总线用于程序
[单片机]