2024-09-01
售卖作品
00

智能广告牌设计

可选择左右屏幕移动

通过串口修改字幕内容

显示实时时间和温度

cpp
#号按键可以清空广告,别的字符串广告直接串口输入即可

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

c
#include <reg52.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int rtc_hour = 16, rtc_min = 59, rtc_sec = 55; /* 时间 */ bit flag1s = 0; /* 1s定时标志 */ unsigned char T0RH = 0; /* T0重载值的高字节 */ unsigned char T0RL = 0; /* T0重载值的低字节 */ unsigned char count_str = 0; /* 计数多少个字符 */ void ConfigTimer0( unsigned int ms ); unsigned char IntToString( unsigned char *str, int dat ); extern bit Start18B20(); extern bit Get18B20Temp( int *temp ); extern void InitLcd1602(); extern void LcdShowStr( unsigned char x, unsigned char y, unsigned char *str ); void dis_time(); /* 刷新时间显示 */ void display( char num ); /* 显示一个字符串 */ void SerInit( void ); /* 初始化串口 */ char start_char_num = 0; char zifu1[16] = "123456789aqwerty"; sbit out = P2 ^ 3; sbit key_in1 = P2 ^ 4; void main() { bit res; int temp; /* 读取到的当前温度值 */ int intT, decT; /* 温度值的整数和小数部分 */ unsigned char len; unsigned char str[12]; char dir = 0; out = 0; /* 输出低电平 */ EA = 1; /* 开总中断 */ ConfigTimer0( 10 ); /* T0定时10ms */ Start18B20(); /* 启动DS18B20 */ InitLcd1602(); /* 初始化液晶 */ SerInit(); while ( 1 ) { if ( key_in1 == 0 ) { if ( key_in1 == 0 ) { while ( key_in1 == 0 ) ; dir = !dir; start_char_num=2; } } if ( flag1s ) /* 每秒更新一次温度 */ { TR0 = 0; /* 短暂关闭计时 防止冲突 */ flag1s = 0; res = Get18B20Temp( &temp ); /* 读取当前温度 */ if ( res ) /* 读取成功时,刷新当前温度显示 */ { intT = temp >> 4; /* 分离出温度值整数部分 */ decT = temp & 0xF; /* 分离出温度值小数部分 */ len = IntToString( str, intT ); /* 整数部分转换为字符串 */ str[len++] = '.'; /* 添加小数点 */ decT = (decT * 10) / 16; /* 二进制的小数部分转换为1位十进制位 */ str[len++] = decT + '0'; /* 十进制小数位再转换为ASCII字符 */ while ( len < 6 ) /* 用空格补齐到6个字符长度 */ { str[len++] = ' '; } str[len] = '\0'; /* 添加字符串结束符 */ LcdShowStr( 0, 0, str ); /* 显示到液晶屏上 */ }else { /* 读取失败时,提示错误信息 */ LcdShowStr( 0, 0, "error!" ); } Start18B20(); /* 重新启动下一次转换 */ if ( dir == 0 ) { start_char_num++; /* 从哪里开始显示 */ if ( start_char_num >= 16 ) { start_char_num = 0; } display( start_char_num ); /* 显示哪一个字符 从哪开始显示 */ }else{ start_char_num--; /* 从哪里开始显示 */ if ( start_char_num == -1 ) { start_char_num = 15; } display( start_char_num ); /* 显示哪一个字符 从哪开始显示 */ } TR0 = 1; /* 打开计时 */ } } } /* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */ unsigned char IntToString( unsigned char *str, int dat ) { signed char i = 0; unsigned char len = 0; unsigned char buf[6]; if ( dat < 0 ) /* 如果为负数,首先取绝对值,并在指针上添加负号 */ { dat = -dat; *str++ = '-'; len++; } do /* 先转换为低 } *str = '\0'; /* 添加字符串结束符 */ return(len); /* 返回字符串长度 */ } /* 配置并启动T0,ms-T0定时时间 */ void ConfigTimer0( unsigned int ms ) TH0 = T0RH; /* 加载T0重载值 */ TL0 = T0RL; ET0 = 1; /* 使能T0中断 */ TR0 = 1; /* 启动T0 */ } /* T0中断服务函数,完成1秒定时 */ void InterruptTimer0() interrupt 1 { static unsigned char tmr1s = 0; TH0 = T0RH; /* 重新加载重载值 */ TL0 = T0RL; tmr1s++; if ( tmr1s >= 100 ) } /* /刷新时间的显示 */ dis_time(); } } void Uart_isr() interrupt 4 /* 中断接收程序 */ { char Txd_data = 0; if ( RI ) /* 判断是否接收完,接收完成后,由硬件置RI位 */ { Txd_data = SBUF; /* 读入缓冲区 */ RI = 0; /* RI清标志 */ if ( Txd_data == '~' ) /* 清空数组 */ { memset( zifu1, ' ', 16 ); count_str = 0; }else{ zifu1[count_str++] = Txd_data; /* 字符存入 */ } } }

在这里插入图片描述

代码工程打开下载:

cpp
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!