⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csy.c

📁 本程序能实现温度的实时采集与显示
💻 C
📖 第 1 页 / 共 3 页
字号:
//深圳瑞特RT12864带M系列(控制器ST7920A),单片机:89S52,晶振:12M,
//并行连接方式,P2.7-RS,P2.1-RW,P2.2-E
//设计:TIMEN HUANG
#include<reg1210.h>
#include <intrins.h>
#include<stdio.h>
#include<stdlib.h> 
#include<math.h> 
#include "rom1210.h"  	//读写flash用
#define PAGE_SIZE 0x80  //读写flash用
extern long bipolar(void);//A/D转换用
#define LSB 298.0232e-9 //A/D转换用
//#include<syslib.h>
extern void autobaud(void);
sbit RS=P2^7;//串口时为CS
sbit RW=P2^1; //串口为SID
sbit E=P2^2;  //串口为时钟SCLK
//D0---D7=P1
sbit up=P2^3;
sbit down=P2^4;
sbit enter=P2^5;
sbit retu=P2^6;

sbit  TMDAT=P2^0;	//温度数据引脚

/*sbit start=P2^7;
sbit run=P2^6;
sbit display=P3^3;
sbit close=P3^1;
*/

#define BF    0x80 //用于检测LCM状态字中的Busy标识
typedef unsigned int Uint;
typedef unsigned char Uchar;
//读写flash变量
char xdata *pFlashPage;
unsigned int xdata buffer[PAGE_SIZE];
//上为读写flash变量


//汉字,直接可以写入字形
//第一屏
 

 float ph;
 char sph[6];
 int b;//行号
 int s;//屏号


//xiao=modf(ph,*iptr1);
//zheng=floor(ph);
unsigned char code chinese1[] = {"pH  值"};
const Uchar lengthCF1=3;
unsigned char code chinese2[] = {"溶解氧"};
const Uchar lengthCF2=3;
unsigned char code chinese3[] = {"氟离子"};
const Uchar lengthCF3=3;
unsigned char code chinese4[] = {"温度值"};
const Uchar lengthCF4=3;
//pH第二屏显示内容
unsigned char code chinese5[] = {"不校验"};
const Uchar lengthCF5=3;
unsigned char code chinese6[] = {"酸性校验"};
const Uchar lengthCF6=4;
unsigned char code chinese7[] = {"碱性校验"};
const Uchar lengthCF7=4;
unsigned char code chinese8[] = {"返回上级菜单"};
const Uchar lengthCF8=6;


//DO第二屏显示内容,氟离子第二屏内容和DO相同
//unsigned char code chinese5[] = {"不校验"};
//const Uchar lengthCF5=3;
unsigned char code chinese9[] = {"校验"};
const Uchar lengthCF9=2;
//unsigned char code chinese7[] = {"碱性校验"};
//const Uchar lengthCF7=4;
//unsigned char code chinese8[] = {"返回上级菜单"};
//const Uchar lengthCF8=6;


//T第二屏显示内容
//unsigned char code chinese5[] = {"不校验"};
//const Uchar lengthCF5=3;
unsigned char code chinese10[] = {"开始温度测量"};
const Uchar lengthCF10=6;
unsigned char code chinese11[] = {"℃"};
const Uchar lengthCF11=1;
//unsigned char code chinese7[] = {"碱性校验"};
//const Uchar lengthCF7=4;
//unsigned char code chinese8[] = {"返回上级菜单"};
//const Uchar lengthCF8=6;


const Uchar delay=250;  //延时时间常数

const Uchar delay1=1;  //延时时间常数
static void Wait1ms1(void)//延迟1 ms
{
  Uchar cnt=0;
  while (cnt<delay1) cnt++;
}

static void Wait1ms(void)//延迟1 ms
{
  Uchar cnt=0;
  while (cnt<delay) cnt++;
}
//延迟n ms 
void WaitNms(int n)
{
    Uchar i;
    for(i=1;i<=n;i++)
   	Wait1ms();
	Wait1ms();
	Wait1ms();
	Wait1ms();
}



//**************************************************************************//
//以下是并口时才开的
//读忙标志,
void RDBF(void)
{
    
	Uchar temp; 
	RS=0;	// RS=0
	RW=1;	// RW=1
    WaitNms(3);
	while(1)
	{
	    P1=0xFF;      //数据线为输入

    	E=1;
        
	WaitNms(3);
	temp=P1;
//	E=1;
//	E=1;
Wait1ms1();
//    WaitNms(3);

	E=0;	// E=0

	//printf("调用完判忙函数\r\n");
if ((temp&0x80)==0) break;
// break;}	
}
}
//写数据到指令寄存器

void WRCommand(Uchar comm)
{
	//printf("调用WRcommd函数\r\n");
   RDBF();
	//printf("调用WRcommd函数\r\n");
	RW=0;
    E=1;
WaitNms(3);
	P1=comm;
	Wait1ms1();
	E=0;
	//printf("调用完WRcommd函数\r\n");
}
//写数据到数据寄存器
void WRData(Uchar TEMP)
{
	RDBF();
	RS=1;
	RW=0;
E=1; 
WaitNms(3);


	P1=TEMP;
Wait1ms1();


	E=0;

}



//初始化LCD-8位接口
void LCDInit(void)
{  //	PSB=0; //串口
    //PSB=1;//并口时选这个,上一行取消
    //REST=1;
    //REST=0;
   // REST=1;

  	WRCommand(0x30);	//基本指令集,8位并行
	
Wait1ms();
	WRCommand(0x06);	//启始点设定:光标右移
Wait1ms();

	WRCommand(0x01);	//清除显示DDRAM
Wait1ms();
	WRCommand(0x0D);	//显示状态开关:整体显示开,光标显示关,光标显示反白开
                         
Wait1ms();
	WRCommand(0x02);	//地址归零	

Wait1ms();
}

//显示数组字符串(显示半宽字型16*8点阵)
void ShowQQChar(Uchar addr,Uchar *english,Uchar count)
{	
	Uchar i;
	WRCommand(addr);	//设定DDRAM地址
	for(i=0;i<count;)
	{	
	    WRData(english[i*2]);
Wait1ms();
        WRData(english[i*2+1]);
Wait1ms();
		i++;
    }
}




//读flash存储器子程序
//page为页数取值范围0-7,byte_num为字节数,取值范围为0-127
int flash_read(int page,int byte_num)
{
		unsigned int read_add;
		read_add=0x400+0x80*page+byte_num;    //实际地址

		pFlashPage=(char xdata*)read_add;
		buffer[0]=*pFlashPage;
		if(buffer[0]>128)
			buffer[0]+=256;
		printf("buffer[0]=%d\n",buffer[0]);
		return buffer[0];
}
//写flash存储器子程序
//page为页数取值范围0-7,byte_num为字节数,取值范围为0-127,write_data为要写入的数据
void flash_write(int page,int byte_num,int write_data)
{
		unsigned int m,lead_add;
		lead_add=0x400+0x80*page;				//页首地址

		pFlashPage=(char xdata*)lead_add;
		for(m=0;m<128;m++)
			buffer[m]=*pFlashPage++;

		page_erase(lead_add,0x0ff,DATA_FLASH);

		buffer[byte_num]=write_data;
		for(m=0;m<128;m++)
			write_flash_byte(lead_add+m,buffer[m],DATA_FLASH);

}


//温度显示开始
/*----------------------------------------------------
*   整型转换成字符型子程序
*----------------------------------------------------*/
unsigned  inttochar(unsigned  int int1)
 {
 unsigned char ch1;
 switch(int1)
    {
    case(0):ch1='0';break;
    case(1):ch1='1';break;
    case(2):ch1='2';break;
    case(3):ch1='3';break;
    case(4):ch1='4';break;
    case(5):ch1='5';break;
    case(6):ch1='6';break;
    case(7):ch1='7';break;
    case(8):ch1='8';break;
    case(9):ch1='9';break;
    default:break;
    }
    return(ch1);
 }
/*----------------------------------------------------
*   整型转换成浮点型子程序
*----------------------------------------------------*/
float  inttofloat(unsigned  int int1)
 {
 float ch1;
 switch(int1)
    {
    case(0):ch1=0;break;
    case(1):ch1=1;break;
    case(2):ch1=2;break;
    case(3):ch1=3;break;
    case(4):ch1=4;break;
    case(5):ch1=5;break;
    case(6):ch1=6;break;
    case(7):ch1=7;break;
    case(8):ch1=8;break;
    case(9):ch1=9;break;
    default:break;
    }
    return(ch1);
 } 
/*----------------------------------------------------
*   delay N count  c里的一个while语句相当于汇编里的一个DJNZ语句,即两个机器周期
*----------------------------------------------------*/
void Delay_Count (unsigned char Count )	//延时时间为:(Count*2+5)*0.362  us
{
    while(--Count);  
}


/*----------------------------------------------------
*   HEX->BCD查表程序,小数部分
*----------------------------------------------------*/
unsigned char hextobcd1(unsigned char tab)
{
unsigned int tab1;
	switch(tab)
	{
		case(0x00):	tab1=0x000; break;
		case(0x01): tab1=0x001; break;
		case(0x02): tab1=0x001; break;
		case(0x03): tab1=0x002; break;
		case(0x04): tab1=0x003; break;
		case(0x05): tab1=0x003; break;
		case(0x06): tab1=0x004; break;
		case(0x07): tab1=0x004; break;
		case(0x08): tab1=0x005; break;
		case(0x09): tab1=0x006; break;
		case(0x0A): tab1=0x006; break;
		case(0x0B): tab1=0x007; break;
		case(0x0C): tab1=0x008; break;
		case(0x0D): tab1=0x008; break;
		case(0x0E): tab1=0x009; break;
		case(0x0F): tab1=0x009; break;

		default: tab1=0x00;break;
	}
	return(tab1);
}

/*----------------------------------------------------
*   start Reset Pulse
----------------------------------------------------*/
void tmreset(void)
{
    TMDAT=0;
   Delay_Count(255);
   Delay_Count(255);
   Delay_Count(255);
   Delay_Count(255);
    TMDAT=1;
	Delay_Count(70);
	while(TMDAT);
//	printf("已调用完判忙函数3\r\n");
	while(~TMDAT);
//	printf("已调用完判忙函数2\r\n");
    Delay_Count(255);

}


/*----------------------------------------------------
*   start Reset Pulse
----------------------------------------------------/
void  tmreset()
{

//	P0=0xfe;

//	FLAG1=0;
    TMDAT=1;
    Delay_Count(1);		//2.5us
    TMDAT=0;
    Delay_Count(250);	//505us
    Delay_Count(250);	//505us
    Delay_Count(250);	//505us
    TMDAT=1;
    Delay_Count(28);	//61us
    Delay_Count(28);	//61us
    Delay_Count(28);	//61us
    while(TMDAT);

//	printf("初始化成功\n");
 while(~TMDAT);
 //printf("初始化成功1\n");
			Delay_Count(110);	//225us
			Delay_Count(110);	//225us
			Delay_Count(110);	//225us
		
}

/*----------------------------------------------------
*   Read a bit from 1820
*----------------------------------------------------*/
bit tmrbit(void)
{
 int i=0;
    bit dat;
    TMDAT=0;
	_nop_();
    _nop_();
    _nop_();

	_nop_();
    _nop_();
    _nop_();

	_nop_();
    _nop_();
    _nop_();

	_nop_();
    _nop_();
    _nop_();
    TMDAT=1;
    _nop_();

    _nop_();

    _nop_();

    _nop_();
    dat = TMDAT;
    Delay_Count(30);

    Delay_Count(30);

    Delay_Count(30);

    Delay_Count(30);
    TMDAT=1;
    return dat;
}
/*----------------------------------------------------
*   Read a byte from 1820
*----------------------------------------------------*/
unsigned char tmrbyte()
{
unsigned char i,j,dat=0;
    for(i=1;i<=8;i++)
    {
        j=tmrbit();
        dat=(j<<7)|(dat>>1);
    }
    return dat;
}
/*----------------------------------------------------
*   Write a byte from 1820
*----------------------------------------------------*/
void tmwbyte(unsigned char dat)
{
 unsigned char i;
 for(i=0;i<8;i++)
 {
 TMDAT=0;
_nop_();
_nop_();
_nop_();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -