标题:
关于51单片机驱动7段数码管显示源程序与Proteus仿真图
[打印本页]
作者:
梅花君主
时间:
2021-2-13 15:03
标题:
关于51单片机驱动7段数码管显示源程序与Proteus仿真图
设计目标:1.使用一个七段数码管,在数码管上顺序显示0~F,显示间隔1s。
2.使用8个七段数码管,稳定显示自己学号后8位。(已实现循环显示完整学号)
本案例用到单片机定时器,数码管等知识。
需要软件:keil c51 (本机环境 Keil uVision5)
proteus (本机环境 proteus 8.11)
仿真电路图如下:
pro.png
(49.15 KB, 下载次数: 71)
下载附件
2021-2-13 15:02 上传
需要原件: AT89C51
74LS245 (P0口驱动不了,加245驱动数码管)
74LS138 (3 8 译码器 驱动多段位置信息)
7SEG-MPX8-CC-BLUE
7SEG-MPX1-CC
共阴数码管段码和共阳数码管段码加起来为FF,如显示不正常另行计算。因本人区分不来就不误导人了,程序中led和led8为数码管断码。
驱动程序如下:
#include <reg51.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar leddata[] = "124F09124847-2020.7";//学号自行修改
//0x00 灭灯 0x80 点 0x40 横杠
uchar led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39, 0x5e,0x79,0x71,0x80,0x40};
/*0-9 A-F*/
uchar led8[] = {0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x88,0x83,0xC6,0xA1,0x86,0x8E};
/*位信息*/
//uchar wei[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/*138译码器位信息*/
uchar wei[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
uint Rank = 0 , charNUm = 0, tem = 0;
void delay(int t){
while(t!=0)
{
uchar i;
for(i=124;i>0;i--); //??124*8+10=1002us
t--;
}
}
//-----------------字符查表----------------------
void charToNum(uchar strs){
switch (strs)
{
case '0':
P0 = led[0];
break;
case '1':
P0 = led[1];
break;
case '2':
P0 = led[2];
break;
case '3':
P0 = led[3];
break;
case '4':
P0 = led[4];
break;
case '5':
P0 = led[5];
break;
case '6':
P0 = led[6];
break;
case '7':
P0 = led[7];
break;
case '8':
P0 = led[8];
break;
case '9':
P0 = led[9];
break;
case 'A':
P0 = led[10];
break;
case 'B':
P0 = led[11];
break;
case 'C':
P0 = led[12];
break;
case 'D':
P0 = led[13];
break;
case 'E':
P0 = led[14];
break;
case 'F':
P0 = led[15];
break;
case '.':
P0 = led[16];
break;
case '-':
P0 = led[17];
break;
default:
P0 = 0xff;
break;
}
}
//-----------------初始化----------------------
void init(){
TMOD = 0x01;
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
TR0 = 1;
ET0 = 1;
EA = 1;
P0 = 0x00;
P3 = 0x00;
}
//-----------------单个数码管显示----------------------0-F
void OneledRun(){
uint s = 0;
for(;s<16;s++){
P3 = led[s];
delay(3000);
}
}
//-----------------TT0----------------------1MS
void TT0(void) interrupt 1
{
P0 = 0x00; //消影
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
P2 = wei[Rank];
//P0 = led[Rank];
charToNum(leddata[Rank+charNUm]);
Rank++;
tem++;
if(Rank == 8) { Rank = 0; }
if(tem == 1000)
{
charNUm++;
if(charNUm == (sizeof(leddata) - 8)) {
charNUm = 0;
}
tem = 0;
}
}
//-----------------主函数----------------------
void main(){
init();
delay(1000);
while (1)
{
OneledRun();
}
}
复制代码
全部资料51hei下载地址:
led8.zip
(83.73 KB, 下载次数: 26)
2021-2-13 15:03 上传
点击文件名下载附件
工程文件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1