
TRCT5000漫反射实验



TCRT5000是一种红外线传感器模块,也被称为寻迹模块。它由一个红外线发射器和一个红外线接收器组成。发射器发射出红外线信号,接收器接收到被反射的红外线信号。通过检测接收器接收到的红外线信号强度变化,可以判断是否有物体遮挡在传感器前方,从而实现寻迹功能。
STC单片机AD转换寄存器定义



中断方式例程
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#include "reg51.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BAUD 115200
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define URMD 0 //0:使用定时器2作为波特率发生器
//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位
sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull
sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr AUXR = 0x8e; //辅助寄存器
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
BYTE ch = 0; //ADC通道号
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
InitUart(); //初始化串口
InitADC(); //初始化ADC
IE = 0xa0; //使能ADC中断
//开始AD转换
while (1);
}
/*----------------------------
ADC中断服务程序
----------------------------*/
void adc_isr() interrupt 5
{
ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志
SendData(ch); //显示通道号
SendData(ADC_RES); //读取高8位结果并发送到串口
// SendData(ADC_LOW2); //显示低2位结果
if (++ch > 7) ch = 0; //切换到下一个通道
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0xff; //设置P1口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC上电并延时
}
/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
SCON = 0x5a; //设置串口为8位可变波特率
#if URMD == 0
T2L = (65536 - (FOSC/4/BAUD));
T2H = (65536 - (FOSC/4/BAUD)) >> 8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
#elif URMD == 1
AUXR = 0x40; //定时器1为1T模式
TMOD = 0x00; //定时器1为模式0(16位自动重载)
TL1 = (65536 - (FOSC/4/BAUD));
TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
TR1 = 1; //定时器1开始启动
#else
TMOD = 0x20; //设置定时器1为8位自动重装载模式
AUXR = 0x40; //定时器1为1T模式
TH1 = TL1 = (256 - (FOSC/32/BAUD));
TR1 = 1;
#endif
}
/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
while (!TI); //等待前一个数据发送完成
TI = 0; //清除发送标志
SBUF = dat; //发送当前数据
}
/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
查询方式例程
#include "reg51.h"
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 115200
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define URMD 0 //0:使用定时器2作为波特率发生器
//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位
sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull
sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr AUXR = 0x8e; //辅助寄存器
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC高8位结果
sfr ADC_LOW2 = 0xBE; //ADC低2位结果
sfr P1ASF = 0x9D; //P1口第2功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
void InitUart();
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
InitUart(); //初始化串口
InitADC(); //初始化ADC
while (1)
{
ShowResult(0); //显示通道0
ShowResult(1); //显示通道1
ShowResult(2); //显示通道2
ShowResult(3); //显示通道3
ShowResult(4); //显示通道4
ShowResult(5); //显示通道5
ShowResult(6); //显示通道6
ShowResult(7); //显示通道7
}
}
/*----------------------------
发送ADC结果到PC
----------------------------*/
void ShowResult(BYTE ch)
{
SendData(ch); //显示通道号
SendData(GetADCResult(ch)); //显示ADC高8位结果
// SendData(ADC_LOW2); //显示低2位结果
}
/*----------------------------
读取ADC结果
----------------------------*/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
nop(); //等待4个NOP
nop();
nop();
nop();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
return ADC_RES; //返回ADC结果
}
/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
SCON = 0x5a; //设置串口为8位可变波特率
#if URMD == 0
T2L = (65536 - (FOSC/4/BAUD));
T2H = (65536 - (FOSC/4/BAUD)) >> 8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
#elif URMD == 1
AUXR = 0x40; //定时器1为1T模式
TMOD = 0x00; //定时器1为模式0(16位自动重载)
TL1 = (65536 - (FOSC/4/BAUD));
TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
TR1 = 1; //定时器1开始启动
#else
TMOD = 0x20; //设置定时器1为8位自动重装载模式
AUXR = 0x40; //定时器1为1T模式
TH1 = TL1 = (256 - (FOSC/32/BAUD));
TR1 = 1;
#endif
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0xff; //设置P1口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上电并延时
}
/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
while (!TI); //等待前一个数据发送完成
TI = 0; //清除发送标志
SBUF = dat; //发送当前数据
}
/*----------------------------
软件延时
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
调试通过 P1.2 P1.3
/************2026 2 20 09:18 L510 CODE 2549**********/
/*****TRCT 5000测试 OLED显示 测试*****/
#include "reg52.h" //取字库代码显示界面
#include "intrins.h" //连续EEPROM地址写FM24C64文字
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define IAP_ADDRESS 0x0000 //EEPROM首地址
sbit OUT_A=P1^4; //运行指示
sbit OUT_B=P1^5; //运行指示
sbit OUT_C=P1^6; //运行指示
sbit OUT_D=P1^7; //运行指示
sbit BEEP=P1^0; //蜂鸣器
sbit KEY_ADD=P3^2; //按键1
sbit KEY_DEC=P3^3; //按键2
typedef uchar BYTE; //
typedef uint WORD; //
uchar aa;
uchar time;
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uchar counter,status; //按键计数标志 按键状态标志
bdata char com_data; /****暂用 ****/
#define high 1
#define low 0
uchar DAT2=0;
bit RunFlag;
bit TestFlag;
bit Signauto=0; /*退出循环检测*/
sfr P1ASF=0x9D; //P1口第2功能控制寄存器
float ADvalue; //存放AD转换返回的结果
/********0--A字符表***阴码 逆向 列行式 十六进制 C51格式**********************/
unsigned char code show1[]=
{
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,/*"A",10*/
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,/*"B",11*/
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,/*"C",12*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",13*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,/*"E",14*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,/*"F",15*/
};
unsigned char code show2[]=
{
0x00,0x00,0x24,0x24,0x24,0x24,0x24,0xFC,0x22,0x22,0x22,0x23,0x22,0x00,0x00,0x00,
0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,/*"手",0*/
0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,
0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,/*"动",1*/
0x00,0x00,0x00,0xF8,0x88,0x8C,0x8A,0x89,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,0x00,/*"自",2*/
0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,
0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,/*"待",3*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,/*"机",4*/
0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,/*"电",5*/
0x00,0x00,0xFE,0x02,0x82,0x82,0x82,0x82,0xFA,0x82,0x82,0x82,0x82,0x82,0x02,0x00,
0x80,0x60,0x1F,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x44,0x58,0x40,0x40,0x00,/*"压",6*/
};
/*************Pin Define***************/
sbit OLED_SCL=P3^0; //408AS
sbit OLED_SDA=P3^1; //408AS
void Initial_LY096BG30();
void Delay_50ms(unsigned int Del_50ms);
void fill_picture(unsigned char fill_Data);
void IIC_Start();
void IIC_Stop();
void Write_IIC_Command(unsigned char IIC_Command);
void Write_IIC_Data(unsigned char IIC_Data);
bit Write_IIC_Byte(unsigned char IIC_Byte);
void dis_Value(uchar s);
/**************Delay*******************************/
void Delay_50ms(unsigned int Del_50ms) //
{
unsigned int m;
for(;Del_50ms>0;Del_50ms--)
for(m=62450;m>0;m--);
}
/*---------------延时子程序----------------*/
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<200;j++)
;
}
/************按键计数器状态寄存器归零************/
void key_reset()
{
kcounter=0; //计数器归零
kstatus=0; //状态计数器归零
delay1(5);
}
/************按键计数器状态寄存器加一************/
void Key_ValAdd()
{
kcounter++; //按键计数器加一
kstatus++; //按键状态标志加一
delay1(5);
}
/***********按键计数器加一状态寄存器归零*********/
void Key_Clear()
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
}
/*******************IIC Start******************/
void IIC_Start()
{
OLED_SCL=high;
//Delay_us(1);
OLED_SDA=high;
nop();
OLED_SDA=low;
nop();nop();
OLED_SCL=low;
}
/*************IIC Stop*************************/
void IIC_Stop()
{
OLED_SDA=low;
nop();
OLED_SCL=high;
nop();nop();
OLED_SDA=high;
}
/*****************IIC Write byte***************/
bit Write_IIC_Byte(unsigned char IIC_Byte)
{
unsigned char i;
bit Ack_Bit; //应答信号
for(i=0;i<8;i++)
{
if(IIC_Byte & 0x80) //1?0?
OLED_SDA=high;
else
OLED_SDA=low;
//Delay_us(1);
OLED_SCL=high;
nop();nop();
OLED_SCL=low;
//Delay_us(1);
IIC_Byte<<=1; //loop
}
OLED_SDA=high; //释放IIC SDA总线为主器件接收从器件产生应答信号
nop();nop();
OLED_SCL=high; //第9个时钟周期
nop();nop();
Ack_Bit=OLED_SDA; //读取应答信号
OLED_SCL=low;
return Ack_Bit;
}
/*************IIC Write Command*****************/
void Write_IIC_Command(unsigned char IIC_Command)
{
IIC_Start();
Write_IIC_Byte(0x78); //Slave address,SA0=0
Write_IIC_Byte(0x00); //write command
Write_IIC_Byte(IIC_Command);
IIC_Stop();
}
/****************IIC Write Data*****************/
void Write_IIC_Data(uchar IIC_Data)
{
IIC_Start();
Write_IIC_Byte(0x78);
Write_IIC_Byte(0x40); //write data
Write_IIC_Byte(IIC_Data);
IIC_Stop();
}
/********************picture**********************/
void cleardisp()
{
uchar x,y;
for(y=0;y<8;y++)
{
Write_IIC_Command(0xb0+y);
Write_IIC_Command(0x00);
Write_IIC_Command(0x10);
for(x=0;x<128;x++) //横向像素
{
Write_IIC_Data(0X00);
}
}
}
/***********************Initial code*********************/
void Initial_LY096BG30()
{
Write_IIC_Command(0xAE); //display off
Write_IIC_Command(0x20); //Set Memory Addressing Mode
Write_IIC_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
Write_IIC_Command(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
Write_IIC_Command(0xc8); //Set COM Output Scan Direction
Write_IIC_Command(0x00); //---set low column address
Write_IIC_Command(0x10); //---set high column address
Write_IIC_Command(0x40); //--set start line address
Write_IIC_Command(0x81); //--set contrast control register
Write_IIC_Command(0x7f);
Write_IIC_Command(0xa1); //--set segment re-map 0 to 127
Write_IIC_Command(0xa6); //--set normal display
Write_IIC_Command(0xa8); //--set multiplex ratio(1 to 64)
Write_IIC_Command(0x3F); //
Write_IIC_Command(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
Write_IIC_Command(0xd3); //-set display offset
Write_IIC_Command(0x00); //-not offset
Write_IIC_Command(0xd5); //--set display clock divide ratio/oscillator frequency
Write_IIC_Command(0xf0); //--set divide ratio
Write_IIC_Command(0xd9); //--set pre-charge period
Write_IIC_Command(0x22); //
Write_IIC_Command(0xda); //--set com pins hardware configuration
Write_IIC_Command(0x12);
Write_IIC_Command(0xdb); //--set vcomh
Write_IIC_Command(0x20); //0x20,0.77xVcc
Write_IIC_Command(0x8d); //--set DC-DC enable
Write_IIC_Command(0x14); //
Write_IIC_Command(0xaf); //--turn on oled panel
}
/*************关所有输出*******************************/
void reset_io()
{
P0M0=0X00;
P0M1=0X00;
P1M0=0X00;
P1M1=0X00;
P3M0=0X00;
P3M1=0X00;
OUT_A=1; //提升链板
OUT_B=1; //输送带
OUT_C=1; //提升链板
OUT_D=1; //输送带
}
/******************************************/
void DisModel() //显示手动
{
uchar x,y;
uint i=0;
uint Cnt=32;
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行 手
Write_IIC_Command(0x00);
Write_IIC_Command(0x10); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第1个字
}
}
/******************************************/
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行 动
Write_IIC_Command(0x00);
Write_IIC_Command(0x11); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*1]); //字符表第1个字
}
}
/**************第二行****************************/
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb2+y); //竖向第一行 电
Write_IIC_Command(0x00);
Write_IIC_Command(0x10); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*5]); //字符表第1个字
}
}
/**************第二行****************************/
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb4+y); //竖向第一行 压
Write_IIC_Command(0x00);
Write_IIC_Command(0x11); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*6]); //字符表第1个字
}
}
/**************第三行****************************/
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb4+y); //竖向第一行 电
Write_IIC_Command(0x00);
Write_IIC_Command(0x10); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*5]); //字符表第1个字
}
}
/**************第三行****************************/
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb2+y); //竖向第一行 压
Write_IIC_Command(0x00);
Write_IIC_Command(0x11); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*6]); //字符表第1个字
}
}
}
/******************************************/
void Disval(uchar ss) //显示运行位
{
uchar x,y;
uint i=0;
uint Cnt=16;
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb4+y); //竖向第一行 2
Write_IIC_Command(0x00);
Write_IIC_Command(0x10); //横向第一个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+Cnt*ss]); //字符表第1个字
}
}
}
/**************在x1,y1地址显示ss数值********/
void Dis_data(uchar ss,st,x1,y1) //显示
{
uchar x,y;
uint i=0;
uint Cnt=16;
for(y=0;y<2;y++)
{
Write_IIC_Command(y1+y); //竖向第一行 2
Write_IIC_Command(0x00);
Write_IIC_Command(x1); //横向第一个字
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+Cnt*ss]); //字符表第1个字
}
for(x=0;x<8;x++) //横向像素
{
Write_IIC_Data(show1[x+y*8+Cnt*st]); //字符表第1个字
}
}
}
/******************************************/
void Diswait() //显示待机
{
uchar x,y;
uint i=0;
uint Cnt=32;
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行 待
Write_IIC_Command(0x00);
Write_IIC_Command(0x15); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(0X00); //字符表第1个字
}
}
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行 待
Write_IIC_Command(0x00);
Write_IIC_Command(0x16); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*3]); //字符表第1个字
}
}
for(y=0;y<2;y++)
{
Write_IIC_Command(0xb0+y); //竖向第一行 机
Write_IIC_Command(0x00);
Write_IIC_Command(0x17); //横向第一个字
for(x=0;x<16;x++) //横向像素
{
Write_IIC_Data(show2[x+y*16+Cnt*4]); //字符表第1个字
}
}
}
/**************显示A函数***********************/
void dis_play1(uint val) /*显示A函数*/
{
uint Data_a,Data_b,Data_c,Data_d;
Data_a=val/1000;
Data_b=(val-Data_a*1000)/100;
Data_c=(val-Data_a*1000-Data_b*100)/10;
Data_d=val-Data_a*1000-Data_b*100-Data_c*10;
Dis_data(Data_a,Data_b,0x15,0XB2);
Dis_data(Data_c,Data_d,0x16,0XB2);
}
/***************显示B函数**********************/
void dis_play2(uint val) /*显示B函数*/
{
uint Data_a,Data_b,Data_c,Data_d;
Data_a=val/1000;
Data_b=(val-Data_a*1000)/100;
Data_c=(val-Data_a*1000-Data_b*100)/10;
Data_d=val-Data_a*1000-Data_b*100-Data_c*10;
Dis_data(Data_a,Data_b,0x15,0XB4);
Dis_data(Data_c,Data_d,0x16,0XB4);
}
/**************P12 AD转换****************************/
unsigned int ADC_P12() //
{
uint i;
uchar status=0; //AD转换结束标志
uint AD_Dat=0; //10位AD转换值
ADC_CONTR|=0X80; //打开ADC转换电源,第一次使用时要打开内部电源
for(i=0;i<10000;i++) //等待电源稳定1ms
P1ASF|=0X04; //0000 0100 P1.2脚位选择寄存器
ADC_CONTR=0XE2; //1110 (0010 P1.2) 通道P1.2
//for(i=0;i<1000;i++) //如果多通道测量,更换通道后延时200us
ADC_CONTR|=0X08; //启动AD转换 0000 1000ADC_START
while(status==0) //等待AD转换结束
{
status=ADC_CONTR&0X10; //判断ADC_FLAG是否等于1,
}
ADC_CONTR&=0XE7; //将ADC_FLAG清零
AD_Dat=(ADC_RES<<2)|(ADC_RESL&0X03);//高八位左移两位和低两位相或
return AD_Dat; //
}
/**************P13 AD转换***************************/
unsigned int ADC_P13() //
{
uint i;
uchar status=0; //AD转换结束标志
uint AD_Dat=0; //10位AD转换值
ADC_CONTR|=0X80; //打开ADC转换电源,第一次使用时要打开内部电源
for(i=0;i<10000;i++) //等待电源稳定1ms
P1ASF|=0X08; //0000 1000 P1.3
ADC_CONTR=0XE3; //1110 (0011 P1.3) 通道P1.3
//for(i=0;i<1000;i++) //如果多通道测量,更换通道后延时200us
ADC_CONTR|=0X08; //启动AD转换
while(status==0) //等待AD转换结束
{
status=ADC_CONTR&0X10; //判断ADC_FLAG是否等于1,
}
ADC_CONTR&=0XE7; //将ADC_FLAG清零
AD_Dat=(ADC_RES<<2)|(ADC_RESL&0X03);//高八位左移两位和低两位相或
return AD_Dat; //
}
/**************定时中断*************************/
void timer0() interrupt 1
{
aa++; //timeA
if(aa>=100)
{
aa=0;
BEEP=~BEEP;
}
}
/*********************************************************/
void main(void) //
{
P1M0=0X00;
P1M1=0X00;
P3M0=0X00;
P3M1=0X00;
P5M0=0X00;
P5M1=0X00;
Initial_LY096BG30(); //初始化显示屏
cleardisp();
reset_io();
Delay_50ms(2);
delay1(2);
DisModel();
Diswait();
Disval(1);
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xA0; //设置定时初始值 5mS 12MHZ
TH0 = 0x15; //设置定时初始值 5mS 12MHZ
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
time=80; //
while(1)
{
ADvalue=ADC_P12()/9; //采样P1.1口模拟输入电压 9根据输入电压,芯片电压测试得出
dis_play1(ADvalue);
ADvalue=ADC_P13()/9; //采样P1.1口模拟输入电压 9根据输入电压,芯片电压测试得出
dis_play2(ADvalue);
Delay_50ms(10);
///////////////高电平关提升链板输送带////////////
key_reset();
for(;kcounter<5;) //按键循环5次
{
if(!KEY_ADD) //按键高电平
{
Key_ValAdd(); //按键高电平 计数器加一状态标志加一
}
else if(~!KEY_ADD) //按键低电平
{
Key_Clear(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
;
}
}
} //L510 CODE 2549
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
LCD12864 显示P10***V P11***V
/*************************************/
void dis_play1(uint val) /*显示A函数*/
{
uint Data_a,Data_b,Data_c,Data_d;
Data_a=val/1000;
Data_b=(val-Data_a*1000)/100;
Data_c=(val-Data_a*1000-Data_b*100)/10;
Data_d=val-Data_a*1000-Data_b*100-Data_c*10;
write_com(0X80); /*地址*/
write_data(0X50); /*P*/
write_com(0X81); /*地址*/
write_data(0X31); /*1*/
write_com(0X82); /*地址*/
write_data(0X3A); /*1*/
write_com(0X83); /*地址*/
write_data(disdt[Data_b]); /*十位*/
write_com(0X84); /*地址*/
write_data(disdt[Data_c]); /*个位*/
write_com(0X85); /*地址*/
write_data(0X2E); /*.*/
write_com(0X86); /*地址*/
write_data(disdt[Data_d]); /*个位*/
write_com(0X87); /*地址*/
write_data(0X56); /*V*/
}
/*************************************/
void dis_play2(uint val) /*显示A函数*/
{
uint Data_a,Data_b,Data_c,Data_d;
Data_a=val/1000;
Data_b=(val-Data_a*1000)/100;
Data_c=(val-Data_a*1000-Data_b*100)/10;
Data_d=val-Data_a*1000-Data_b*100-Data_c*10;
write_com(0X88); /*地址*/
write_data(0X53); /*S*/
write_com(0X89); /*地址*/
write_data(0X31); /*1*/
write_com(0X8A); /*地址*/
write_data(0X3A); /*1*/
write_com(0X8B); /*地址*/
write_data(disdt[Data_b]); /*十位*/
write_com(0X8C); /*地址*/
write_data(disdt[Data_c]); /*个位*/
write_com(0X8D); /*地址*/
write_data(0X2E); /*.*/
write_com(0X8E); /*地址*/
write_data(disdt[Data_d]); /*个位*/
write_com(0X8F); /*地址*/
write_data(0X56); /*V*/
}