功能組成:運行仿真,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, 下載次數: 153)
2021-7-15 21:07 上傳
點擊文件名下載附件
|