如果您想了解WordPress更新至5.6.1-仍保留版本5.5.3的相关知识,那么本文是一篇不可错过的文章,我们将对wordpress最新版本进行全面详尽的解释,并且为您提供关于.NET框架Micr
如果您想了解WordPress 更新至 5.6.1 - 仍保留版本 5.5.3的相关知识,那么本文是一篇不可错过的文章,我们将对wordpress最新版本进行全面详尽的解释,并且为您提供关于.NET 框架 Microsoft .NET Framework (更新至.NET Framework4.8)、1.6.1.24 更新至 1.7.7.4 数据库架构错误、2023 年度首发!JetBrains 全线 IDE 更新至 v2023.1、C51 单片机 SIM900A 手机给门禁解锁 智能家居 【C 程序代码已开源,更新至 Ver4.0】的有价值的信息。
本文目录一览:- WordPress 更新至 5.6.1 - 仍保留版本 5.5.3(wordpress最新版本)
- .NET 框架 Microsoft .NET Framework (更新至.NET Framework4.8)
- 1.6.1.24 更新至 1.7.7.4 数据库架构错误
- 2023 年度首发!JetBrains 全线 IDE 更新至 v2023.1
- C51 单片机 SIM900A 手机给门禁解锁 智能家居 【C 程序代码已开源,更新至 Ver4.0】
WordPress 更新至 5.6.1 - 仍保留版本 5.5.3(wordpress最新版本)
如何解决WordPress 更新至 5.6.1 - 仍保留版本 5.5.3
我必须将 wordpress 更新到 5.6.1 版。在 5.5.3 版上没有错误,并提示有 5.6.1 版的更新。
我看到了进度信息
- 下载 5.6.1。
- 解压成功
- 安装成功 但是它打开了 5.5.3 信息
解决方法
好的,现在可以了。我安装了 jQuery Migrate。新登录后,有更新数据库的消息。现在是 5.6.1
.NET 框架 Microsoft .NET Framework (更新至.NET Framework4.8)
https://dotnet.microsoft.com/download/dotnet-framework
产品名称 | 离线安装包 |
.NET Framework 4.8 | 点击下载 |
.NET Framework 4.7.2 | 点击下载 |
.NET Framework 4.7.1 | 点击下载 |
.NET Framework 4.6.2 | 点击下载 |
.NET Framework 4.6.1 | 点击下载 |
.NET Framework 4.6 | 点击下载 |
.NET Framework 4.5.2 | 点击下载 |
.NET Framework 4.5.1 | 点击下载 |
.NET Framework 4.0 | 点击下载 |
.NET Framework 3.5 SP1 | 点击下载 |
.NET Framework 3.5 | 点击下载 |
.NET Framework 3.0 SP1 | 点击下载 |
1.6.1.24 更新至 1.7.7.4 数据库架构错误
如何解决1.6.1.24 更新至 1.7.7.4 数据库架构错误
在迭代之后,我正在沙箱升级 MAMP 中我的实时 Prestashop 网站的副本(免费):
-
我的网站是 1.6.1.3
-
我通过一键更新将所述的 1.6.1.3 更新为 1.6.1.24,一切顺利,然后我在卸载和删除时将 MAMP 从 PHP 5.6.40 更改为 7.1.33(按此顺序)所有非原生模块和主题(评论和付费插件除外)
-
我在不同的 htdocs 目录和不同的数据库中全新安装了 1.6.1.24,然后在模块评论和付费插件中复制了 img 文件夹和设置文件
-
我删除了 1.6.1.3 更新到 1.6.1.24 目录和全新安装的 1.6.1.24 数据库,并将 1.6.1.24 全新安装连接到 1.6.1.3 更新到 1.6.1.24 数据库,我修改了新鲜安装 1.6.1.24 目录以匹配已删除的更新目录
-
所以我有一个全新安装的 PrestaShop 连接到我以前的历史完整数据库
-
在整个过程中,我保持非本地模块和覆盖停用,并使用模块 Prestashop 清洁器 1.8 执行多个数据库结帐并恢复到官方主题,因此是一种非常“原始”的情况。
此时,我测试了我发现自己使用的本地网站的所有功能,一切正常,使用调试模式时没有错误,因此使用一键模块更新到PS 1.7感觉很舒服.7.4.
- 我将 zip 文件放在下载文件夹中并继续更新。文件更新过程中一切顺利(全部为绿色),但是当进程进入数据库时,我发现自己出现错误,后台几乎无法访问,前台和后台订单、客户和设置无法访问由于重定向过多。
这里是数据库更新的情况和错误:
Updating database schema...
Executing: CREATE TABLE ps_translation (id_translation INT AUTO_INCREMENT NOT NULL,id_lang INT NOT NULL,`key` TEXT NOT NULL COLLATE utf8_bin,translation TEXT NOT NULL,domain VARCHAR(80) NOT NULL,theme VARCHAR(32) DEFAULT NULL,INDEX IDX_ADEBEB36BA299860 (id_lang),INDEX `key` (domain),PRIMARY KEY(id_translation)) DEFAULT CHaraCTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
Executing: CREATE TABLE ps_module_history (id INT AUTO_INCREMENT NOT NULL,id_employee INT NOT NULL,id_module INT NOT NULL,date_add DATETIME NOT NULL,date_upd DATETIME NOT NULL,PRIMARY KEY(id)) DEFAULT CHaraCTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
Executing: CREATE TABLE ps_admin_filter (id INT AUTO_INCREMENT NOT NULL,employee INT NOT NULL,shop INT NOT NULL,controller VARCHAR(60) NOT NULL,action VARCHAR(100) NOT NULL,filter LONGTEXT NOT NULL,filter_id VARCHAR(191) NOT NULL,UNIQUE INDEX admin_filter_search_id_idx (employee,shop,controller,action,filter_id),PRIMARY KEY(id)) DEFAULT CHaraCTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
Executing: DROP INDEX lang_iso_code ON ps_lang
Executing: ALTER TABLE ps_lang CHANGE active active tinyint(1) NOT NULL DEFAULT ''0'',CHANGE iso_code iso_code VARCHAR(2) NOT NULL,CHANGE language_code language_code VARCHAR(5) NOT NULL,CHANGE date_format_lite date_format_lite VARCHAR(32) NOT NULL DEFAULT ''Y-m-d'',CHANGE date_format_full date_format_full VARCHAR(32) NOT NULL DEFAULT ''Y-m-d H:i:s'',CHANGE is_rtl is_rtl tinyint(1) NOT NULL DEFAULT ''0''
Executing: CREATE INDEX IDX_2F43BFC7BA299860 ON ps_lang_shop (id_lang)
Executing: ALTER TABLE ps_lang_shop RENAME INDEX id_shop TO IDX_2F43BFC7274A50A0
Executing: DROP INDEX id_lang ON ps_attribute_lang
Executing: CREATE INDEX IDX_3ABE46A77A4F53DC ON ps_attribute_lang (id_attribute)
Executing: CREATE INDEX IDX_3ABE46A7BA299860 ON ps_attribute_lang (id_lang)
Executing: DROP INDEX deleted ON ps_shop_group
Executing: ALTER TABLE ps_shop_group CHANGE active active tinyint(1) NOT NULL DEFAULT ''1'',CHANGE deleted deleted tinyint(1) NOT NULL DEFAULT ''0''
Executing: DROP INDEX id_parent ON ps_tab
Executing: DROP INDEX class_name ON ps_tab
Executing: ALTER TABLE ps_tab ADD route_name VARCHAR(256) DEFAULT NULL,CHANGE position position INT NOT NULL,CHANGE active active tinyint(1) NOT NULL DEFAULT ''1'',CHANGE hide_host_mode hide_host_mode tinyint(1) NOT NULL DEFAULT ''0'',CHANGE icon icon VARCHAR(32) DEFAULT ''''
Executing: DROP INDEX id_shop_group ON ps_shop
Executing: DROP INDEX id_category ON ps_shop
Executing: ALTER TABLE ps_shop CHANGE id_category id_category INT NOT NULL DEFAULT ''1'',CHANGE theme_name theme_name VARCHAR(255) NOT NULL,CHANGE deleted deleted tinyint(1) NOT NULL DEFAULT ''0''
Executing: CREATE INDEX IDX_CBDFBB9EF5C9E40 ON ps_shop (id_shop_group)
Executing: ALTER TABLE ps_attribute CHANGE color VARCHAR(32) NOT NULL,CHANGE position INT NOT NULL DEFAULT ''0''
01:24:42 ERROR [console] Error thrown while running command "prestashop:schema:update-without-foreign --env=prod". Message: "An exception occurred while executing ''ALTER TABLE ps_attribute CHANGE color color VARCHAR(32) NOT NULL,CHANGE position position INT NOT NULL DEFAULT ''0'' '':
sqlSTATE[01000]: Warning: 1265 Data truncated for column ''color'' at row 20" ["exception" => Doctrine\\DBAL\\Exception\\DriverException { …},"command" => "prestashop:schema:update-without-foreign --env=prod","message" => """ An exception occurred while executing ''ALTER TABLE ps_attribute CHANGE color color VARCHAR(32) NOT NULL,CHANGE position position INT NOT NULL DEFAULT ''0'' '':\\n \\n sqlSTATE[01000]: Warning: 1265 Data truncated for column ''color'' at row 20 """]
In AbstractMysqLDriver.PHP line 106:
An exception occurred while executing ''ALTER TABLE ps_attribute CHANGE colo
r color VARCHAR(32) NOT NULL,CHANGE position INT NOT NULL DEFAULT
''0'' '':
sqlSTATE[01000]: Warning: 1265 Data truncated for column ''color'' at row 20
In PDOConnection.PHP line 90:
sqlSTATE[01000]: Warning: 1265 Data truncated for column ''color'' at row 20
In PDOConnection.PHP line 88:
sqlSTATE[01000]: Warning: 1265 Data truncated for column ''color'' at row 20
prestashop:schema:update-without-foreign [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--id_shop [ID_SHOP]] [--id_shop_group [ID_SHOP_GROUP]] [--]
您有什么解决方案建议吗? 在继续 1.7.7.4 更新之前,如何解决引发问题的表以纠正它们? 非常感谢您提供的任何建议。
以下是出错时MAMP的规格: PHP:7.1.33
max_execution_time30000
max_file_uploads20
max_input_nesting_level64
max_input_time60000
max_input_vars10000
memory_limit1024M
post_max_size256M
网络服务器:Apache
2023 年度首发!JetBrains 全线 IDE 更新至 v2023.1
JetBrains 是一家尖端的软件供应商,专门创建智能开发工具,包括 IntelliJ IDEA-- 领先的 Java IDE,以及 Kotlin 编程语言。
慧都与 JetBrains 早已建立长期合作伙伴关系,致力于助力企业实现数字化、智能化变革。
日前,JetBrains 官方团队已为所有 JetBrains IDE 和 .NET 工具发布首个年度更新版本 – 2023.1。
基于 IntelliJ 的 IDE
大多数 IDE 都将具有以下新功能:
- 新 UI 已经更新,可为您提供更加完善的无缝体验,目前它仍处于测试版阶段,通过设置提供。
- 大量提升 Git、GitHub 和其他版本控制系统使用体验的新功能,包括改进的 Branches(分支)弹出窗口、后台提交检查等。
- Web 开发改进,包括新的 Astro 框架支持以及适用于 Vue、React 和 Angular 用户的增强功能。
- 添加了对即将推出的 TypeScript 5.0 中的主要功能的支持。
- 添加了一些可以提升 Docker 使用体验的新功能,其中包括来自所有 Docker Compose 容器的合并日志视图以及对 Azure 容器注册表的支持。
此外,还有更多产品特定的更改,请参阅下面的摘要并更深入地了解您感兴趣的产品的更多信息。
IntelliJ IDEA 2023.1 现已提供一系列新功能和改进。 IDE 的新 UI 已经更新,提供更加完善的无缝体验。 最新性能增强加快了 Maven 导入,使 IDE 功能在打开项目时更早可用,并通过后台提交检查简化了提交流程。 IntelliJ IDEA Ultimate 现在支持 Spring Security 匹配器和请求映射的导航。 这些只是 v2023.1 中的一些改进,目的是简化您的编码体验并提高工作效率。
PyCharm 2023.1 带来期待已久的远程 Jupyter Notebook 支持! 现在您可以在 IDE 中连接到远程 Notebook 并进行复制、粘贴、修改和调试,新版本改进了代码审查工作流以及 Quick Documentation(快速文档)中的语法高亮显示。
CLion 2023.1 带来了软件包管理解决方案,将您的调试体验带向全新高度,能够协助 QML 编码,并包含对新 UI 的大量改进。
PhpStorm 2023.1 是一个主要版本,包括新 UI 的更新、3v4l.org 集成、更好的性能、调试器中的数据流分析、对具有多个 composer.json 文件的项目的支持、针对 PHP 泛型的改进等。
WebStorm 2023.1 提供 Astro 支持、Vue 模板表达式的 TypeScript 支持、Tailwind CSS 配置、全 IDE 缩放、对新 UI 和版本控制集成的改进等。
Rider 2023.1 改进了对 C# 的支持,添加了一组检查来优化和加快处理不同类型集合的工作,以及在代码中引入 null 检查的多项可调整方式。 Rider 游戏开发现已升级,引入了对 Unity 的 Data Oriented Tech Stack (DOTS) 和 Unreal Engine 5.2 的支持,包括蓝图文件格式的最新更新和对 Godot 4 的支持。 此外,还有一些针对版本控制工具和使用 Docker 进行的增强,并对新 UI 和整体用户体验带来一系列优化。
.NET 工具和 VS 扩展程序
ReSharper 2023.1 改进了对 C# 的支持,添加了一组检查来优化和加快处理不同类型集合的工作,以及在代码中引入 null 检查的多项可调整方式。
这些更新也整合到了 Rider 2023.1 中,同时还包括对版本控制工具和使用 Docker 的功能的增强、调试器中字符串变量的可视化器,以及一系列 UX/UI 改进。 Rider 游戏开发现已升级,引入了对 Unity 的 Data Oriented Tech Stack (DOTS) 和 Unreal Engine 5.2 的支持,包括蓝图文件格式的最新更新和对 Godot 4 的支持。
ReSharper C++ 2023.1 带来了针对 C++20 和 C++23 功能的更新。 它还在工具提示和 Quick Documentation(快速文档)弹出窗口中为传入调用和宏替换预览引入了 Call tracking(调用跟踪)。
独立版本的 dotTrace 现已登陆 Linux 和 macOS。
C51 单片机 SIM900A 手机给门禁解锁 智能家居 【C 程序代码已开源,更新至 Ver4.0】
为何要实施这个项目?
一般小区楼下,每幢都会有一个门禁系统,
可以使用钥匙打开门禁,
有的可以使用刷卡打开门禁,
有的可以使用密码打开门禁,
但是,长期下来,因为小区人多,锁的钥匙孔会被捅坏,物业修起来也很怠慢
使用密码按键解锁门禁,按键也会失灵
每家都会安装一个【楼宇对讲器】,用来与楼下人对话,或者可以从视频看出,是哪位亲朋,并且可以门禁解锁。
目标:
使用智能家居,嵌入楼宇对讲机,模拟开门按键,完成开门动作。
适用对象:
家里人多,拥有门禁的钥匙不够用的家庭
出入门禁不想带钥匙的人
大冬天,懒得拿冰冷的钥匙开门的人
物业门禁钥匙,密码不好使的人
使用方法:
1,给模块插入一张有来电显示功能的移动 / 联通 SIM 卡,上电初始化,一个短的嘀的一声提示,初始化完成。
2,在任何时候任何地点,手机呼叫 SIM900A GSM 通信模块的号码,门禁解锁。
【小区楼幢 - 门禁外观】钥匙 + 键盘 + 刷卡 + 摄像头
【小区楼幢 - 门禁外观】键盘 + 摄像头 + 刷卡
【小区楼幢 - 门禁外观】 钥匙
室内【楼宇对讲机】外观
室内【楼宇对讲机】内部图
室内【楼宇对讲机】结合单片机
【SIM900A 模块】结合单片机
【单片机串口通信 波特率计算器】
Ver2.0 版本程序
C51 SIM900A 判断来电身份,蜂鸣器响起 远程控制
工程名 : 手机呼叫 SIM900A,门禁解锁
1 先用 USB 转 TTL 模块测试模块好用,发送 AT,波特率到 9600 同步
2 STC12C4052AD 单片机晶振 11.0592MHz,12M 不可以用
版本号:V1.0
手机呼叫 SIM900A 的号码,蜂鸣器亮 500MS;
具体实现看程序,注释我写的非常详细了
/******************************
工程名 :手机呼叫SIM900A,门禁解锁
1 先用USB转TTL模块测试模块好用,发送AT,波特率到9600同步
2 51单片机晶振 11.0592MHz,12M不可以用
手机呼叫SIM900A的号码,LED亮500MS;
*******************************/
#include "string.h"
#include "STC12C2052AD.h"
#define cache_max 200 //串口接收缓存长度
xdata unsigned char uart_cache[cache_max]; // xdata 把变量存在flash中,而不存在RAM中
//code 定义的数据要放在ROM里面,写入后就不能再更改
bdata unsigned char Flag; //定时器标志位 bdata 把变量定义为可拆成8位寻址
sbit Timer_start =Flag^0; //延时计数功能开关
sbit RUNING = P3^7; //SIM900A运行指示灯,1秒闪烁一次
sbit unlock = P1^7; //解锁
unsigned char code *ring="CLIP"; //来电标记
unsigned char code *phone1="1336218****"; //管理员1的手机号
unsigned char code *phone2="1395804****"; //管理员2的手机号
unsigned char code *phone3="1776715****"; //管理员3的手机号
unsigned char Times=0; // 定时器中断次数累加
unsigned char First_Int = 0; // 串口数组字符索引
unsigned char delay=0; //中断定时器,实际数据delay*50次
void SendData(unsigned char dat){ // 发一个8位数据到串口SBUF
ES=0;
SBUF=dat;
while(TI!=1);
TI=0;
ES=1;
}
void SendString(unsigned char *s){ // 发多个8位数据到串口SBUF
while(*s)
SendData(*s++);
}
void SendLR(void) { // 发回车换行
SendString("\r\n");
}
void DELAY_MS (unsigned int a){ // 延时
unsigned int i;
while ( --a != 0 )
for (i=0;i<=600;i++);
}
void Uart1Init(void) { //9600bps@11.0592MHz
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1; //开串口中断
}
void Uart1() interrupt 4{
uart_cache[First_Int] = SBUF; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int > cache_max) //如果缓存满,将缓存指针指向缓存的首地址
First_Int = 0; //数组索引,归位
RI = 0; //清除RI位
}
void Timer0Init(void) { //20毫秒@11.0592MHz
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0;
TMOD |= 0x01; //设置定时器模式,16位定时器
TL0 = 0x00; //设置定时器初值
TH0 = 0xB8; //设置定时器初值
TF0 = 0; //清TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA=1; //开总中断
}
void Timer0_ISR() interrupt 1{ //最高级别中断服务程序
static unsigned char Time_count=0; // 定时器计数器 static全局生命周期
TR0=0; //关定时器
TL0 = 0x00; //重设定时器初值
TH0 = 0xB8; //重设定时器初值
Time_count++;
if(Time_count>=50) {
Time_count = 0;
RUNING =~RUNING; //SIM900A运行指示灯,1秒闪烁一次
}
if(Timer_start) Times++; //如果收到允许定时,开始计时
if(Times > (50*delay)){ //如果Times 到达设定时间
Timer_start = 0;
Times = 0; // 全部变量Times,通知程序 计时时间已到
}
TR0=1; //开定时器
}
void CLR_Buf1(void){
unsigned int k;
for(k=0;k<cache_max;k++) //将缓存内容清零
uart_cache[k] = 0x00;
First_Int = 0; //接收字符串的起始存储位置
}
void Send_Command(unsigned char *b,unsigned char *a,unsigned char wait_time){
unsigned char i;
unsigned char *c;
c = b; //保存字符串地址到c
CLR_Buf1();
i = 0;
while(i == 0) {
if(strstr(uart_cache,a)==NULL) { //查找需要应答的字符
if(Timer_start == 0){
b = c; //将字符串地址给b
for (b; *b!=''\0'';b++)
SendData(*b);
SendLR();
Times = 0;
delay = wait_time;
Timer_start = 1; // 开启定时器,
}
}
else{
i = 1;
Timer_start = 0;
}
}
CLR_Buf1();
}
void Unlock(void) {//执行函数,会有一个持续1秒低电平的动作,然后电平拉高
unlock = 0;
DELAY_MS(200);
unlock = 1;
}
void Wait_CREG(void) { //等待模块注册成功
unsigned char i;
unsigned char k;
i = 0;
CLR_Buf1();
while(i == 0) {
CLR_Buf1();
SendString("AT+CREG?"); //查询模块网络注册状态
SendLR();
DELAY_MS(1000);
for(k=0;k<cache_max;k++) {
if(uart_cache[k] == '':'') {
if((uart_cache[k+4] == ''1'')||(uart_cache[k+4] == ''5'')){ //表明网络注册成功
i = 1;
break;
}
}
}
}
}
void Check_Ring(void) { //检查是否有新信息,并执行信息内容指令
if(strstr(uart_cache,ring)!=NULL) { //若缓存字符串中含有来电标记
DELAY_MS(100); //等待数据全部接收完成
if((strstr(uart_cache,phone1)!=NULL)||(strstr(uart_cache,phone2)!=NULL)||(strstr(uart_cache,phone3)!=NULL))
Unlock(); //如果管理员来电,就解锁
CLR_Buf1(); // 清空SBUF缓存
}
}
void main(void){
Timer0Init(); //初始化定时器0
Uart1Init(); //初始化串口9600
Send_Command("AT","OK",3); //波特率同步
Send_Command("ATE0","OK",3); //取消回显
Send_Command("AT+CLIP=1","OK",3); //开启来电显示
Wait_CREG(); //查询等待模块注册成功
while(1){
Check_Ring();
}
}
编译结果:0 错误,0 警告
Ver3.0 版本程序
/******************************
工程名 :手机呼叫SIM900A,门禁解锁
1 先用USB转TTL模块测试模块好用,发送AT,波特率到9600同步
2 STC12C2052AD单片机,晶振 11.0592MHz,12M不可以用
软件功能:
1,联网成功,一个短的嘀的一声提示
2,手机呼叫SIM900A的号码,一个长的嘀的一声提示,并完成门禁解锁动作
*******************************/
#include "string.h"
#include "STC12C2052AD.h"
#define cache_max 100 //串口接收缓存长度
// xdata 把变量存在flash中,而不存在RAM中
//code 定义的数据要放在ROM里面,写入后就不能再更改
// Timer_start =Flag^0 定时器标志位 bdata 把变量定义为可拆成8位寻址
xdata unsigned char uart_cache[cache_max];
bdata unsigned char Flag;
sbit beep = P1^3; //蜂鸣器
sbit control = P1^4; //解锁控制
sbit power = P1^7; //运行指示灯
unsigned char code *ring="CLIP"; //SIM900A的来电标记
unsigned char code *phone1="1395719····"; //授权手机号1
unsigned char code *phone2="1395804····"; //授权手机号2
unsigned char code *phone3="1358812····"; //授权手机号3
sbit Timer_start =Flag^0; //计时器,功能开关
unsigned char Times=0; // 定时计数器
unsigned char First_Int = 0; // 串口数组字符索引
unsigned char delay=0; //中断定时器,实际延时delay*50次
void SendData(unsigned char dat){ // 发一个英文8位数据到串口SBUF
ES=0;
SBUF=dat;
while(TI!=1);
TI=0;
ES=1;
}
void SendString(unsigned char *s){ // 发英文字符到串口SBUF
while(*s)
SendData(*s++);
}
void SendLR(void) { // 发回车换行
SendString("\r\n");
}
void DELAY_MS (unsigned int a){ // 延时
unsigned int i;
while ( --a != 0 )
for (i=0;i<=600;i++);
}
void Beep_Ring(unsigned int a) {//发出嘀的一声,或者解锁
if(a==1){
beep = control=0;
DELAY_MS(500);
beep = control=1;
}
if(a==2){
beep=0;
DELAY_MS(100);
beep=1;
}
}
void Uart1Init(void) { //9600bps@11.0592MHz
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1; //开串口中断
}
void Timer0Init(void) { //20毫秒@11.0592MHz
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0;
TMOD |= 0x01; //设置定时器模式,16位定时器
TL0 = 0x00; //设置定时器初值
TH0 = 0xB8; //设置定时器初值
TF0 = 0; //清TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA=1; //开总中断
}
void CLR_Buf1(void){
unsigned int k;
for(k=0;k<cache_max;k++) //将缓存内容清零
uart_cache[k] = 0x00;
First_Int = 0; //接收字符串的起始存储位置
}
void Send_Command(unsigned char *command,unsigned char *ack,unsigned char wait_time){
unsigned char *pointer;
pointer = command; //保存字符串command的首地址到c
CLR_Buf1(); //清除串口缓存
while(1) {
if(!strstr(uart_cache,ack)) { //查找需要应答的字符
if(Timer_start == 0){
command = pointer; //将字符串地址给b
for (command; *command!=''\0'';command++)
SendData(*command);
SendLR();
Times = 0;
delay = wait_time;
Timer_start = 1; // 开启定时器
}
}
else{
Timer_start = 0; //关闭定时器
break;
}
}
CLR_Buf1(); //清除串口缓存
}
void Wait_CREG(void) { //等待模块注册成功
unsigned char i,k;
i = 0;
// CLR_Buf1(); 想想本处串口缓存该不该注释
while(i == 0) {
CLR_Buf1();
SendString("AT+CREG?"); //查询模块网络注册状态
SendLR();
DELAY_MS(1000);
for(k=0;k<cache_max;k++) {
if(uart_cache[k] == '':'') {
if((uart_cache[k+4] == ''1'')||(uart_cache[k+4] == ''5'')){//表明网络注册成功
i = 1;
CLR_Buf1();
}
}
}
}
}
void Check_Ring(void) {
if(strstr(uart_cache,ring)!=NULL) { //检测是否有来电标记
DELAY_MS(100); //等待数据全部接收完成
if((strstr(uart_cache,phone1))|| //注释要写得清晰明了
(strstr(uart_cache,phone2))||
(strstr(uart_cache,phone3)))
Beep_Ring(1); //符合权限,就解锁
CLR_Buf1(); // 清空SBUF缓存
}
}
void SIM900aInit(void){
Send_Command("AT","OK",3); //波特率同步
Send_Command("AT+CLIP=1","OK",3); //开启来电显示
Wait_CREG(); //查询等待模块注册成功
Beep_Ring(2); //联网成功提示音
}
//主函数
void main(void){
Timer0Init(); //初始化定时器0
Uart1Init(); //初始化串口9600
SIM900aInit(); //初始化SIM900A模块
while(1){
Check_Ring();
}
}
//4级串口中断函数
void Uart1() interrupt 4{
uart_cache[First_Int] = SBUF; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int > cache_max) //如果缓存满,将缓存指针指向缓存的首地址
First_Int = 0; //数组索引,归位
RI = 0; //清除RI位
}
//1级最高级别,定时器中断函数
void Timer0_ISR() interrupt 1{ //最高级别中断服务程序
static unsigned char Time_count=0; // 定时器计数器 static全局生命周期
TR0=0; //关定时器
TL0 = 0x00; //重设定时器初值
TH0 = 0xB8; //重设定时器初值
Time_count++;
if(Time_count>=50) {
Time_count = 0;
power=~power; //SIM900A运行指示灯,1秒闪烁一次
}
if(Timer_start) Times++; //如果收到允许定时,开始计时
if(Times > (50*delay)){ //如果Times 到达设定时间
Timer_start = 0; // 完成定时,关闭定时功能
Times = 0; // 完成定时,清空定时计数器
}
TR0=1; //开定时器
}
Ver4.0 版本,加入自动挂机,关闭睡眠
/******************************
工程名 :手机呼叫SIM900A,门禁解锁
1 先用USB转TTL模块测试模块好用,发送AT,波特率到9600同步
2 STC12C2052AD单片机,晶振 11.0592MHz,12M不可以用
软件功能:
1,2015.12.10 联网成功,一个短的嘀的一声提示
2,2015.12.17 手机呼叫SIM900A的号码,一个长嘀的一声提示,并完成门禁解锁动作
3,2015.12.22 响铃后,自动挂断回应对方
*******************************/
#include "string.h"
#include "STC12C2052AD.h"
#define cache_max 100 //串口接收缓存长度
// xdata 把变量存在flash中,而不存在RAM中
//code 定义的数据要放在ROM里面,写入后就不能再更改
// Timer_start =Flag^0 定时器标志位 bdata 把变量定义为可拆成8位寻址
xdata unsigned char uart_cache[cache_max];
bdata unsigned char Flag;
sbit beep = P1^3; //蜂鸣器
sbit control = P1^4; //解锁控制
sbit power = P1^7; //运行指示灯
unsigned char code *ring="CLIP"; //SIM900A的来电标记
unsigned char code *phone1="1395719····"; //授权手机号1
unsigned char code *phone2="1395804····"; //授权手机号2
unsigned char code *phone3="1358812····"; //授权手机号3
sbit Timer_start =Flag^0; //计时器,功能开关
unsigned char Times=0; // 定时计数器
unsigned char First_Int = 0; // 串口数组字符“指针”
unsigned char delay=0; //中断定时器,实际延时delay*50次
void SendData(unsigned char dat){ // 发一个英文8位数据到串口SBUF
ES=0;
SBUF=dat;
while(TI!=1);
TI=0;
ES=1;
}
void SendString(unsigned char *s){ // 发英文字符到串口SBUF
while(*s)
SendData(*s++);
}
void SendLR(void) { // 发回车换行
SendString("\r\n");
}
void DELAY_MS (unsigned int a){ // 延时
unsigned int i;
while ( --a != 0 )
for (i=0;i<=600;i++);
}
void Uart1Init(void) { //定时器1,9600bps@11.0592MHz
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1; //开串口中断
}
void Timer0Init(void) { //20毫秒@11.0592MHz
AUXR &= 0x7F; //定时器0时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式,16位定时器,非自动重载模式
TL0 = 0x00; //设置定时器初值
TH0 = 0xB8; //设置定时器初值
TF0 = 0; //清TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA=1; //开总中断
}
void CLR_Buf1(void){
unsigned int k;
for(k=0;k<cache_max;k++) //将缓存内容清零
uart_cache[k] = 0x00;
First_Int = 0; //接收字符串的起始存储位置
}
void Send_Command(unsigned char *command,unsigned char *ack,unsigned char wait_time){
unsigned char *pointer;
pointer = command; //保存字符串command的首地址到c
CLR_Buf1(); //清除串口缓存
while(1) {
if(!strstr(uart_cache,ack)) { //查找需要应答的字符
if(Timer_start == 0){
command = pointer; //将字符串地址给b
for (command; *command!=''\0'';command++)
SendData(*command);
SendLR();
Times = 0;
delay = wait_time;
Timer_start = 1; // 开启定时器
}
}
else{
Timer_start = 0; //关闭定时器
break;
}
}
CLR_Buf1(); //清除串口缓存
}
void Wait_CREG(void) { //等待模块注册成功
unsigned char i,k;
i = 0;
CLR_Buf1(); //想想本处串口缓存该不该注释
while(i == 0) {
CLR_Buf1();
SendString("AT+CREG?"); //查询模块网络注册状态
SendLR();
DELAY_MS(1000);
for(k=0;k<cache_max;k++) {
if(uart_cache[k] == '':'') {
if((uart_cache[k+4] == ''1'')||(uart_cache[k+4] == ''5'')){//表明网络注册成功
i = 1;
CLR_Buf1();
}
}
}
}
}
void Beep_Ring(unsigned int a) { //发出嘀的一声,或者解锁
if(a==1){
beep = control=0;
DELAY_MS(500);
beep = control=1;
Send_Command("ATH","OK",2);
}
if(a==2){
beep=0;
DELAY_MS(100);
beep=1;
}
}
void Check_Ring(void) {
if(strstr(uart_cache,ring)){ //检测是否有来电标记
DELAY_MS(100); //等待数据全部接收完成
if((strstr(uart_cache,phone1))||(strstr(uart_cache,phone2))||(strstr(uart_cache,phone3)))
Beep_Ring(1); //符合权限,就解锁
CLR_Buf1(); // 清空SBUF缓存
}
}
void SIM900aInit(void){
Send_Command("AT","OK",3); //波特率同步
Send_Command("AT+CLIP=1","OK",3); //开启来电显示
Send_Command("AT+CSCLK=0","OK",3); //关闭SIM900A睡眠
Wait_CREG(); //查询等待模块注册成功
Beep_Ring(2); //联网成功提示音
}
//主函数
void main(void){
Timer0Init(); //初始化定时器0
Uart1Init(); //初始化串口9600
SIM900aInit(); //初始化SIM900A模块
while(1){
Check_Ring();
}
}
//4级串口中断函数
void Uart1() interrupt 4{
uart_cache[First_Int] = SBUF; //将接收到的单个字符存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int > cache_max) //如果缓存满,将缓存指针指向缓存的首地址
First_Int = 0; //数组索引,归位
RI = 0; //清除RI位
}
//1级最高级别,定时器中断函数
void Timer0_ISR() interrupt 1{ //最高级别中断服务程序
static unsigned char Time_count=0; // 定时器计数器 static全局生命周期
TR0=0; //关定时器
TL0 = 0x00; //重设定时器初值
TH0 = 0xB8; //重设定时器初值
Time_count++; //每隔20毫秒进入中断,Time_count无条件自加运算
if(Time_count>=50) {
Time_count = 0;
power=~power; //SIM900A运行指示灯,1秒闪烁一次
}
if(Timer_start) Times++; //如果收到允许定时,开始计时
if(Times > (50*delay)){ //如果Times 到达设定时间,50*delay就是秒数
Timer_start = 0; // 定时结束,定时功能标记Timer_start一定为0
Times = 0; // 完成定时,清空计数器
}
TR0=1; //开定时器
}
编译结果:
Rebuild target ''Target 1''
compiling DS18B20.C...
linking...
Program Size: data=46.0 xdata=100 code=1116
creating hex file from "DS18B20"...
"DS18B20" - 0 Error(s), 0 Warning(s).
今天关于WordPress 更新至 5.6.1 - 仍保留版本 5.5.3和wordpress最新版本的介绍到此结束,谢谢您的阅读,有关.NET 框架 Microsoft .NET Framework (更新至.NET Framework4.8)、1.6.1.24 更新至 1.7.7.4 数据库架构错误、2023 年度首发!JetBrains 全线 IDE 更新至 v2023.1、C51 单片机 SIM900A 手机给门禁解锁 智能家居 【C 程序代码已开源,更新至 Ver4.0】等更多相关知识的信息可以在本站进行查询。
本文标签: