proteus 仿真 at89c51 单片机八位抢答器,文末附源文件

这篇具有很好参考价值的文章主要介绍了proteus 仿真 at89c51 单片机八位抢答器,文末附源文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在网上没能容易地直接找到仿真文件,所以我把这个上传,希望对各位有所帮助。

倒是有不少好心人给出了图文教学和源代码,对他们表示感谢。我也是用这位老哥的代码和电路稍作了修改,感谢分享。

proteus 仿真 at89c51 单片机八位抢答器,文末附源文件

简要介绍图中各按钮的作用:

  • 起初 led 数码管是熄灭的,按下 P2.1 的按钮会将它们点亮,开始抢答。

  • 抢答开始后 P2 口按钮失效。按下 P1 口按钮后将在右侧数码管显示对应的选手号码,这时计时将暂停,按下 P2.0 按钮表示回答正确,3 秒左右后数码管熄灭,准备下一轮抢答;按下 P2.1 按钮继续这轮抢答·。

  • 时间耗尽时,暂停 3 秒左右,之后计时器熄灭,准备下一轮抢答。

代码:

#include <reg51.h>
#define RAT 30 // 抢答时间 rush to answer time

sbit DIN = P3 ^ 0; // 与MAX7219的接口引脚定义
sbit LOAD = P3 ^ 1;
sbit CLK = P3 ^ 2;
sbit key0 = P1 ^ 0; // 定义8路抢答器按键
sbit key1 = P1 ^ 1;
sbit key2 = P1 ^ 2;
sbit key3 = P1 ^ 3;
sbit key4 = P1 ^ 4;
sbit key5 = P1 ^ 5;
sbit key6 = P1 ^ 6;
sbit key7 = P1 ^ 7;

sbit speaker = P0 ^ 0;
sbit keyClear = P2 ^ 0;                                                    // 主持人的“清除/设置时间”按键
sbit begin = P2 ^ 1;                                                        // 主持人开始按键
sbit sounder = P3 ^ 7;                                                      // 蜂鸣器相连的引脚
unsigned char second = RAT;                                                 // 秒表计数值
unsigned char counter = 0;                                                  // counter 每计100,minite加1
unsigned char people = 0;                                                   // 抢答结果
unsigned char numAdd[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; // MAX7219的读写地址
unsigned char numDat[] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89};

unsigned char keyScan() { // 键盘扫描函数

    unsigned char keyValue, temp;
    keyValue = 0;
    P1 = 0xff; // P1口的8个引脚设置为输入
    temp = P1;
    if (~(P1 & temp)) { // 如P1口的引脚电平发生变化,有键按下
        switch (temp)
        {
        case 0xfe: // 如P1.0口的引脚电平为低,则S1键按下
            keyValue = 1;
            break;
        case 0xfd: // 如P1.1口的引脚电平为低,则S2键按下
            keyValue = 2;
            break;
        case 0xfb: // 如P1.2口的引脚电平为低,则S3键按下
            keyValue = 3;
            break;
        case 0xf7: // 如P1.3口的引脚电平为低,则S4键按下
            keyValue = 4;
            break;
        case 0xef: // 如P1.4口的引脚电平为低,则S5键按下
            keyValue = 5;
            break;
        case 0xdf: // 如P1.5口的引脚电平为低,则S6键按下
            keyValue = 6;
            break;
        case 0xbf: // 如P1.6口的引脚电平为低,则S7键按下
            keyValue = 7;
            break;
        case 0x7f:
            keyValue = 8; // 如P1.7口的引脚电平为低,则S8键按下
            break;
        default:
            keyValue = 0;
            break;
        }
    }
    return keyValue; // 返回键号
}

void secondIniter() {
    second = RAT;
}

void max7219Send(unsigned char add, unsigned char dat) { // 向MAX7219写命令函数
    unsigned char ADS, i, j;
    LOAD = 0;
    i = 0;
    while (i < 16) {
        if (i < 8) {
            ADS = add;
        } else {
            ADS = dat;
        }
        for (j = 8; j >= 1; j--) {
            DIN = ADS & 0x80;
            ADS <<= 1;
            CLK = 1;
            CLK = 0;
        }
        i += 8;
    }
    LOAD = 1;
}

void max7219Init() { // MAX7219初始化函数
    max7219Send(0x0c, 0x01);
    max7219Send(0x0b, 0x07);
    max7219Send(0x0a, 0xf5);
    max7219Send(0x09, 0xff);
}
void max7219Shutdown() { // MAX7219关闭函数
    max7219Send(0x0C, 0x00); // 发送关闭命令给MAX7219
}
void timeDisplay(unsigned char x) { // 时间显示函数
    unsigned char i, j;
    i = x / 10;
    j = x % 10;
    max7219Send(numAdd[1], numDat[j]);
    max7219Send(numAdd[0], numDat[i]);
}

void scareDisplay(unsigned char x) { // 显示抢答结果函数
    unsigned char i, j;
    i = x / 10;
    j = x % 10;
    max7219Send(numAdd[3], numDat[j]);
    max7219Send(numAdd[2], numDat[i]);
}
void delayMs(unsigned int ms) { // 延时函数
    unsigned int i, j;       // 定义两个循环变量
    for (i = 0; i < ms; i++) // 外层循环控制毫秒数
        for (j = 0; j < 112; j++)
            ; // 内层循环控制微秒数,具体值要根据晶振频率和编译器优化程度调整
}
void mkNoi(char modle) { // 开始和结束时播放
    int i;
    for (i = 0; i < 400 / modle; i++) { 
        speaker = ~speaker;
        delayMs(modle);
    }
}
void bingo() { // 答对了要播放这个
    int i, j;
    for (i = 4; i > 0; i--) {
        for (j = 0; j < 200 / i; j++) {
            speaker = ~speaker;
            delayMs(i);
        }
    }
}
void holderScan() { // 函数功能:设置抢答时间为0~60s
    timeDisplay(second); // 时间显示
    scareDisplay(people);
    if (~keyClear) { // 如果回答正确,开始下一轮抢答
        while (~keyClear)
            ;
        bingo();
        secondIniter();       // 抢答器重置
        delayMs(3000);
        timeDisplay(second); // 显示重置后的时间
        people = 0;
        
        scareDisplay(people); // 显示重置后的抢答区
        
        max7219Shutdown();
    }
}

void timerInit() { // 定时器T0初始化
    EA = 1;
    ET0 = 1;
    TMOD = 0x01; // 定时器T0方式0定时
    TH0 = 0xd8;  // 装入定时初值,10ms中断一次
    TL0 = 0xef;
}

void main() { // 主函数
    while (1) {
        do{
            holderScan();
        } while (begin); // 若未按下“开始”键,则循环
        while (~begin)
            ; // 若按下“开始”键,则往下执行
        mkNoi(1);
        max7219Init(); // MAX7219初始化
        timerInit();   // 定时器T0中断初始化
        TR0 = 1;        // 启动定时器T0
        do {
            timeDisplay(second);  // 显示时间
            scareDisplay(people); // 显示抢答结果
            people = keyScan();
        } while ((!people) && (second)); // 运行直到抢答结束或者时间结束
        TR0 = 0;

        if (!second) { // 回合结束
            timeDisplay(second);
            mkNoi(2);
            delayMs(3000);
            secondIniter();
            max7219Shutdown();
        }
    }
}

void timer0() interrupt 1 { // 定时器T0中断函数
    if (counter < 100) {
        counter++;
        if (counter == 50) {
            sounder = 0; // 蜂鸣器发出声响
        }
    } else {
        sounder = 1;
        counter = 0;
        second--;
    }
    TH0 = 0xd8; // 重新装载定时初值
    TL0 = 0xef;
    TR0 = 1; // 启动T0
}

下载链接:

度盘: https://pan.baidu.com/s/1YU4sybDi_oqA3SSCCIHoGw?pwd=jmvg 提取码: jmvg 复制这段内容后打开百度网盘手机App,操作更方便哦

https://cloud.lilywhite.cc/s/7RrSA

希望自己没有损失的情况下,能有更多人随手分享^^文章来源地址https://www.toymoban.com/news/detail-494072.html

到了这里,关于proteus 仿真 at89c51 单片机八位抢答器,文末附源文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于AT89C51单片机的电子琴设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87848430?spm=1001.2014.3001.5503 源码获取 主要内容: 设计一个简易的电子琴,至少具有可以弹奏并发出不同的音调。电子琴方案主要分为实验的系统分析,具体的实施方案,以及最终的实验检验,最终

    2024年02月07日
    浏览(61)
  • 基于AT89C51单片机的电子密码锁设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87760996?spm=1001.2014.3001.5503 源码获取 主要内容: (1)本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号。 (2)设计开锁密码位六位密码的电子密码锁。 (3)能够LCD显示在密码正确

    2024年02月03日
    浏览(49)
  • 基于AT89C51单片机的电子计数器设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87770826 源码获取 主要内容: 设计一个电子计时器,数码管初始显示值为“00”,每隔1s电子秒表加1;秒计数到60时清0,并从00重新开始。 基本要求: 1、电子定时器电路设计图; 2、电子定时器设

    2024年02月15日
    浏览(55)
  • 基于AT89C51单片机的简易计算器的设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87755299?spm=1001.2014.3001.5503 源码获取 本设计是以单片机AT89C51为核心的简易计算器设计,要通过芯片AT89C51实现计算器程序运行来完成加、减、乘和除的简单计算功能。 基本要求: 1、采用软件设计与

    2024年02月03日
    浏览(57)
  • 基于AT89C51单片机的8位密码锁仿真与实物制作

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/88657969?spm=1001.2014.3001.5503 源码获取 C 源码+仿真图+毕业设计+实物制作步骤+01 摘要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的

    2024年01月23日
    浏览(47)
  • AT89C51单片机红绿灯控制源代码(C语言版)附带Proteus电路图

    这个代码需要稍微改一下才能运行,看得懂的不超过1分钟应该能够搞好。看不懂的无法运行

    2024年02月07日
    浏览(40)
  • 51单片机(At89C51)组成,引脚介绍

    一,单片机的发展史 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/0口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路

    2023年04月13日
    浏览(54)
  • 基于 AT89C51 单片机的数字时钟设计

    目录 1.设计目的、作用 2.设计要求 3.设计的具体实现 3.1 设计原理 3.2 硬件系统设计         3.2.1 AT89C51 单片机原理 3.2.2 晶振电路设计 3.2.3 复位电路设计 3.2.4 LED 数码管显示 3.3 系统实现 3.3.1 系统仿真与调试 3.3.2 演示结果 4.总结 附录 附录 1 附录 2 (1 )掌握 51 系列单片机的

    2024年02月01日
    浏览(58)
  • 基于AT89C51单片机的电子时钟设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87695258?spm=1001.2014.3001.5503 源码获取 主要内容: 1.设计出电子数字钟的电路,并用protus进行仿真画出对应的电路图 2.设计出电子数字钟的源程序,并用Keil进行编辑生成HEX文件 3.在protus中进行测试。

    2024年02月09日
    浏览(63)
  • 单片机AT89C51六位数码管秒表

    详细代码讨论加我QQ:1271370903   本设计的数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现LED显示,显示时间为0~9999.99秒,计时

    2024年02月03日
    浏览(108)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包