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

📄 c_code.c

📁 Pressure Sensor Assemble Code
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg51.h>
#include <math.h>
#include <string.h>
#include <intrins.h>
#include <stdio.h>
#include "c_code.h"

#define Graphic        1
#define TXT            0

unsigned char code str_USB[];
unsigned char code str2[];
unsigned char code str3[];
unsigned char code str4[];
unsigned char code str5[];
unsigned char i;

unsigned int ihexs, iflag[3];
unsigned char disp_buffer[5];

extern unsigned int ad_convert();
unsigned char C;

void hextobcd(unsigned int hexs,unsigned char j);
void deoutlier(unsigned int x[4], unsigned int x0[4][2], char Bound);
void calibration(unsigned int x[4]);

void LcmDynWriteData(unsigned char x, unsigned char y, unsigned char CH_No,unsigned int ihex);

unsigned int new_value[4];
unsigned int value[4][2];

unsigned char menu_item;

void main(void)
{ 	
	menu_item = 0;
	do
	{
		for(i = 0;i < 3; i++)						   
			iflag[i] = 0;								 //程序跳转标志
		ACC = 0x01;										 //MOV A, #01h
		Regstr = ACC;									 //MOV 30h, A
		PortA000 = ACC;									 //MOV DPTR, #A000h  MOV @DPTR, A
		FPWR = 0;										 //CLR P1.5
		ACC = Port6000;
		ACC = ACC & 0x80;
		if(ACC != 0x80)									//电源POWER键按下
		{
			ACC = Port6000;
			ACC = ACC & 0x80;
			if(ACC != 0x00)
				iflag[0] = 1;
			else
			{
				FPWR = 1;
				LcmInit();
				LcmClear(0);							//设置屏幕
				LcmWriteCommand(0x9f);
				PutString(0,0,str_Welcome);				//显示欢迎屏
				Delay(10);								//延迟并转入菜单屏
				
				PortA000 = 0x04;
				ACC = Port6000;
				ACC = ACC & 0x01;
				if(ACC != 0x01)							//检测ESC键按下,则转测量Start
				{	
					//菜单共5条:日期、时间、量程、报警上限、报警下限,故0 <= menu_item <= 4
					ACC = Port6000;
					ACC = ACC & 0x10;
					if(ACC == 0x10)
					{
						if(menu_item != 4)
							menu_item ++;					//若按Down键,menu_item ++,但其最大值为4
						else
							menu_item = 4;
					}
					ACC = Port6000;
					ACC = ACC & 0x20;
					if(ACC == 0x30)
					{
						if(menu_item != 0)
							menu_item --;					//若按UP键,menu_item --,但其最小值为0
						else
							menu_item = 0;
					}
					switch(menu_item)						//下面每个设置必须按Enter确认
					{
						case 0:								//日期设置
							break;
						case 1:								//时间设置
							break;
						case 2:								//量程设置
							break;
						case 3:								//上限设置
							break;
						case 4:								//下限设置
							break;
					}
					ACC = Port6000;
					ACC = ACC & 0x02;						
					if(ACC == 0x02)							//校零键按下
					{
					}						
				}
			}
		}
		else
		{
			ACC = Port6000;
			ACC = ACC & 0x40;
			if(ACC != 0x00)							    //交流电插入
			{
				FPWR = 1;
			 	LcmInit();
				LcmClear(0);
				LcmWriteCommand(0x9f);
				PutString(0,0,str_Charge);
				Delay(1);
				while(1)
				{
					AD_A0 = 1;
					AD_A1 = 1;
					
					ad_convert();
		    		hextobcd(ihexs,5);						//电源电压转换
															//显示 
					FCHRG = 1;								//没有写完
				}
				iflag[1] = 1;
			}
			if(FUSB == 1)									 //USB插入
			{
				LcmInit();
		        LcmClear(0);
				LcmWriteCommand(0x9f);
				while(FUSB == 1)
				{
					//USB服务程序

					PortA000 = 0x08;
					ACC = Port6000;
					ACC = ACC & 0x08;
					if(ACC == 0x08)							 //Send键按下
					{
					}
				}
				Delay(1); 
				FPWR = 0; 
				iflag[2] = 1;									//关机
			} 
			if(iflag[1] == 0 || iflag[2] == 0)				 //没有键按下
			{
				iflag[1] = 0;
				iflag[2] = 0;
				FPWR = 1;									//置P1.5 = 1
				LcmInit();
				LcmClear(0);
				LcmWriteCommand(0x9f);
				PutString(0,0,str_Hibernate);
				Delay(0);
			}
		}
	}while(iflag[0]);
		

	//Start 测量程序
	do//测量前必须曾按过Power键
	{																//程序跳转标志
		iflag[0] = 0;
		LcmClear(1);
		LcmWriteCommand(0x9f);
		LcmClear(1);
	
		for(i=0;i<4;i++)
		{
			value[i][0] = 0;										//k-1时刻测量值
			value[i][1] = 0;										//k-2时刻测量值
			new_value[i] = -1;										//当前k时刻测量值
		}  
		
		PortA000 = 0x81;										   //poweron();
		Regstr = 0x81;											   
		ACC = Regstr;
		ACC = ACC & 0x0fE;										   //模拟电路休眠控制位,1休,0工作
		Regstr = ACC;
		PortA000 = ACC;

		while(1)
		{
			AD_A0 = 0;
			AD_A1 = 0;
			new_value[0] = ad_convert();							//模拟输入路1测量
			do
			{
				C = AD_BUSY;
			}while(C == 0);
			Port10F4 = ACC;										   //启动模拟转换上一路,锁存第当前路

			do
			{
				C = AD_BUSY;									   //等待以前路转换
			}while(C == 0);
			Port10F4 = ACC;										   //启动模拟转换第当前路,锁存第当前路

			do
			{
				C = AD_BUSY;
			}while(C == 0);										  	//等待当前路转换结束;
			ACC = Port10FF;										   	//读yiqian转换的低字节;
			new_value[1] = new_value[1] & ACC;						//需要将赋给new_value[1]的低字节
			ACC = Port10FB;										   	//读yiqian转换的高字节
			//做移位,将其赋给new_value[1]的高字节

			AD_A0 = 1;
			new_value[1] = ad_convert();							//模拟输入路2测量
	
			AD_A0 = 0;
			AD_A1 = 1;
			new_value[2] = ad_convert();							//模拟输入路3测量
	
			AD_A0 = 1;
			new_value[3] = ad_convert();							//模拟输入路4测量
	
			Delay(1);
			Delay(1);
			FS = 1;
			Delay(1);
			Delay(1); 	
										 				
			FS = 0;										   //ad_sample();
			ACC = Port6000;
			ACC = ACC & 0x80;
			if(ACC != 0x80)			
			{
				
				ACC = Regstr;							  //poweroff();
				ACC = ACC | 0x01;						  //模拟电路休眠控制位,1休,0工作
				Regstr = ACC;
				PortA000 = ACC;
				ACC = Regstr;
				ACC = ACC & 0x7F;						  //模拟电路电源控制位,1供电,0断电
				Regstr = ACC;
				PortA000 = ACC;

				FPWR = 0;
				iflag[0] = 1;
				break;
			}
			calibration(new_value);
			deoutlier(new_value, value, 10);				//数据处理
			LcmDynWriteData(0,0,0x11,ihexs);				//显示
			DelayKey(2);
			
			PortA000 = 0x08;
			ACC = Port6000;
			ACC = ACC & 0x10;
			if(ACC == 0x10)								   //若SET键按下,可弹出上面的菜单
			{
			}
			ACC = Port6000;
			ACC = ACC & 0x08;
			if(ACC == 0x08)									//若FIND键按下,为查询
			{
			}
			ACC = Port6000;
			ACC = ACC & 0x04;
			if(ACC == 0x04)									//DELETE键按下
			{
			}
			PortA000 = 0x04;
			ACC = Port6000;
			ACC = ACC & 0x04;
			if(ACC == 0x04)									//SAVE键按下
			{
			}
			ACC = Port6000;
			ACC = ACC & 0x08;

⌨️ 快捷键说明

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