標(biāo)題: 基于STC15W4K32S4單片機(jī)的兩路搶答器Proteus仿真程序 [打印本頁(yè)]

作者: 54545545    時(shí)間: 2021-7-15 21:11
標(biāo)題: 基于STC15W4K32S4單片機(jī)的兩路搶答器Proteus仿真程序
功能組成:運(yùn)行仿真,LCD1602顯示24C04保存的數(shù)據(jù),按鍵一:搶答開(kāi)始按鍵,當(dāng)按鍵按下,倒計(jì)時(shí)開(kāi)始,規(guī)定時(shí)間內(nèi),按鍵A,按鍵B做出搶答,刷新LCD1602的得分并保存到24C04中,按鍵4清零24C04的數(shù)據(jù)。仿真圖如下:


單片機(jī)源程序如下:
#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)                //超時(shí)計(jì)數(shù)
                {
                        if(--COM1.RX_TimeOut == 0)
                        {
                                if(COM1.RX_Cnt > 0)
                                {
                                        for(i=0; i<COM1.RX_Cnt; i++)        TX1_write2buff(RX1_Buffer[ i]);        //收到的數(shù)據(jù)原樣返回
                                }
                                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("游戲開(kāi)始!開(kāi)始搶答\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初始化函數(shù) *****************/
void        UART_config(void)
{
        COMx_InitDefine                COMx_InitStructure;                                        //結(jié)構(gòu)定義
        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;                        //中斷優(yōu)先級(jí), PolityLow,PolityHigh
        COMx_InitStructure.UART_P_SW      = UART1_SW_P30_P31;        //切換端口,   UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必須使用內(nèi)部時(shí)鐘)
        COMx_InitStructure.UART_RXD_TXD_Short = DISABLE;                //內(nèi)部短路RXD與TXD, 做中繼, ENABLE,DISABLE
        USART_Configuration(USART1, &COMx_InitStructure);                //初始化串口1 USART1,USART2

        PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n");        //SUART1發(fā)送一個(gè)字符串
}

void Timer_config(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                                        //結(jié)構(gòu)定義
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_Polity    = PolityLow;                        //指定中斷優(yōu)先級(jí), PolityHigh,PolityLow
        TIM_InitStructure.TIM_Interrupt = ENABLE;                                //中斷是否允許,   ENABLE或DISABLE
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                        //指定時(shí)鐘源, 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;                                //是否初始化后啟動(dòng)定時(shí)器, ENABLE或DISABLE
        Timer_Inilize(Timer1,&TIM_InitStructure);                                //初始化Timer1          Timer0,Timer1,Timer2
}

/********************* Timer1中斷函數(shù)************************/
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, 下載次數(shù): 153)



作者: 51hei團(tuán)團(tuán)    時(shí)間: 2021-7-17 03:50
用Proteus8.8打開(kāi)LCD顯示空白,仿真失敗了
作者: kkscan0821    時(shí)間: 2022-5-16 10:28
我調(diào)試時(shí)候也遇到過(guò)LCD都是白色的問(wèn)題,大家有解決的辦法嗎a

作者: QEQWE123    時(shí)間: 2024-6-18 11:09

我調(diào)試時(shí)候也遇到過(guò)LCD都是白色的問(wèn)題,大家有解決的辦法嗎a





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1