找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2687|回复: 2
打印 上一主题 下一主题
收起左侧

基于STC15W4K32S4单片机的两路抢答器Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
功能组成:运行仿真,LCD1602显示24C04保存的数据,按键一:抢答开始按键,当按键按下,倒计时开始,规定时间内,按键A,按键B做出抢答,刷新LCD1602的得分并保存到24C04中,按键4清零24C04的数据。仿真图如下:


单片机源程序如下:
#include "config.h"
#include "USART1.h"
#include "delay.h"
#include "lcd1602.h"
#include "IIC.h"
#include "timer.h"
#include "GPIO.h"

sbit k1=P4^0;
sbit k2=P4^2;
sbit k3=P4^5;
sbit k4=P4^7;

sbit A0=P7^0;
sbit A1=P7^1;
sbit A2=P7^2;
sbit BEEP = P7^7;

uchar code DSY_CODE[]=
{
  0x90,0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9,0xc0
};
unsigned char dat1=0, dat2=0, dat3 =0;
unsigned char times=0,tim=0,start=0,off=0,kes=0;

void UART_config(void);
void Timer_config(void);
uchar scan_key(void);

void main(void)
{
        u8        i;

        UART_config();
        Timer_config();
        EA = 1;

            LCD_init();        
        s_connectionreset();
        
            dat1 = Read_24C02(0x01);
            dat2 = Read_24C02(0x03);
                dat3 = Read_24C02(0x05);
        
        LCD_disp_str(0,1," Responder Game");
                LCD_disp_str(0,2,"A->");
            LCD_disp_str(5,2,"B->");
        LCD_disp_char(3,2,dat1+'0');
            LCD_disp_char(8,2,dat2+'0');
        
         
//                Write_24C02(0x01, dat1);
//                delay_ms(100);
//                Write_24C02(0x03, dat2);
//                delay_ms(100);
//                Write_24C02(0x05, dat3);
               
                BEEP = 0;
               
               
        while (1)
        {        
//                dat1++;
//                Write_24C02(0x01, dat1);
//                delay_ms(300);
//        dat1 = Read_24C02(0x01);
//                LCD_disp_char(3,2,dat1+'0');
                scan_key();
                if(dat1>=9) dat1=0;
                if(dat2>=9) dat2=0;
                //delay_ms(600);

               
                if(COM1.RX_TimeOut > 0)                //超时计数
                {
                        if(--COM1.RX_TimeOut == 0)
                        {
                                if(COM1.RX_Cnt > 0)
                                {
                                        for(i=0; i<COM1.RX_Cnt; i++)        TX1_write2buff(RX1_Buffer[ i]);        //收到的数据原样返回
                                }
                                COM1.RX_Cnt = 0;
                        }
                }
        }
}

uchar scan_key(void)
{
     if(k1==0)
                {
                        delay_ms(100);
                        if(k1==0)
                        {
                                A0=1;A1=1;A2=1;
                                start=1;
                                PrintString1("游戏开始!开始抢答\r\n");
                        }               
                }
               
        if((k2==0)&&(start==1))
        {
           delay_ms(10);
           if(k2==0)
                {
                        A0=0;A1=0;A2=0;
                        kes=2;
                        off=1;
                        dat1++;
                        Write_24C02(0x01, dat1);
                        LCD_disp_char(3,2,dat1+'0');
                        PrintString1("A组抢答成功...\r\n");
                        BEEP = 1;
                        delay_ms(500);
                        BEEP = 0;
                }
        }
        if((k3==0)&&(start==1))
        {
           delay_ms(10);
           if(k3==0)
                {
                        A0=1;A1=0;A2=0;
                        off=1;
                        dat2++;
                        kes=3;
                        Write_24C02(0x03, dat2);
                        LCD_disp_char(8,2,dat2+'0');
                        PrintString1("B组抢答成功...\r\n");
                        BEEP = 1;
                        delay_ms(500);
                        BEEP = 0;
                }
        }
        if(k4==0)
        {
           delay_ms(10);
           if(k4==0)
                {
                        dat1=dat2=0;
                        Write_24C02(0x01, dat1);
                        delay_ms(100);
                        Write_24C02(0x03, dat2);
                        delay_ms(100);
                        LCD_disp_char(3,2,dat1+'0');
                LCD_disp_char(8,2,dat2+'0');
                }
        }
}
/*************  串口1初始化函数 *****************/
void        UART_config(void)
{
        COMx_InitDefine                COMx_InitStructure;                                        //结构定义
        COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //模式,       UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
        COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //使用波特率,   BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
        COMx_InitStructure.UART_BaudRate  = 9600ul;                        //波特率, 一般 110 ~ 115200
        COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
        COMx_InitStructure.BaudRateDouble = DISABLE;                        //波特率加倍, ENABLE或DISABLE
        COMx_InitStructure.UART_Interrupt = ENABLE;                                //中断允许,   ENABLE或DISABLE
        COMx_InitStructure.UART_Polity    = PolityLow;                        //中断优先级, PolityLow,PolityHigh
        COMx_InitStructure.UART_P_SW      = UART1_SW_P30_P31;        //切换端口,   UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
        COMx_InitStructure.UART_RXD_TXD_Short = DISABLE;                //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
        USART_Configuration(USART1, &COMx_InitStructure);                //初始化串口1 USART1,USART2

        PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n");        //SUART1发送一个字符串
}

void Timer_config(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                                        //结构定义
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_Polity    = PolityLow;                        //指定中断优先级, PolityHigh,PolityLow
        TIM_InitStructure.TIM_Interrupt = ENABLE;                                //中断是否允许,   ENABLE或DISABLE
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                        //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = ENABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / (50*12));                //初值,
        TIM_InitStructure.TIM_Run       = ENABLE;                                //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer1,&TIM_InitStructure);                                //初始化Timer1          Timer0,Timer1,Timer2
}

/********************* Timer1中断函数************************/
void timer1_int (void) interrupt TIMER1_VECTOR //20ms
{
if(start==1)
{
           times++;
           if(times>50)
           {
                 times=0;
                 tim++;
                 P6= DSY_CODE[tim];
                 if((tim==9)||(off==1))
                         {start=0;
                          tim=0;
                          off=0;}
                        
           }
}

}

全部资料51hei下载地址:
基于STC15W4K32S4的两路抢答器.rar (239.68 KB, 下载次数: 138)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2021-7-17 03:50 | 只看该作者
用Proteus8.8打开LCD显示空白,仿真失败了
回复

使用道具 举报

板凳
ID:192215 发表于 2022-5-16 10:28 | 只看该作者
我调试时候也遇到过LCD都是白色的问题,大家有解决的办法吗a
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表