求一个c51的单片机c语言小程序,有酬谢。1
发布网友
发布时间:2023-10-08 21:35
我来回答
共1个回答
热心网友
时间:2024-11-20 11:40
#include"REG52.h"//包含52头文件
#define ASCII_Mode 0
#define HEX_Mode 1
#define TRUE 1//定义布尔量'1':真
#define FALSE 0//定义布尔量'0':假
#define uchar unsigned char//定义 无符号字符型数据 简称
#define uint unsigned int//定义 无符号整型数据 简称
#define th1 0xfa//6.51us at 11.0592MHz Fosc for 8bit auto reload mode
uchar UART_DataR;//串口接收数据寄存器
uchar bdata Flag=0;//标志位 寄存器
sbit UART_ReFlag=Flag^0;//串口接收标志位 0:无数据 1:新数据
sbit UART_SendFlag=Flag^1;//串口发送标志位 0:空闲中 1:发送中
#define th0 0x4c
#define tl0 0x00//50ms at 11.0592MHz Fosc in Model 1
sbit LED=P2^1;
#define LED_On LED=0
#define LED_Off LED=1
#define FlickTimeAt50msCount 4//50ms*4=200ms
#define LED_FlickTimes 3
#define UserCodeLeng 5
uchar code UART_UserCode[UserCodeLeng]="qwert";
uchar UART_RecData;//UART_RecBuf[UserCodeLeng],
bit T50msFlag=0,UART_PassFlag,LED_FlickFlag,LED_OutFlag;
void Timer0() interrupt 1
{
static uchar t50ms=0;
TL0=tl0;
TH0=th0;
//T50msFlag=TRUE;
if(++t50ms>=FlickTimeAt50msCount)
{
t50ms-=FlickTimeAt50msCount;
LED_FlickFlag=TRUE;
}
}
void UART()interrupt 4//串口中断函数
{
if(RI)//若串口接收完成
{
RI=0;//清 串口接收溢出位
UART_DataR=SBUF;//将串口收到的数据存进 UART_DataR
UART_ReFlag=TRUE;//串口接收标志位 置位(有新数据)
}
if(TI)//若串口发送完成
{
TI=0;//清 串口发送溢出位
UART_SendFlag=FALSE;//清串口发送标志位(空闲中)
}
}
void UART_Init()//串口初始化函数
{
SCON=0x50;//选择通讯方式:10位异步收发,串口中断使能
PCON=0x80;//波特率倍频
TMOD &=0x0F;
TMOD |=0x20;//定时器1工作模式2(8位自重装,做波特率发生器)
TH1=th1;//定时器初值
TL1=th1;//定时器初值
TR1=1;//开始计时
ES=1;//允许串口中断
EA=1;//允许系统中断
}
bit UART_SendByte(uchar send_data) //串口发送字节函数,发送内容send_data,返回值:0 操作失败,1操作成功
{
if(!UART_SendFlag)//若串口空闲中,则
{
SBUF=send_data;//将发送内容 送到 串口寄存器
UART_SendFlag=TRUE;//置位串口发送标志位(进入忙态)
return TRUE;//返回1,操作成功
}
return FALSE;//否则,返回0,操作失败
}
uchar ASCII_ToHex(uchar ascii_data)//ASCII 转 Hex 函数
{
uchar hex_data=0;//定义 Hex变量存储转换结果
if(ascii_data>='0' && ascii_data<='9') hex_data=ascii_data-'0';//若 转换内容为 字符'0-9',则转成对应数字0-9
else if(ascii_data>='a' && ascii_data<='f') hex_data=ascii_data-'a'+10;//若 转换内容为 字符'a-f',则转成数字10-15
else if(ascii_data>='A' && ascii_data<='F') hex_data=ascii_data-'A'+10;//若 转换内容为 字符'A-F',则转成数字10-15
return hex_data;//返回转换结果,非以上字符,不在Hex(0-F)范围内,默认0
}
bit UART_ReadByte(uchar *p_data,bit data_mode) //串口读字节函数,返回值0 无数据,1 有数据,将结果以data_mood模式(ASCII_Mode或HEX_Mode)存到p_data指向地址
{
if(!UART_ReFlag) return FALSE;//若无新数据,则返回 0(无数据)
UART_ReFlag=FALSE;//否则,清 串口接收标志位
if(data_mode==HEX_Mode) *p_data=UART_DataR;//Hex模式,将串口接收结果存到p_data指向地址
if(data_mode==ASCII_Mode) *p_data=ASCII_ToHex(UART_DataR);//ASCII模式,将串口接收结果转成Hex后,存到p_data指向地址
return TRUE;//返回 1(有数据)
}
bit UART_Send(uchar data_leng,uchar *data_buf)
{
static bit send_start_flag=0;
static uchar send_leng,*send_buf,*send_loca;
if(!send_start_flag)
{
send_leng=data_leng;
send_buf=data_buf;
send_loca=send_buf;
send_start_flag=TRUE;
}
if(send_loca-send_buf==send_leng)
{
send_start_flag=FALSE;
return TRUE;
}
else if(UART_SendByte(*send_loca)) *send_loca++;
return FALSE;
}
void TimerInit()
{
TMOD&=0xf0;
TMOD|=0x01;
TH0=th0;
TL0=tl0;
TR0=0;
ET0=1;
EA=1;
}
void LED_Out()
{
static uchar flick_times=0;
static bit start_flag=FALSE;
if(LED_OutFlag)
{
LED_OutFlag=FALSE;
start_flag=TRUE;
TH0=th0;
TL0=tl0;
LED_On;
TR0=1;
}
if(start_flag)
{
if(LED_FlickFlag)
{
LED_FlickFlag=FALSE;
LED=~LED;
if(++flick_times>=(LED_FlickTimes<<1)-1)
{
flick_times=0;
LED_Off;
start_flag=FALSE;
TR0=0;
}
}
}
}
void UART_Check()
{
static uchar rec_num=0;
if(UART_ReadByte(&UART_RecData,HEX_Mode))
{
if(UART_RecData==UART_UserCode[rec_num]) rec_num++;
else rec_num=0;
if(rec_num==UserCodeLeng)
{
UART_PassFlag=TRUE;
LED_OutFlag=TRUE;
}
}
if(UART_PassFlag)
{
if(UART_Send(2,"OK")) UART_PassFlag=FALSE;
}
}
void main()
{
UART_Init();
TimerInit();
while(1)
{
UART_Check();
LED_Out();
}
}
这里面是 2个C文件,1个头文件的合成,没编译的,愿上帝保佑你吧