|
為什么在LCD1602上會(huì)出現(xiàn)70,為什么 按鍵k3、k4調(diào)速,將速度等級(jí)在LCD1602顯示?我這程序哪里錯(cuò)出錯(cuò)了?
#include <reg52.h> //包含52頭文件
#define uint unsigned int //宏定義uint代替unsigned int
#define uchar unsigned char //宏定義uchar代替unsigned char
#define out P2
sbit lcdrs=P0^5;//液晶的RS端接P2.4口
sbit lcdrw=P0^6;//液晶的RW端接P2.5
sbit lcden=P0^7;// 液晶的EN使能端接P2.6口
sbit KEY1=P3^1; //按鍵聲明 //正轉(zhuǎn)
sbit KEY2=P3^4; //按鍵聲明 //反轉(zhuǎn)
sbit LED=P0^4;
unsigned long beats=0;//轉(zhuǎn)動(dòng)總拍數(shù)
unsigned long angle=0; //需要轉(zhuǎn)動(dòng)的角度
uchar code forturn[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//正轉(zhuǎn)拍
uchar code revtutn[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//反轉(zhuǎn)拍
uchar flag=0;//按鍵標(biāo)志位
uchar flagmotor=0;//正反轉(zhuǎn)標(biāo)記
uchar temp;//臨時(shí)變量
uchar index;//拍數(shù)索引
uchar motorturn=0;//電機(jī)轉(zhuǎn)動(dòng)圈數(shù)
void T0_init();//定時(shí)器
void T1_init();
void EX_init();//外部中斷來(lái)控制加速減速
void forone();//正轉(zhuǎn)
void reone();//反轉(zhuǎn)
void stop(); //停止
void grade();//占空比等級(jí)
void delayms (uint xms);
void keyscan();
void write_str(uchar *str);
void write_data(uchar dat);
void check_busy(void);
void lcd_init();
void write_cmd(char cmd);
void xianshi();
void uart_init();
void lap();
uchar keyflag;
uchar count=0,Hi=0,x,dat;
uchar num[6];
void main() //主函數(shù)
{ motorturn=1;
angle=motorturn*360;
beats=(angle*4096)/360;
T0_init();
EX_init();
T1_init();
lcd_init();
uart_init();
write_cmd(0x80);
write_str("speed:");
while(1)
{ keyscan();
switch(keyflag)
{ case 1:{TR0=1;flagmotor=1;LED=0;}break;
case 2:{TR0=1;flagmotor=2;LED=1;}break;
default:stop();break;
}
lap();
}
}
/*************定時(shí)器T1初始化函數(shù)**************/
void T1_init()
{
TMOD=TMOD|0x20; //設(shè)置T1為方式2
TH1=256-200; //置T1高8位,備用初值
TL1=256-200; //置T1低8位,初值
TR1=1; //啟動(dòng)T1
ET1=1; //開T1中斷
EA=1; //開總中斷
}
/**********T0中斷服務(wù)程序*********/
void T1_int() interrupt 3 //10ms進(jìn)入中斷
{
TH1=(65536-100)/256;//置T0高8位初值
TL1=(65536-100)%256;//置T0低8位初值
count++; //累計(jì)進(jìn)入中斷次數(shù),進(jìn)入1次為10ms
if(count>=200) //count累計(jì)200次為1s
{
count=0; //1s后count清0,重新累計(jì)下一次1s
}
if(count<Hi)flagmotor=1;
else flagmotor=0;
}
/********外部中斷0和外部中斷1的中斷服務(wù)函數(shù)*********/
void EX_init()
{
IT0=1; //外中斷0下降沿觸發(fā)
EX0=1; //允許外中斷0中斷
PX0=1; //優(yōu)先級(jí)設(shè)置,可選
IT1=1; //外中斷1下降沿觸發(fā)
EX1=1; //允許外中斷1中斷
PX1=1; //優(yōu)先級(jí)設(shè)置,可選
EA=1; //總中斷允許
}
/********外部中斷0中斷服務(wù)函數(shù)*********/
void EX_INT0() interrupt 0
{ uchar x=0;
TR0=1;
x++;
if(x==5)x=4;
xianshi();
grade();
}
/********外部中斷1中斷服務(wù)函數(shù)*********/
void EX_INT1() interrupt 2
{ uchar x=4;
TR0=1;
x--;
if(x<=0)x=0;
grade();
xianshi();
}
void stop()
{ P1=P1&0xf0;
}
void keyscan() //按鍵檢測(cè)函數(shù) 基礎(chǔ)代碼
{
KEY1=1; // 輸入先寫"1"
if (KEY1==0)
{
delayms(10); //延時(shí)去抖
if(KEY1==0) //按鍵按下
{
keyflag=1; //設(shè)標(biāo)志位
}
while(!KEY1); //松手檢測(cè)
}
KEY1=2; // 輸入先寫"1"
if (KEY2==0)
{
delayms(10); //延時(shí)去抖
if(KEY2==0) //按鍵按下
{
keyflag=2; //設(shè)標(biāo)志位
}
while(!KEY2); //松手檢測(cè)
}
}
void forone()
{ beats--;
temp=P1;
temp=temp&0xf0;
temp=temp|forturn[index];
P1=temp;
index++;
if(index==0x08)index=0;
if(beats==0)
{ P1=P1&0XF0;
TR0=0;
flag=0;
index=0;
flagmotor=0;
angle=motorturn*360;
beats=(angle*4096)/360;
}
}
void delayms (uint xms) //毫秒函數(shù)定義
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<120;j++);
}
void T0_init()
{
TMOD=TMOD|0x01; //設(shè)置T0為方式1
TH0=(65536-5000)/256;//置T0高8位初值
TL0=(65536-5000)%256;//置T0低8位初值
TR0=0; //啟動(dòng)T0
ET0=1; //開T0中斷
EA=1; //開總中斷
}
void T0_int() interrupt 1 //10ms進(jìn)入中斷
{
TH0=(65536-5000)/256;//置T0高8位初值
TL0=(65536-5000)%256;//置T0低8位初值
if(flagmotor==1)
forone();
if(flagmotor==2)
stop();
}
void grade()
{ switch(x)
{case 1:Hi=20;break;
case 2:Hi=60;break;
case 3:Hi=100;break;
case 4:Hi=140;break;
}
}
/**********************檢查忙標(biāo)志函數(shù)************************/
void check_busy(void)
{
uchar dt;
out=0xff;
do
{
lcden=0;
lcdrs=0;
lcdrw=1;
lcden=1;
dt=out;
}while(dt&0x80);
lcden=0;
}
/**************************1602顯示****************************/
void write_cmd(char cmd) //寫指令函數(shù)
{
check_busy();
lcden=0;//再把EN拉低
lcdrs=0;
lcdrw=0;//先將RW拉低
out=cmd;
lcden=1;
lcden=0;
}
void write_data(uchar dat) //寫數(shù)據(jù)函數(shù)
{
check_busy();
lcden=0;//再把EN拉低
lcdrs=1;
lcdrw=0;//先將RW拉低
out=dat;
lcden=1;
lcden=0;
}
void write_str(uchar *str)//寫字符串函數(shù)
{
while(*str!='\0')
{
write_data(*str++);
delayms(5);
}
}
/***************************初始化******************************/
void lcd_init()//初始化1602
{
write_cmd(0x38);//顯示模式設(shè)置
write_cmd(0x0c);//顯示開關(guān),光標(biāo)沒有閃爍
write_cmd(0x06);//顯示光標(biāo)移動(dòng)設(shè)置
write_cmd(0x01);//清除屏幕
delayms(1);
}
void xianshi()
{ write_cmd(0x80+0x06);
num[5]=Hi/10;
num[5]=Hi%10;
write_data(0x37+num[5]);
write_data(num[5]+0x30);
}
/****************串口方式1初始化*************/
void uart_init()
{
SCON=0x50; //串口方式1,TI和RI清零,允許接收;
PCON=0x80; //波特率加倍 SMOD=1
TMOD=TMOD|0x20; //T1定時(shí)方式2
TH1=0xf3;
TL1=0xf3; //4800b/s 晶振12MHz
TR1=1; //啟動(dòng)T1
ES=1;
EA=1;
}
/*************中斷接收一個(gè)字節(jié)數(shù)據(jù)函數(shù)*********/
void uart_receive() interrupt 4
{
if(RI==1)
{
RI = 0; //清TI標(biāo)志位
dat=SBUF; //接收數(shù)據(jù)存入變量dat
}
}
void lap()
{ switch(dat)
{ case 0x01:{TR0=1;flagmotor=1;LED=0;}break;
case 0x02:{TR0=1;flagmotor=2;LED=1;}break;
case 0x03:{ TR0=1;x++;if(x==5)x=4;grade();xianshi();}break;
case 0x04:{ TR0=1;x--;if(x==0)x=0;grade();xianshi();}break;
}
}
|
|