Error[8]: Undefined offset: 1053, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

今天试着吧串口的部分重新写了一次,这次的主要功能是可以通过按键与接收数据来返回时间。


基本如下:
波特率调至9600,无校验位,停止位一位。



将内部震荡器频率设定为12MHz。



当按下S4或者发送“TIME”时,向上位机发送当前的时间,否则发送“error”。



然后呢这次用的底层驱动代码是2022年的最新底层代码。


main.c
/*
波特率调至9600,无校验位,停止位一位。


将内部震荡器频率设定为12MHz。


当按下S4或者发送“TIME”时,向上位机发送当前的时间,否则发送“error”。


*/ #include "reg52.h" #include "intrins.h" #include "ds1302.h" #include "string.h" //使用其中的strcmp方法 unsigned char code write_add[]={0x80,0x82,0x84}; unsigned char code read_add[]={0x81,0x83,0x85}; unsigned char code xianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; int time[]={0x50,0x59,0x23}; unsigned char uart_dat[10];//接收数据数组 int uart_index; sfr AUXR=0x8e; sbit S4=P3^3; void send_information_time(); void choose_573(int i) { switch(i) { case(0):P2=(P2&0x1f)|0x00;break; case(4):P2=(P2&0x1f)|0x80;break; case(5):P2=(P2&0x1f)|0xa0;break; case(6):P2=(P2&0x1f)|0xc0;break; case(7):P2=(P2&0x1f)|0xe0;break; } } void init_system() //初始化系统 { choose_573(4); P0=0xff; choose_573(5); P0=0x00; choose_573(0); } //=======================================时间 void write_time() //向ds1302中写入时间 { int i; Write_Ds1302_Byte(0x8e,0x00); for(i=0;i<3;i++) { Write_Ds1302_Byte(write_add[i],time[i]); } Write_Ds1302_Byte(0x8e,0x80); } void read_time() //从ds1302中读取时间 { int i; for(i=0;i<3;i++) { time[i]=Read_Ds1302_Byte(read_add[i]); } } //======================================= //=======================================数码管 void Delay1ms() //@12.000MHz { unsigned char i, j; i = 12; j = 169; do { while (--j); } while (--i); } void SMG(int wei,int dat) { choose_573(6); P0=0x80>>(wei-1); choose_573(7); P0=xianshi[dat]; choose_573(0); Delay1ms(); choose_573(7); P0=xianshi[10]; choose_573(0); } void smg_display() //通过数码管显示当前时间 { SMG(1,time[0]%16); SMG(2,time[0]/16); SMG(3,11); SMG(4,time[1]%16); SMG(5,time[1]/16); SMG(6,11); SMG(7,time[2]%16); SMG(8,time[2]/16); } //======================================= //=======================================按键 void Delay10ms() //@12.000MHz { unsigned char i, j; i = 117; j = 184; do { while (--j); } while (--i); } void key_board() //当按下S4时,串口返回当前时间 { if(S4==0) { Delay10ms(); if(S4==0) { send_information_time(); } } while(!S4); } //======================================= //=======================================串口通讯 void UartInit(void) //9600bps@12.000MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器时钟1T模式 AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设置定时器模式 TL1 = 0xC7; //设置定时初始值 TH1 = 0xFE; //设置定时初始值 ET1 = 0; //禁止定时器%d中断 TR1 = 1; //定时器1开始计时 ES=1; EA=1; } void uart_service() interrupt 4 { if(RI==1) { uart_dat[uart_index++]=SBUF; RI=0; } } void send_dat(unsigned char dat) //返回数据 { SBUF=dat; while(TI==0); TI=0; } void send_string(unsigned char *str) //返回字符串 { while(*str!=')'send_dat { (*++str);} } //======================================= //=======================================返回当前时间 void send_information_time ()send_string { ("now time is:");send_dat ([time2]/16+0x30);send_dat ([time2]%16+0x30);send_dat ('-');send_dat ([time1]/16+0x30);send_dat ([time1]%16+0x30);send_dat ('-');send_dat ([time0]/16+0x30);send_dat ([time0]%16+0x30);send_string ("\r\n");} //=======================================返回错误 void send_information_error ()send_string { ("ERROR");send_string ("\r\n");} //======================================= //=======================================接收数据判断是否发送当前时间 void judge ()if { (==uart_index4)if { (strcmp(,uart_dat"TIME")==1)//当判断接收为“TIME”时返回当前时间 send_information_time { ();} else //否则返回“error” send_information_error { ();} = uart_index0;} if (4uart_index>)//如果接收到的数据串大于4个,则也返回“error” = { uart_index0;send_information_error ();} } //======================================= void main ()init_system { ();write_time ();UartInit ();while (1)read_time { ();smg_display ();key_board ();judge ();} } #

ds1302.c
include"ds1302.h" //写字节  									

void
Write_Ds1302 (unsignedchar  ) tempunsigned 
{
	char ; ifor
	( =i0;<i8;++i)=     	
	{ 
		SCK 0 ;=
		SDA & temp0x01;1
		temp>>=;= 
		SCK1;}
	}
//向DS1302寄存器写入数据   

void
Write_Ds1302_Byte (unsigned char , addressunsignedchar ) dat =     
{
 	RST0;_nop_	();=
 	SCK0;_nop_	();=
 	RST1;_nop_ 	();Write_Ds1302  
 	()address;Write_Ds1302	
 	()dat;=		
 	RST0;} 
//从DS1302寄存器读出数据

unsigned
char Read_Ds1302_Byte ( unsigned char ) address unsigned
{
 	char , i=temp0x00;=
 	RST0;_nop_	();=
 	SCK0;_nop_	();=
 	RST1;_nop_	();Write_Ds1302
 	()address;for
 	( =i0;<i8;++i)= 	
 	{		
		SCK0;1
		temp>>=;if	
 		()SDA|=
 		temp0x80;=	
 		SCK1;}
	= 
 	RST0;_nop_	();=
 	SCK0;_nop_	();=
	SCK1;_nop_	();=
	SDA0;_nop_	();=
	SDA1;_nop_	();return
	( )temp;}			
#

ds1302.h
ifndef__DS1302_H #
define__DS1302_H #

include# 
include= 

sbit SCK ^ P17;=		
sbit SDA ^ P23;=		
sbit RST ^ P13;void 

Write_Ds1302 (unsignedchar ) temp;void
Write_Ds1302_Byte (unsigned char , addressunsignedchar ) dat ;unsigned
char Read_Ds1302_Byte (unsigned char ) address ;#

endif[+++]

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
蓝桥杯单片机串口通讯_C_内存溢出

蓝桥杯单片机串口通讯

蓝桥杯单片机串口通讯,第1张

今天试着吧串口的部分重新写了一次,这次的主要功能是可以通过按键与接收数据来返回时间。


基本如下:
波特率调至9600,无校验位,停止位一位。



将内部震荡器频率设定为12MHz。



当按下S4或者发送“TIME”时,向上位机发送当前的时间,否则发送“error”。



然后呢这次用的底层驱动代码是2022年的最新底层代码。


main.c
/*
波特率调至9600,无校验位,停止位一位。


将内部震荡器频率设定为12MHz。


当按下S4或者发送“TIME”时,向上位机发送当前的时间,否则发送“error”。


*/ #include "reg52.h" #include "intrins.h" #include "ds1302.h" #include "string.h" //使用其中的strcmp方法 unsigned char code write_add[]={0x80,0x82,0x84}; unsigned char code read_add[]={0x81,0x83,0x85}; unsigned char code xianshi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; int time[]={0x50,0x59,0x23}; unsigned char uart_dat[10];//接收数据数组 int uart_index; sfr AUXR=0x8e; sbit S4=P3^3; void send_information_time(); void choose_573(int i) { switch(i) { case(0):P2=(P2&0x1f)|0x00;break; case(4):P2=(P2&0x1f)|0x80;break; case(5):P2=(P2&0x1f)|0xa0;break; case(6):P2=(P2&0x1f)|0xc0;break; case(7):P2=(P2&0x1f)|0xe0;break; } } void init_system() //初始化系统 { choose_573(4); P0=0xff; choose_573(5); P0=0x00; choose_573(0); } //=======================================时间 void write_time() //向ds1302中写入时间 { int i; Write_Ds1302_Byte(0x8e,0x00); for(i=0;i<3;i++) { Write_Ds1302_Byte(write_add[i],time[i]); } Write_Ds1302_Byte(0x8e,0x80); } void read_time() //从ds1302中读取时间 { int i; for(i=0;i<3;i++) { time[i]=Read_Ds1302_Byte(read_add[i]); } } //======================================= //=======================================数码管 void Delay1ms() //@12.000MHz { unsigned char i, j; i = 12; j = 169; do { while (--j); } while (--i); } void SMG(int wei,int dat) { choose_573(6); P0=0x80>>(wei-1); choose_573(7); P0=xianshi[dat]; choose_573(0); Delay1ms(); choose_573(7); P0=xianshi[10]; choose_573(0); } void smg_display() //通过数码管显示当前时间 { SMG(1,time[0]%16); SMG(2,time[0]/16); SMG(3,11); SMG(4,time[1]%16); SMG(5,time[1]/16); SMG(6,11); SMG(7,time[2]%16); SMG(8,time[2]/16); } //======================================= //=======================================按键 void Delay10ms() //@12.000MHz { unsigned char i, j; i = 117; j = 184; do { while (--j); } while (--i); } void key_board() //当按下S4时,串口返回当前时间 { if(S4==0) { Delay10ms(); if(S4==0) { send_information_time(); } } while(!S4); } //======================================= //=======================================串口通讯 void UartInit(void) //9600bps@12.000MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器时钟1T模式 AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设置定时器模式 TL1 = 0xC7; //设置定时初始值 TH1 = 0xFE; //设置定时初始值 ET1 = 0; //禁止定时器%d中断 TR1 = 1; //定时器1开始计时 ES=1; EA=1; } void uart_service() interrupt 4 { if(RI==1) { uart_dat[uart_index++]=SBUF; RI=0; } } void send_dat(unsigned char dat) //返回数据 { SBUF=dat; while(TI==0); TI=0; } void send_string(unsigned char *str) //返回字符串 { while(*str!=')'send_dat { (*++str);} } //======================================= //=======================================返回当前时间 void send_information_time ()send_string { ("now time is:");send_dat ([time2]/16+0x30);send_dat ([time2]%16+0x30);send_dat ('-');send_dat ([time1]/16+0x30);send_dat ([time1]%16+0x30);send_dat ('-');send_dat ([time0]/16+0x30);send_dat ([time0]%16+0x30);send_string ("\r\n");} //=======================================返回错误 void send_information_error ()send_string { ("ERROR");send_string ("\r\n");} //======================================= //=======================================接收数据判断是否发送当前时间 void judge ()if { (==uart_index4)if { (strcmp(,uart_dat"TIME")==1)//当判断接收为“TIME”时返回当前时间 send_information_time { ();} else //否则返回“error” send_information_error { ();} = uart_index0;} if (4uart_index>)//如果接收到的数据串大于4个,则也返回“error” = { uart_index0;send_information_error ();} } //======================================= void main ()init_system { ();write_time ();UartInit ();while (1)read_time { ();smg_display ();key_board ();judge ();} } #

ds1302.c
include"ds1302.h" //写字节  									

void
Write_Ds1302 (unsignedchar  ) tempunsigned 
{
	char ; ifor
	( =i0;<i8;++i)=     	
	{ 
		SCK 0 ;=
		SDA & temp0x01;1
		temp>>=;= 
		SCK1;}
	}
//向DS1302寄存器写入数据   

void
Write_Ds1302_Byte (unsigned char , addressunsignedchar ) dat =     
{
 	RST0;_nop_	();=
 	SCK0;_nop_	();=
 	RST1;_nop_ 	();Write_Ds1302  
 	()address;Write_Ds1302	
 	()dat;=		
 	RST0;} 
//从DS1302寄存器读出数据

unsigned
char Read_Ds1302_Byte ( unsigned char ) address unsigned
{
 	char , i=temp0x00;=
 	RST0;_nop_	();=
 	SCK0;_nop_	();=
 	RST1;_nop_	();Write_Ds1302
 	()address;for
 	( =i0;<i8;++i)= 	
 	{		
		SCK0;1
		temp>>=;if	
 		()SDA|=
 		temp0x80;=	
 		SCK1;}
	= 
 	RST0;_nop_	();=
 	SCK0;_nop_	();=
	SCK1;_nop_	();=
	SDA0;_nop_	();=
	SDA1;_nop_	();return
	( )temp;}			
#

ds1302.h
ifndef__DS1302_H #
define__DS1302_H #

include# 
include= 

sbit SCK ^ P17;=		
sbit SDA ^ P23;=		
sbit RST ^ P13;void 

Write_Ds1302 (unsignedchar ) temp;void
Write_Ds1302_Byte (unsigned char , addressunsignedchar ) dat ;unsigned
char Read_Ds1302_Byte (unsigned char ) address ;#

endif

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存