C51编程完成单片机控制 前3位数码管同时显示 000 ~100
时间: 2024-03-19 17:46:14 浏览: 92
好的,针对您的问题,我可以给您提供一些思路和代码示例:
思路:
1. 使用C51单片机控制3个数码管的显示,需要连接3个数码管控制芯片和8个段选器;
2. 通过定时器中断来实现数码管显示的刷新,每隔一定时间更新一次数码管的显示;
3. 使用变量存储要显示的数字,每次更新该变量的值,然后将该数字转换为对应的段选值,通过端口输出到数码管控制芯片上。
代码示例:
```
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIG1 = P0^0; // 数码管1控制端口
sbit DIG2 = P0^1; // 数码管2控制端口
sbit DIG3 = P0^2; // 数码管3控制端口
uchar code LED_TBL[101][8] = // 数字0~9和空格的段选值
{
{0,0,0,0,0,0,1,1}, // 0
{1,0,0,1,1,1,1,1}, // 1
{0,0,1,0,0,1,0,1}, // 2
{0,0,0,0,1,1,0,1}, // 3
{1,0,0,1,1,0,0,1}, // 4
{0,1,0,0,1,0,0,1}, // 5
{0,1,0,0,0,0,0,1}, // 6
{0,0,0,1,1,1,1,1}, // 7
{0,0,0,0,0,0,0,1}, // 8
{0,0,0,0,1,0,0,1}, // 9
{1,1,1,1,1,1,1,1} // 空格
};
uchar cnt = 0; // 定时器中断计数器
uchar num = 0; // 要显示的数字
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3C; // 定时器初值,100us
TL0 = 0xB0;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
while(1)
{
// 不断更新要显示的数字
if(num > 100) num = 0;
}
}
// 定时器0中断服务程序,100us一次
void Timer0() interrupt 1
{
TH0 = 0x3C; // 定时器初值,100us
TL0 = 0xB0;
cnt++;
if(cnt >= 500) // 500 * 100us = 50ms,刷新一次数码管
{
cnt = 0;
// 更新数码管显示
uchar dig1 = num % 10; // 个位数
uchar dig2 = (num / 10) % 10; // 十位数
uchar dig3 = (num / 100) % 10; // 百位数
DIG1 = 0; // 先关闭所有数码管
DIG2 = 0;
DIG3 = 0;
P1 = LED_TBL[dig1]; // 输出个位数段选值
DIG1 = 1; // 打开个位数数码管
_nop_();
_nop_();
DIG1 = 0;
P1 = LED_TBL[dig2]; // 输出十位数段选值
DIG2 = 1; // 打开十位数数码管
_nop_();
_nop_();
DIG2 = 0;
P1 = LED_TBL[dig3]; // 输出百位数段选值
DIG3 = 1; // 打开百位数数码管
_nop_();
_nop_();
DIG3 = 0;
}
}
```
希望这个代码示例能够对您有所帮助!
阅读全文