📄 file6.c
字号:
//外部计数实验
//现象 P1.0 闪烁,作为计数输入
//数码管显示000255,开始计数的时候,显示计数结果
//用导线连接P1.0和外部计数TC0引脚
//就会发生计数现象,P1.0作为外部信号源
#include <8051.h>
#define uchar unsigned char
#define segdata P0 //数据 输出
#define sege P2_7 //显示 选中
#define segb P2_6 //位 选
#define segd P2_5 //段 选
//****************************************************************************
void delay(unsigned char times);
void delay5ms();
void display(unsigned char disseg,unsigned char disdata);
void DIS_NUM(int number);
// 这里定义的是数码管对应的字符字根
code unsigned char disbuf_u[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};
// ***************************************************************************
static int data Counts; //毫秒数
//使用第3组寄存器,外部计数的中断号为 1
void Int0IrqHandler (void) interrupt 1 using 3; //定义外部计数中断服务程序
//下面是外部计数的中断服务程序
void Int0IrqHandler (void) interrupt 1 using 3 {
TR0 = 0; //关闭计数器
TH0 = 255; // 计数一次就溢出
TL0 = 254;
Counts++; //结果只是简单地增加计数值
TR0 = 1; //开始计数
}
void main()
{
P1 = 255; //关闭LED显示
P0 = 0; //关闭数码显示
P2 = 255; //
P3_7 = 0; //关闭蜂鸣器
Counts = 255; //初始化计数值
IT0 = 1; // 外部计数触发方式下降沿方式
TMOD = 0x04; // 计数器工作在方式 0
ET0=1; // 允许外部计数器中断
EA =1; // 中断总允许
TH0 = 255; // 计数一次就溢出
TL0 = 255;
TR0 =1;
while(1) //设置一个无限制循环
{
P1_0 =~P1_0; //翻转 P1.0 作为外部中断源
// delay(120);
DIS_NUM(Counts);
}
}
//*****************************************************************************
//下面是延时程序。具体的延时时间不能通过表面程序看出,(为什么?)
//如果我们需要一个精密的延时程序,那么我们可以采用内嵌汇编代码的方式
void delay(unsigned char times)
{
int t=15000; //延时倍数
unsigned char i=times;
for(;i!=0;i--)
{for(;t!=0;t--){}}
}
//这里是显示子程序,入口参数为
// disseg -> 位选 可选范围 0-7 一共8个数码管
// disdata -> 段选 可选范围 0-31 一个32个字符
// 段选 0-15 16个字符 为 "0"->"F"
// 段选 16-31 16个字符 为 "0."->"F."
void display(unsigned char disseg,unsigned char disdata)
{
unsigned char dataf;
if(disseg < 8) //只有当要显示的位数有效,才显示.否则,不显示
{
dataf = 1;
while(disseg)
{
dataf <<= 1;
disseg--;
}
sege = 0;
segdata = dataf; //这里首先把要显示的数据放到数据总线
segb = 1; //这里给出一个脉冲,数据送往位选端
segb = 0;
segdata = disbuf_u[disdata];
segd = 1; //这里给出一个脉冲,数据送往段选端
segd = 0;
}
else{
segdata = 255;
segd = 1; //这里给出一个脉冲,数据送往段选端
segd = 0;
} //关闭数码管显示
}
// 少量延时
void delay5ms()
{
_asm
mov R0,#100
lp: mov R1,#5
lk: djnz R1,lk
djnz R0,lp
_endasm;
}
//这个子程序用来显示数值,
void DIS_NUM(int number)
{
int nu,tmp;
uchar i;
tmp = number;
for(i =0;i<6;i++)
{
nu = tmp%10;
display(i,nu);
delay5ms();
tmp = tmp/10;
}
display(255,nu);
}
//*******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -