本帖最后由 ny760117144 于 2014-6-11 18:46 编辑
//P3^2和P3^3低电平检测,液晶输出圈数、序号、低电平时间
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar sun;//sun为主函数中1602显示地址所用
uchar ge1,ge2,shi1,shi2,bai1,bai2;
uchar code table[]=" R N T "; //设定开始显示的时间
sbit led=P1^0;//定义led为P0.0
sbit wr=P3^6; //1602液晶的读/写端口
sbit dula=P2^6; // 申请U1锁存器的锁存端
sbit wela=P2^7; // 申请U2锁存器的锁存端
sbit lcden=P3^4; // 1602液晶使能端
sbit lcdrs=P3^5; // 1602液晶命令/数据端
sbit a=P3^2;
sbit b=P3^3;
int sum;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
void write_com(uchar com) //1602液晶写指令函数
{
lcdrs=0;
wr=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar dat) //1602液晶写数据函数
{
lcdrs=1;
wr=0;
P0=dat;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void lcd_post(int X,int Y) //0,1表征 第一行 和 第二行
{
write_com(0x80+X*(0x40)+Y);
}
uint read1(int i)//IO口接入脉冲,用T0定时计数器计数:
{
uint val;
sum=0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
if (i==0)
while(a==0);
else
while(b==0);
val = sum * 65536 +TH0* 256 +TL0;
TR0=0;
}
void T0_time() interrupt 1
{
TH0=00;
TL0=00;
sum ++;
}
void init()
{
EA = 1;
ET0 = 1;
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06); //写字符后地址指针加一
write_com(0x01);
}
void main()
{
uint num1;
uchar Q1,Q2;
int iPosition,fhPosition,flPosition,ibPosition,fhbPosition,flbPosition;
Q1=48;
Q2=48;
init();
TMOD=0x01; //设置定时器0工作方式1(0000 0001)
TH0=00; //将计数器寄存器初值清零
TL0=00;
write_com(0x80);//显示第一行 "R" "N" "T"
for(sun=0;sun<16;sun++)
{
write_data(table[sun]);
delayms(5);
}
lcd_post(1,10); //显示初始状态0 0 0.00
write_data('.');
lcd_post(1,3);//1602数据指针指到第二行第3个字,用于显示圈数
write_data('0');//Q为圈数
lcd_post(1,7);//1602数据指针指到第二行第7个字,用于显示低电平端口赋值1
write_data('0');//
lcd_post(1,10);//1602数据指针指到第二行第10个字,用于显示整数部分
write_data('0');//w为时间整数部分
lcd_post(1,11);//1602数据指针指到第二行第11个字,用于显示小数点
write_data('.');//
lcd_post(1,12);//1602数据指针指到第二行第12个字,用于显示小数点十分位
write_data('0');//
lcd_post(1,13);//1602数据指针指到第二行第13个字,用于显示小数点百分位
write_data('0');//
while(Q1 <= 58&&Q2 <= 58)
{
if (a==0)//判断P3.2口出现低电平
{
delayms(10);
if(a==0)
{
num1 = 0;
num1=read1(0);
lcd_post(1,3);//1602数据指针指到第二行第3个字,用于显示圈数
write_data(Q1);//Q为圈数
lcd_post(1,7);//1602数据指针指到第二行第7个字,用于显示低电平端口赋值1
write_data('1');//
iPosition=num1 / 1000000;
lcd_post(1,10);//1602数据指针指到第二行第10个字,用于显示整数部分
write_data(iPosition);//
fhPosition=(num1% 1000000)/100000;
lcd_post(1,12);//1602数据指针指到第二行第12个字,用于显示小数点十分位
write_data(fhPosition);//
flPosition=((num1 % 1000000) % 100000)/10000;
lcd_post(1,13);//1602数据指针指到第二行第13个字,用于显示小数点百分位
write_data(flPosition);//
Q1++;
}
}
if (b==0)
{
delayms(10);
if(b==0)
{
num1 = 0;
num1=read1(1);
lcd_post(1,3);//1602数据指针指到第二行第3个字,用于显示圈数
write_data(Q2);//Q为圈数
lcd_post(1,7);//1602数据指针指到第二行第7个字,用于显示低电平端口赋值1
write_data('2');//
ibPosition=num1 / 1000000;
lcd_post(1,10);//1602数据指针指到第二行第10个字,用于显示整数部分
write_data(ibPosition);//
fhbPosition=(num1 % 1000000)/100000;
lcd_post(1,12);//1602数据指针指到第二行第12个字,用于显示小数点十分位
write_data(fhbPosition);//
flbPosition=((num1 % 1000000) % 100000)/10000;
lcd_post(1,13);//1602数据指针指到第二行第13个字,用于显示小数点百分位
write_data(flbPosition);//
Q2++;
}
}
}
}
主要目的是测量P3.2和P3.3低电平时间,时间大约在1至3秒,但是液晶显示的时间是乱码
此帖出自
小平头技术问答
其他都可以显示出来,就是计算时间的部分显示不出
uint read1(int i)//IO口接入脉冲,用T0定时计数器计数:
{
uint val;
sum=0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
if (i==0)
while(a==0);
else
while(b==0);
val = sum * 65536 +TH0* 256 +TL0;
TR0=0;
}
void T0_time() interrupt 1
{
TH0=0;
TL0=0;
sum ++;
}
这里是否有问题?感觉怪怪的
一周热门 更多>