📄 newtextdocument.c
字号:
/* switch (counter)
{
case 0:
P3^2=0;
P3^3=1;
P3^4=1;
P3^5=1;
break;
case 1:
P3^2=1;
P3^3=0;
P3^4=1;
P3^5=1;break;
case 3:
P3^2=1;
P3^3=1;
P3^4=0;
P3^5=1;break;
case 4:
P3^2=1;
P3^3=1;
P3^4=1;
P3^5=0;break;
default:
P3^2=1;
P3^3=1;
P3^4=1;
P3^5=1;
}
//判断是否是第一次启动,是则 进行。。。。
// 发送数据时是否要关闭 Serial port---v,和T0 RUN---?--因为 485 是半双工,所以发送就不能接收,
//可是RS232 是全双工,。。。 V,open T0,close Serial port
//添加对 20H 21H的识别会有什么问题?----the end V,no problem
//接受12 个数据时要判断01、02、03、04 ---the second X,
//第四个命令串,是否可以更改 slaver_ADD ,并发送给主机?-------first V
//发送程序的 WR=1; delay(1); WR=0; 是否需要?---看情况再说 V,noneeded
//main主程序的流程还有别的方式 吗??***, vx 暂时没
//应该是主机发别的无效的数据,可以不理会。重新开始接收。
//每次定义一个新工程 要修改,工程变量 /输出文件位置/串口软件 通讯方式/外部选择晶振/。
//变量定义和代码间必须留一行空行
//标明主要函数的说明。
//调试方法,可以显示变量值,等待主程序发回响应,就可以继续执行,相当于断点 ??--sentonedata();
//函数有返回值时,需要在设计函数时加 return。
//接受和发送数据时RD-RE 要置 和清。
//{
//if(point%2==1)
//if receiver_buff==0x01}
//置SM2=0是否和RI=1;有同样效果,主机每发送一串数,立即有反应??
//去掉串口中断的 判断RI 是否有问题??
//引入一个数组 or变量,每次写进一个新Slaver_ADD, 放入此位置,并写入flash
//读主机的地址数据时,从flash调出,测试是否与此变量一样,
//一份 可以接收任意字符的接收程序。有LED显示地址位信息的。
//主要为第一功能。
//***不看 3Q 和4U 是否会有问题???
//不停发送数据时 ,LED会闪,是程序问题 还是 硬件问题??
//接收的数据不在范围内时怎么办??
//怎么突破新加一个 缓冲区,接收数据没变化的问题。
//可以自己做头文件,把分支程序 写到里面
//写入RE52.h的头文件,,是工程里的优先吗 还是程序默认的目录下的?
//---星研是程序默认目录下的
*/
//flash操作等待时间 & Enable ISP功能
#include<reg52.h>
#include<stdio.h>
//#include<isp-1.h>
sfr ISP_DATA = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD = 0xE2;
sfr ISP_TRIG = 0xE2;
sfr ISP_CONTR = 0xE2;
#define ENABLE_ISP 0x80 //<30MHZ
/*
#define ENABLE_ISP 0x81 //
#define ENABLE_ISP 0x82 //
#define ENABLE_ISP 0x83 //<12MHZ
#define ENABLE_ISP 0x84 //
#define ENABLE_ISP 0x85 //
#define ENABLE_ISP 0x86 //
#define ENABLE_ISP 0x87 //<1MHZ
*/
#define DEBUG_DATA 0x05
#define DATA_FLASH_START_ADDRESSH 0x28
#define DATA_FLASH_START_ADDRESSL 0x00
void ISP_DISABLE(void)
{
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
unsigned char byte_read(void)
//读主机的地址数据时,从DATA flash调出,测试是否与此变量一样
//在主程序中执行,初始化时,读入变量 slaver_ADD。
{
ISP_CONTR=ENABLE_ISP;
ISP_CMD=0x01;
ISP_ADDRH=DATA_FLASH_START_ADDRESSH;
ISP_ADDRL=DATA_FLASH_START_ADDRESSL;
EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
// _nop_();
EA=1; //可否放在return之后?//LED显示是否会有问题?//_nop_();不能加?
ISP_DISABLE(); //可否放在return之后?---编译可以通过,实际使用要调.
return(ISP_DATA);
}
void section_erase(void)
//读数据出错时调用,之后编程,然后再读?
//
{
ISP_CONTR=ENABLE_ISP;
ISP_CMD=0x03;
ISP_ADDRH=DATA_FLASH_START_ADDRESSH;
ISP_ADDRL=DATA_FLASH_START_ADDRESSL;
EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
// _nop_();
EA=1;
ISP_DISABLE();
// return(ISP_DATA);
}
void byte_program(unsigned char m)
//获得新的Slaver_ADD 应该写入DATA flash。
//如果相同则不写入,要做判断。
//应该在主程序执行,并更改变量 slaver_ADD。
//是否每次写都erase 一下:否则如何判断读出数据有错?COM_FAIL?
{
section_erase();
ISP_DATA=m;
ISP_CONTR=ENABLE_ISP;
ISP_CMD=0x02;
ISP_ADDRH=DATA_FLASH_START_ADDRESSH;
ISP_ADDRL=DATA_FLASH_START_ADDRESSL;
EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
// _nop_();
EA=1;
ISP_DISABLE();
// return(ISP_DATA);
}
//主程序
/*
main(void)
{
time0_init();
UART_init();
COM_status=0xff;
do
{
if(point==0 && UART_nogetOKdata_flag==0)//串口程序结束时要加UART_nogetOKdata_flag=1
{
sentdata();}
if(point==6 && COM_Status==3)
{
// if (COM_Status==3)
sentdata();//
// else
// {;}
}
else if(point==6 && COM_Status==4)
{
slaver_ADD=new_ADD;
}
else if(point==12 && COM_Status==2)
{
// if(COM_Status==2)
sentdata();
// else
// {;}
}
else
{;}
}while(1);
}
*/
main(void)
{
SCON=0x52;
TMOD=0x20;
TH1=0xf3;
TR1=1;
section_erase();
byte_program(0x05);//ISP 功能测试函数,可放在程序UART_init和time0_init 之后
if(byte_read()==0x05)
// {
printf("hello I am keillll. \n" );
// }
// while(1);
}
//“uncalled segment,ignored for overlay process” 的警告 在使用之前定义的define 后减少一111111个主程序多用一个定义的函数,就少一个
//“missing function prototype --warning ,requires ANSI-style prototype --error” 当一个函数未定义时出现
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -