stc12c56单片机电子看板c语言程序
STC单片机C语言程序设计 第15章 STC单片机C语言预编译指令

DWORD
PBYTE PWORD XBYTE
用于访问8051内部data和idata存储器中单个的字
用于访问8051外部数据存储器一页内单个的字节 用于访问8051外部数据存储器一页内单个的字 用于访问8051外部数据存储器内单个的字节
XWORD
用于访问8051外部数据存储器内单个的字
-- 包含系统头文件
-- 包含系统头文件
absacc.h头文件
文件包含
该头文件包含了宏定义,允许程序员直接访问8051不同的存储器区 域,如表
宏定义
CBYTE CWORD DBYTE
功能
用于访问8051程序存储器中单个的字节 用于访问8051程序存储器中单个的字 用于访问8051内部data和idata存储器中单个的字节
代码清单15-3 main.c文件
#include "assert.h" #include "reg51.h" int main()
-- 包含系统头文件
{
int a; char b; SCON= 0x52; //初始化串口 TMOD = 0x20; TCON = 0x69; TH1 = 0xF3; assert(sizeof(a)==sizeof(b)); //判断变量a和变量b的类型是否一致 return 1; }
由INCDIR命令指定的路径
文件包含
由C51INC环境变量指定的路径 对于程序员创建的包含文件,可以保存在计算机的任何地方,当指
定了用户头文件时,计算机按下面的顺序寻找文件夹: 当前文件夹。
源文件夹。 由INCDIR命令指定的路径
由C51INC环境变量指定的路径
文件包含
注:包含文件的扩展名通常为.h,用于表示该文件为头文件。 典型地,包含文件只包含变量声明(不是定义)、宏定义和特殊功能寄存器 SFR的定义。 包含文件可以包含变量定义。然而,程序员必须确认,在当前的工程中,一 个偶文件只包含在一个C文件中。否则,在同一个时刻可能定义了多个变量, 这样会导致链接器报告错误。推荐在包含文件中,不要定义变量或者函数。 可以在包含文件开始或者结束一个函数,也可能将函数和变量定义放在包含 文件中,当这些事情是可能的时候时,它们会让人感到混淆,并不是一个很 好的编程习惯。
STC单片机C语言程序设计 第8章 STC单片机C语言编程入门

他的主要工作是改造B语言,使其更成熟。
1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最 终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语
言的名字,这就是C语言。
C语言发展历史
1973年初,C语言的主体完成。Thompson和Ritchie迫不及待 地开始用它完全重写了UNIX。此时,编程的乐趣使他们已经完全忘 记了那个"Space Travel",一门心思地投入到了UNIX和C语言的开 发中。随着UNIX的发展,C语言自身也在不断地完善。直到今天, 各种版本的UNIX内核和周边工具仍然使用C语言作为最主要的开发 语言,其中还有不少继承Thompson和Ritchie之手的代码。 在开发中,他们还考虑把UNIX移植到其他类型的计算机上使用。 C语言强大的移植性在此显现。机器语言和汇编语言都不具有移植 性,为x86开发的程序,不可能在Alpha,、SPARC和ARM等处理 器上运行。而C语言程序则可以运行在任意架构的处理器上,只要 处理器具有对应的C语言编译器和库,然后将C源代码编译、连接 成目标二进制文件之后即可运行该处理器上。
选择C语言的理由Βιβλιοθήκη 从这个表中可以看出来,作为高级语言典型代表的C语言仍然被 广泛地用于编写程序代码,其排名近年来一直稳定在前两名。在大 多数情况下,排名仍然高居榜首。一般来说,广泛地共识为C语言 是程序员学习其它高级语言的基础。目前,在嵌入式系统开发中, C语言仍然作为编写软件代码的主要开发工具,这是因为: 简洁紧凑、灵活方便
个过程包括以下几个步骤。
高级编程语言概念
-- 构建计算模型
要实现人和计算机之间的交流,首先在人脑中必须要明确所要 完成的一个任务,并能勾画出实现这个任务的过程,比如:计算一
STC12系列单片机C语言的延时程序

STC12系列单片机C语言的延时程序本举例所用CPU 为STC12C5412 系列12 倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
共有三条延时函数说明如下:函数调用分两级:一级是小于10US 的延时,二级是大于10US 的延时//====================小于10US 的【用1US 级延时】====================//----------微秒级延时---------for(i=X;i>X;i--) 延时时间=(3+5*X)/12 提示(单位us, X 不能大于255)//================大于10US0;Ms--)for(i=26;i>0;i--);}i=[(延时值-1.75)*12/Ms-15]/4 如想延时60US 则i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i 的值=26,再调用上面的【10US 级延时函数】Delay10us(6); 则就精确延时60US;如果想延时64US 可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--) 共延时64US//============== 对于大于20Ms 的可用中断来实现程序运行比较好===============中断用定时器0, 1Ms 中断:void timer0(void) interrupt 1{ TL0=(0xffff-1000+2)% 0x100;TH0=(0xffff-1000+2)/0x100; //每毫秒执行一次if(DelayMs_1>0) DelayMs_1--;//大于20Ms 延时程序}函数调用void DelayMs(uint a)//延时 a 乘以1(ms)的时间。
{ DelayMs_1=a; while(DelayMs_1);}如果延时50Ms 则函数值为DelayMs(50)tips:感谢大家的阅读,本文由我司收集整编。
STC单片机C语言程序设计 第16章 STC单片机C语言复杂数据结构

结构
--结构变量的定义
结构
在C语言中,提供了三种定义结构变量的方法: 在声明结构的时候定义结构变量 即在定义完结构体,也就是在}符号的后面,紧接着定义结构变量。 【例16-2】第一种声明结构体变量的例子
struct student{ char name[30]; char gender; char age; long int; }stu1,stu2;
结构
联合
在C语言中,提供了联合类型的数据结构。在一个联合的数据结构 中,可以包含多个数据类型。但是,不像结构那样,为结构内的每
个数据元素单独分配存储空间,而在联合内的数据类型是共用存储
空间。这种方法可以分时使用同一个存储空间,因此提高了单片机 片内数据存储空间的使用效率。联合类型变量的定义格式:
union 联合变量的名字
结构
--结构变量内元素的引用
读者可以进入到本书所提供资料的stc_program_example\例子166目录下,在Keil μVision5集成开发环境下打开该设计,并进入调
结构
试器模式,按F5按键。打开UART #1窗口界面,在该界面下按照提
示信息输入结构元素的值,最后打印输入的信息
--结构变量内元素的引用
结构
--结构变量内元素的引用
b.number=12344; return 0; } 注:对于结构变量的数组元素初始化,需要遵循对数组元素初始化的规则。
结构
读者可以进入到本书所提供资料的stc_program_example\例子164目录下,在Keil μVision5集成开发环境下打开该设计,并进入调 试器模式,按F5按键。在Watch #1窗口中,查看结构体变量a和b 元素的值。 动态初始化 动态初始化就是通过标准输入设备对结构变量内的元素进行初始化。
STC单片机C语言程序设计 第2章 数值表示及运算

--十进制整数转换成其他进制数
十进制整数转换成二进制数
将十进制正整数转换成二进制数的方法主要包括:
长除法
正数码制转换
采用除法,除数始终为2,将十进制进行分解,直到商为0结束。
然后,按顺序将最后得到的余数排在最高位,而最先得到的余数排 在最低位。
--十进制整数转换成其他进制数
【例2-1】使用长除法将十进制整数59转成所对应的二进制数 59 ÷ 2 = 29 ... 1
-- 正整数的表示
其计算公式为
正数表示方法
对于一个N位的16进制数,最低位为第0位,最高位为第N-1位。
Y = S������−1 ∙ 16������−1 + S������−2 ∙ 16������−2 + ⋯ + S1 ∙ 161 + S0 其中,i为第i位十六进制数的值,取值范围为0~9,A~F。16i为
数值表示及转换
主 讲:何宾 Email:hebin@
2016.03
数值表示及转换
--常用码制
数字逻辑工作在开关状态下,即二进制状态。为了满足不同的运算 需求,人们又制定了使用八进制、十进制和十六进制表示数字的规
则。其中十进制是日常生活中经常使用到的一种表示数字的方法。
正数码制转换
通过比较法,得到十进制正整数4877所对应的十六进制数为130D
--十进制小数转换成二进制数
将十进制小数转换成二进制数的方法主要包括:
长乘法
将小数乘以2,取其整数部分的结果。然后,再用计算后的小数
正数码制转换
部分依此重复计算,算到小数部分全为 0为止。在读取整数部分
的结果时,最先得到的整数放在小数的最高有效位,而最后得到 的整数放在小数的最低有效位
STC12C56

/////////////////////////////////
sfr DPL = 0x82; //数据指针低字节 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=0000,0000 0 0 0 0 0 0 0 0
#ifndef __STC12C56_H__
#define __STC12C56_H__
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sfr PCON = 0x87; //电源控制寄存器 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=xxfine FOSCD1 0x00 //系统时钟为Fosc
/////////////////////////////////
sfr DPH = 0x83; //数据指针高字节 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
//初始值=0000,0000 0 0 0 0 0 0 0 0
/*------------------------------------------------*/
/* --- 宏晶科技 STCMCU ---------------------------*/
STC单片机C语言程序设计 第12章 STC单片机C语言数组
一维数组的定义和操作
-- 一维数组初始化
出现Watch 1界面。在该界面中,单击Enter expression,然后 输入a;在下一行又出现Enter expression,然后输入b;按照类 似的方法输入c
一维数组的定义和操作
-- 一维数组初始化
分别单击a、b和c前面的+号,展开数组。可以看到各个数组的数 据元素的值。此外,在该图中可以看到下面的信息: 1a 右侧给出 D:0x22 信息,表示数组存放在单片机内部数据区起 始地址为0x22的区域; 2b 右侧给出 D:0x39 信息,表示数组存放在单片机内部数据区起 始地址为0x39的区域; 3c 右侧给出 D:0x3D 信息,表示数组存放在单片机内部数据区起 始地址为0x3D的区域。
STC单片机C语言数组
主 讲:何宾 Email:hebin@
2016.03
一维数组的定义和操作
--一维数组的定义
一维数组的定义格式为:
类型说明符 数组名[常量表达式];
其中,类型说明符是任意一种基本数据类型或者构造数据类型。数 组名是用户定义的数组标识符。[]内的常量表达式表示数据元素的 个数,也称为数组的长度。比如: int a[10]
一维数组的定义和操作
-- 一维数组初始化
TMOD = 0x20; TCON = 0x69; TH1 = 0xF3;
printf("please input data of a[8]\n"); //打印提示输入a[8]数组数据元素 for(i=0;i<8;i++) //循环语句 scanf("%d,",&a[i]); //通过索引号和scanf语句,得到每个数据 printf("\nplease input string of str[40]\n"); //打印输入字符数组数据信息 gets(str,40); //调用gets函数,输入字符数组的值
STC单片机C语言程序设计STC单片机C语言编程入门
STC单片机C语言程序设计STC单片机C语言编程入门
1.了解STC单片机的内部结构和外部接口:STC单片机的内部结构包
括CPU、存储器、I/O接口等,需要了解各部分的功能和连接方式。
此外,还需要熟悉STC单片机的外部接口,包括输入/输出端口、串口、定时器等。
2.学习C语言的基础知识:C语言是一种结构化的高级编程语言,具
有简洁、灵活、高效的特点。
初学者可以通过学习C语言的基本语法,如
数据类型、变量、运算符、条件语句、循环语句等,来掌握C语言的编程
技巧。
4.学习STC单片机的编程技巧:在实际的STC单片机编程中,需要掌
握一些常用的编程技巧。
例如,如何读写内部寄存器、如何使用定时器、
如何进行中断处理等。
这些技巧的掌握可以提高程序的效率和稳定性。
5.开发简单的应用程序:通过学习STC单片机的C语言编程,可以编
写一些简单的应用程序,如LED灯控制、蜂鸣器控制、数码管显示等。
这
些程序的编写可以帮助初学者熟悉STC单片机的编程流程和操作步骤。
总之,STC单片机的C语言编程是嵌入式开发中的重要环节,通过学
习和实践,可以掌握STC单片机的编程技巧,开发出各种应用程序。
初学
者可以通过学习相关教材、参加培训班等方式入门,逐步提高自己的编程
水平。
STC12C系列单片机的各种程序集合
case 3:
P1M0=0x08;
P1M1=0x10;
ADC_CONTR&amt;=0xf8;
ADC_CONTR|=0x03;
#define uchar unsigned char
#define uint unsigned int
//--------------------------------------------------------------------
/*void set_timer0_1T()//设置T0为1T模式
ISP_TRIG=0xb9;
}
//--------------------------------------------------------------------
void EEPROM_ERASE(uint addr)//EEPROM扇区擦除
{
{
uchar temp;
uint data_temp;
data_temp=0;
ADC_DATA=0;
ADC_LOW2=0;
ADC_CONTR|=0x08;
re: temp=0x10;
//模块:STC12C5412AD_Driver.C
//功能:单片机增强功能驱动模块
//晶振:24.000MHz
//芯片: STC12C5412AD
//版本:V1.0.0
//设计:魏广寅
//日期:2007.4.10
#include "STC12C5412AD.h"
break;
case 5:
P1M0=0x20;
P1M1=0x00;
STC单片机C语言程序设计STC单片机C语言编程入门
STC单片机C语言程序设计STC单片机C语言编程入门STC单片机是一种非常常见的单片机型号,广泛应用于各种电子设备中。
学习STC单片机的C语言编程能够帮助我们更好地理解和掌握单片机的工作原理,从而能够进行各种功能的实现。
以下是STC单片机C语言程序设计入门的一些基本内容。
1.环境搭建2.了解单片机的IO口和寄存器在学习C语言编程之前,我们需要了解STC单片机的IO口以及寄存器的概念。
IO口是单片机与外部设备进行数据交互的接口,而寄存器则是用来存储和控制单片机各个功能模块的寄存器。
了解IO口和寄存器的作用和使用方法,是进行C语言编程的基础。
3.学习C语言编程基础知识在进行STC单片机的C语言编程之前,我们还需要学习C语言的基础知识,包括数据类型、运算符、控制语句、数组、函数等。
学好C语言的基础知识,对于后续的单片机编程非常重要。
4.学习STC单片机常用库函数5.学习编写简单的实例程序通过编写简单的实例程序,例如LED的闪烁、按键的检测等,可以帮助我们更好地理解和掌握C语言在STC单片机上的应用。
通过不断进行实践,逐步提高自己的编程能力。
6.学习调试和优化程序在编写程序的过程中,难免会遇到一些错误和问题。
学习调试程序的方法和技巧,可以帮助我们快速解决问题。
同时,还需要学习优化程序的方法,如减少内存占用、提高程序执行效率等,从而使程序更加稳定和高效。
总结起来,STC单片机C语言程序设计入门需要掌握以下几个方面的知识:搭建开发环境、了解单片机的IO口和寄存器、学习C语言编程基础知识、学习STC单片机常用库函数、学习编写实例程序、学习调试和优化程序。
通过不断学习和实践,我们可以逐步掌握STC单片机的C语言编程,实现各种有趣的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、看板内容:1、看板显示元素1、计划产量和实际产量2、节拍的自动计算3、断电自动保存节拍数和实际产量2、遥控器整个遥控器共有21个按键,本产品用到的按键是数字0-9,功能键 F1、F2、F3、F4、ENTER(确定用)、CANCEL(取消)。
二、看板实现的功能1、遥控修改计划产量时钟节拍;2、遥控清除实际产量;三、看板操作方式1、遥控修改时钟节拍按下F1键光标会在时的第一位闪烁,按下F3和F4可以使光标左移和右移。
确定要修改的位置后按数字键修改其内容。
修改后会按照刚输入的节拍时间自动累加。
2、遥控清除实际产量按下F2键清除。
程序/******************************************************************** Function: 计划产量的节拍计算Creat_By: yu Time:2012、04、24Discrit: 遥控输入节拍的时间值更具输入的节拍时间累计断电保存时间节拍。
节拍值超出范围报警9999Ver1.1********************************************************************/ #include <STC12C5620AD.h>#include "intrins.h"#include "define.h"#include "function.h"#include "variable.h"#include <math.h> //Keil library#include <stdio.h> //Keil library#include <stdlib.h>bit b_work_pause=false; //工作暂停指示:=1暂停中,=0 工作中bit b_work_rest=false;bit b_add_number;unsigned long second_rest_total=0; //休息的总秒数unsigned long second_pause_total=0; //暂停的总秒数unsigned long second_start_pause=0; //暂停开始的时间extern bit b_tick_flag,b_second_event,b_minute_event,b_tick_flash;extern bit b_spi;extern bit b_key_input,b_key_timer,b_dig_test;extern uchar xdata key_wait_second;extern uchar xdata rec_data;extern uchar num_byte;idata uchar displayarray[32];extern uchar idata MENULEVEL;extern uchar distemp_plane[4];//计划量的暂存idata uchar monitor_counter=0x00;idata uchar work_days_count;idata uchar now_days;/*==============================*/void Cpu_Init(void);void Cpu_re_set(void);void read_ID(void);void SendCharCom(unsigned char);void ret_error(unsigned char);void answer_ID(void);void display(void);void cpudata_poweroninit();uchar xdata chk_sum,chk_sum_IPB; //数据包的校验码bit b_ready_ID=0;bit b_ready_PC=0;extern bit b_dig_test;extern bit b_data_menu;extern bit b_modify_time; //修改时间extern bit b_time_table; //修改时间表extern bit b_input_plan; //开始使用,将输入目标值extern bit b_start_calcute; //开始计算显示数据extern unsigned int act_num;//光电计算累计值extern uchar display_buffyu[5];//数据分离后的数据存储uchar display_buffyu_two[10];xdata struct SHFSD_SECOND{uchar time[8]; //save to sector0;uchar plan[4]; //save to sector1;uchar now[4]; //save to sector2;uchar dachenlv[4]; //save to sector3;}SHFSDKB;uchar tick_count=0x00;//uchar xdata ps_temp[50],ps_count=0;uchar idata times=0;uchar idata keycode=0,keycode0=0,keycode1=0; //ps2_key用于存放接收到的键码bit BF=0; //标识是否有字符被收到extern uchar *ReadPCF8563(void);extern void ModifyPCF8563(uchar *Buf,uchar Count);uchar pcf8563_date[14];unsigned int Time_His=0;//记录节拍历史时间unsigned int Time_Now=0;//记录节拍当前时间unsigned int Time_Jiepa_Value=0;//记录节拍值unsigned int TimeOUT_Jiepa_Value=0;//时钟值超时保存当前值bit Change_Jiepa_Value_Flag=0;//修改时钟节拍标志bit b_Fick_led=0;//led超出范围闪烁记录void SendCharCom(unsigned char ch){ES=0;EN485=1;SBUF=ch;while(0==TI);WDT_CONTR = 0x3C;TI=0;EN485=0;Delayms(1);ES=1;}void SendStringCom(unsigned char *str,unsigned int strlen){xdata unsigned int k=0;do{SendCharCom(*(str+k));k++;}while(k<strlen);}void Serial_Init(void){//////串口初始化SCON=0x50;///SCON: serail mode 1, 8-bit UART, enable ucvr//TMOD|=0x21;//TMOD: timer 1, mode 2, 8-bit reload,timer 0 is 16 bit counterPCON =0x00;//SMOD=0;//如果SMOD=0即PCON=0x80,则此时Baud:4800 fosc=11.0592MHzTH1=0xfd;//Baud:2400 fosc=11.0592MHz// EA=1; 下一句已经包含IE|=0x90,EA为IE中一位//IE|=0x90;//Enable Serial InterruptTR1=1;// timer 1 run //TR1是TCON中的一位ES=1;ET1=0;PS=1;IT0=1; //边沿触发EX0=1; //开INT0中断PX0=1;#if 0SCON=0x50;///SCON: serail mode 1, 8-bit UART, enable ucvrTMOD|=0x21;//TMOD: timer 1, mode 2, 8-bit reloadPCON|=0x00;//SMOD=0;//如果SMOD=0即PCON=0x80,则此时Baud:4800 fosc=11.0592MHzTH1=0xfd;//Baud:2400 fosc=11.0592MHz// EA=1; 下一句已经包含IE|=0x90,EA为IE中一位IE|=0x90;//Enable Serial InterruptTR1=1;// timer 1 run //TR1是TCON中的一位//TI=1;#endif}void status_init(void){// uchar i;//实时目标值=0//for(i=0;i<4;i++)// PHSSKB.shishi[i]= Byteread(SECTOR5+i);}/************************************************************************* Function: 修改时间数据Description:pcf8563 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年***************************************************************************/ void Modify_Time(){uchar i,temp[6];for(i=0;i<6;i++)temp[i]=0;ModifyPCF8563(temp,6); //清除时钟数据}/************************************************************************* Function: 读出时间数据Description:pcf8563 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年***************************************************************************/void Read_Time_Data(){xdata uchar i,*p;uchar temp[8];p = ReadPCF8563();for(i=0;i<7;i++)temp[i] = *p++;pcf8563_date[12] =temp[SEC]&0x0f;pcf8563_date[11] =(temp[SEC]>>4)&0x0f;pcf8563_date[10] =temp[MIN]&0x0f;pcf8563_date[9] =(temp[MIN]>>4)&0x0f;pcf8563_date[8] =temp[HOUR]&0x0f;pcf8563_date[7] =(temp[HOUR]>>4)&0x0f;pcf8563_date[6] =temp[DAY]&0x07;pcf8563_date[5] =temp[DATE]&0x0f;pcf8563_date[4] =(temp[DA TE]>>4)&0x0f;pcf8563_date[3] =temp[MONTH]&0x0f;pcf8563_date[2] =(temp[MONTH]>>4)&0x0f;pcf8563_date[1] =temp[YEAR]&0x0f;pcf8563_date[0] =(temp[YEAR]>>4)&0x0f; //没有显示20年}void main(void){//Cpu_Init(); //输出端口的初始化及相关变量的初始化Time_Init();IR_init();Modify_Time();//EEPROMinit();Serial_Init();EA=1;status_init();cpudata_poweroninit() ;while(1){#if 1WDT_CONTR = 0x3C;TimerService();EN485=0;key_scan();// SwitchInput();if((b_tick_flash == true)&&(MENULEVEL!=0x00)) //如果有红外按键输入激活菜单{b_tick_flash=false;Display_flash();}if(b_second_event==true){b_second_event=false;LED=~LED;LEDSECOND=~LEDSECOND;b_Fick_led=~b_Fick_led;if(MENULEVEL==0x00){display();}}if(b_minute_event==true){b_minute_event=false;}#endif}}/*======================================*//*==== 主要是对一些输出端口的初始化=====*//*======================================*/void Cpu_Init(void){/*先对输出端口的初始化*/P3M0 = 0x85; //(10000101)P3M1 = 0x3a; //(00111010)P2M0 = 0x00; //准双向口P2M1 = 0x01; //准双向口P2^0==testP1M0 = 0x00; //全部作为输入口P1M1 = 0x00;/*初始化端口*/P3 = 0xff;P2 = 0xff;P1 = 0xff;P0 = 0xff;/* 对系统变量的初始化,清楚中断标志*//*对串口发送中断清0*//*初始化看门狗*/WDT_CONTR = 0x3C;/*其它的*/PCON = 0x00;}/*====================================================*//*=== 以下函数为对CPU端口的重新设置,以防干扰损坏===*/void Cpu_re_set(void){TMOD = 0x21 ; //定时器0模式1,定时器1模式2TH1 = BPS9600; //TH1的值永远是1200BPS的值/* 以下为对SCON寄存器的重新设置*/// SM0 = 0;// SM1 = 1;REN = 0;ES = 0;EA = 1;}void cpudata_poweroninit(){uchar i;xdata uchar temp[6];for(i=0;i<4;i++)distemp_plane[i]= Byteread(SECTOR1+i);//上电初始化读取eeprom中的计划量Time_Jiepa_Value=distemp_plane[0]*1000+distemp_plane[1]*100+distemp_plane[2]*10+distem p_plane[3]*1;//计算出节拍值Read_Time_Data(); //读当前时间for(i=0;i<6;i++)temp[i]=pcf8563_date[i+7];Time_His=(temp[0]*10+temp[1])*3600+(temp[2]*10+temp[3])*60+(temp[4]*10+temp[5]);//计算时间}void readSHFSD(void) //从EEPROM中读出保存的数据{xdata uchar i;xdata uchar temp[6];unsigned int JiePa_Value=0;WDT_CONTR = 0x3C;if(Change_Jiepa_Value_Flag==1){Change_Jiepa_Value_Flag=0; //修改时间节拍标志复位TimeOUT_Jiepa_Value=0; //修改时间节拍时,让时钟值超时保存当前值清零Modify_Time(); //修改时间Time_Jiepa_Value=distemp_plane[0]*1000+distemp_plane[1]*100+distemp_plane[2]*10+di stemp_plane[3]*1;//计算出修改的节拍值Read_Time_Data(); //读当前时间for(i=0;i<6;i++)temp[i]=pcf8563_date[i+7];Time_His=(temp[0]*10+temp[1])*3600+(temp[2]*10+temp[3])*60+(temp[4]*10+temp[5]);//计算时间}else{Read_Time_Data();for(i=0;i<6;i++)temp[i]=pcf8563_date[i+7];Time_Now=(temp[0]*10+temp[1])*3600+(temp[2]*10+temp[3])*60+(temp[4]*10+temp[5]);//计算时间if(Time_Jiepa_Value!=0){JiePa_Value=((Time_Now-Time_His)/Time_Jiepa_Value)+TimeOUT_Jiepa_V alue;}else JiePa_Value=0;if(Time_Now>65532) //当前时间记录值大于一个int型数据的保存范围或者防止时钟到了24:59:59后回到0而丢失数据{Modify_Time();Time_His=0;TimeOUT_Jiepa_Value=JiePa_Value; //时钟值超时保存当前值}distemp_plane[0]=JiePa_Value/100%100/10;distemp_plane[1]=JiePa_Value/100%100%10;distemp_plane[2]=JiePa_Value%100/10;distemp_plane[3]=JiePa_Value%100%10;if(JiePa_Value>=9999) //数值超出范围报警。