哪位高手幫我看一下程序。坑悬c錯誤,我改不了。#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)
{
}
|