哪位高手帮我看一下程序啊?有点错误,我改不了。#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P0 //LCD数据总线
sbit LCD_RS = P2^0; //1-选择数据选择器 0-选择指令选择器
sbit LCD_RW = P2^1; //1-读操作 0-写操作
sbit LCD_EN = P2^2; //LCD使能端
uchar line1[16] = {"NowSpeed= rps"};//显示缓存
uchar line2[16] = {"RH= ,RL= rps"};
uint N; //定义计数器脉冲值
int Nmax=100,Nmin=40; //定义报警上下限
uchar T0_count=0;
//LCD 1602A子程序---------------------------------//
//延时子函数//
void delay_ms(int ms)
{
uchar y;
while(ms--)
{
for(y = 0; y<250; y++)
{ _nop_();_nop_();_nop_();_nop_(); }
}
}
//检查LCD忙状态,lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据//
bit lcd_busy()
{
bit result;
LCD_RS=0;LCD_RW=1; //忙标志读出
LCD_EN=1;
{_nop_();_nop_();_nop_();_nop_();_nop_();};//延迟5个机器周期
result=(bit)(LCD_DATA&0x80);
LCD_EN=0;
return(result);
}
//写指令数据到LCD---------------------------------//
//RS=L,RW=L,E=高脉冲,D0-D7=指令码。
void lcd_write_cmd(uchar cmd)
{
while(lcd_busy());
LCD_EN=0;
LCD_RS=0;LCD_RW=0;//指令寄存器写入
LCD_EN=1;
LCD_DATA=cmd; //写命令
LCD_EN=0;
}
//写显示数据到LCD---------------------------------//
//RS=H,RW=L,E=高脉冲,D0-D7=数据。
void lcd_write_data(uchar dat)
{
while(lcd_busy());
LCD_EN=0;
LCD_RS=1;LCD_RW=0;//数据寄存器写入
LCD_EN=1;
LCD_DATA=dat; //写数据
LCD_EN=0;
}
//LCD初始化设定----------------------------------//
void lcd_init()
{
LCD_DATA=0;
delay_ms(10); //延时
lcd_write_cmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
lcd_write_cmd(0x38); //重复写入,解决冷启动时的异常
delay_ms(5);
lcd_write_cmd(0x0c); //显示开,关光标
delay_ms(5);
lcd_write_cmd(0x06); //移动光标
delay_ms(5);
lcd_write_cmd(0x01); //清除LCD的显示内容
delay_ms(5);
}
//设定显示位置-------------------------------------//
void lcd_pos(uchar pos)
{
lcd_write_cmd(pos | 0x80); //数据指针=80+地址变量
}
//LCD显示-----------------------------------------//
display()
{
uchar m;
lcd_pos(0); //设置显示位置为第一行第1个字符,00H-27H共40字符
for(m=0;m<16;m++)
lcd_write_data(line1[m]);
lcd_pos(0x40); //设置显示位置为第二行第1个字符,40H-67H共40字符
for(m=0;m<16;m++)
lcd_write_data(line2[m]);
}
//LCD 1602A子程序结束-----------------------------//
//计算转速并计算显存值--------------------------------//
void compute_rps(uint N) // uint N; //0-65535
{
uint rps;
uchar num_array[3]={0};
uchar max_array[3]={0};
uchar min_array[3]={0};
uint num;
uchar i=0;
rps=N; //计算转速值 r/s(转/秒) rps=N/2 r/ 500 ms =N r/s */
num=rps;
//分离num(num为整数)各位值的函数,最低位放在array[0]----//
do{
num_array[i++]=num%10;
}while(num=num/10); //分号不能忽略!
i=0;
line1[10]=num_array[2]+0x30;
line1[11]=num_array[1]+0x30;
line1[12]=num_array[0]+0x30;
num=Nmax;
//分离num(num为整数)各位值的函数,最低位放在array[0]----
do{
max_array[i++]=num%10;
}while(num=num/10); //分号不能忽略!
i=0;
line2[3]=max_array[2]+0x30;
line2[4]=max_array[1]+0x30;
line2[5]=max_array[0]+0x30;
num=Nmin;
//分离num(num为整数)各位值的函数,最低位放在array[0]----
do{
min_array[i++]=num%10;
}while(num=num/10); //分号不能忽略!
i=0;
line2[10]=min_array[2]+0x30;
line2[11]=min_array[1]+0x30;
line2[12]=min_array[0]+0x30;
//定时器0中断--------------------//
void timer0(void) interrupt 1
{
T0_count++;
TH0=0x3C;TL0=0xB0; //T0重置,50ms f0=12MHZ
scan();
if(T0_count>=10)
{
T0_count=0;
ET0=0; //关中断开关
TR0=0;TR1=0; //关T0,关T1
N=256*TH1+TL1; //统计50ms*10内的脉冲数N
compute_rps(N);
display();
TH0=0x3C;TL0=0xB0; //T0重置,50ms f0=12MHz
TH1=0x00;TL1=0x00; //T1重置
ET0=1; //中断开关开
TR0=1;TR1=1;
}
}
//主函数---------------------------//
main()
{
lcd_init(); //初始化LCD
TMOD=0x51; //设置定时器工作方式,即T0为16位定时器、T1为16位计数器。
// GATE C/T M1 M0 GATE C/T M1 M0
// 0 1 0 1 0 0 0 1
TH0=0x3C;TL0=0xB0; //T0初始化
TH1=0x00;TL1=0x00; //T1初始化
EA=1; //打开总中断
// EA - ET2 ES ET1 EX1 ET0 EX0
// 1 0 0 0 0 0 1 0
ET0=1; //允许T0中断
TR0=1;TR1=1; //启动T0,T1
//TF1 TR1 TF0 TR0
// 1 1
while(1)
{
}
|