欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機程序問題 一個按鍵按一下,然后串口顯示01,再按下為02
[打印本頁]
作者:
匿名信封研
時間:
2019-1-20 00:53
標題:
單片機程序問題 一個按鍵按一下,然后串口顯示01,再按下為02
以下是我編寫的一個程序,目的是讓單片機一個按鍵按一下,然后串口顯示01,再按下為02,但是我寫的這個程燒錄到單片機上的時候一直按那個按鍵,單片機串口一直都顯示01,從來都不變,有沒有大佬幫忙看一下為什么呀
單片機代碼:
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^1;
uchar key_count;
//串口初始化
void UARTInit()
{
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
SM0 = 0;
SM1 = 1;//串口工作方式1,8位UART波特率可變
REN = 1;//串口允許接收
TR1 = 1;//啟動定時器1
TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
TH1 = 0xfd;
TL1 = 0xfd;//設置比特率9600
}
uchar code duan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71};
void delayms(uint xms)//此為延時函數,就是前面的延時都是需要調用這一個函數
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()
{
key=1;
if(key==0)
{
delayms(50);
if(key==0)
{
key_count++;
if(key_count==10)
key_count=0;
while(!key);
}
}
}
void timer0Init()
{
EA = 1; //打開總中斷
ET0 = 1;//打開定時器0中斷
TR0 = 1; //啟動定時器0
REN = 1;//允許串口接收
TMOD |= 0X01; //定時器工作模式1,16位定時模式
TH0 = 0xED;
TL0 = 0xFF; //定時5ms
}
void main()
{
timer0Init();//定時器0初始化
UARTInit();//串口初始
keyscan();
while(1);
}
//定時器0中斷函數
void timer0() interrupt 1
{
TH0 = 0xED;
TL0 = 0xFF; //定時5ms
}
//串口中斷函數
void UART() interrupt 4
{
uchar temp;
if(RI)//判斷接收是否完成
{
key_count = SBUF;//讀SBUF,讀出串口接收到的數據
RI = 0;//軟件清零接收標志位
temp = key_count;//
SBUF = ++temp;//寫SBUF,把要發送的數據送給發送緩存器
}
if(TI)//判斷是否發送完成
TI = 0;//清零發送完成標志位
}
復制代碼
作者:
wulin
時間:
2019-1-20 08:21
如果只需要串口發送不需要串口接收就不必開串口接收中斷。你的主要問題是按鍵掃描程序放在主循環外了。給你改了下,無關的語句都屏蔽了,你試試。
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^1;
/*
uchar code duan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71}; */
uchar key_count;
bit k;
//此為延時函數,就是前面的延時都是需要調用這一個函數
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//串口初始化
void UARTInit()
{
TMOD &= 0x0f;
TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
TH1 = 0xfd;
TL1 = 0xfd;//設置比特率9600
TR1 = 1;//啟動定時器1
TR1 = 1;//啟動定時器1
SM0 = 0;
SM1 = 1;//串口工作方式1,8位UART波特率可變
// EA = 1; //打開總中斷
// ES = 1; //打開串口中斷
}
//按鍵掃描
void keyscan()
{
key=1;
if(key==0)
{
delayms(50);
if(key==0)
{
key_count++;
if(key_count==10)
key_count=0;
k=1;//允許發送標志置1
while(!key);
}
}
}
/*
void timer0Init()
{
EA = 1; //打開總中斷
ET0 = 1;//打開定時器0中斷
TR0 = 1; //啟動定時器0
REN = 1;//允許串口接收
TMOD |= 0X01; //定時器工作模式1,16位定時模式
TH0 = 0xED;
TL0 = 0xFF; //定時5ms
}*/
void main()
{
// timer0Init();//定時器0初始化
UARTInit();//串口初始
while(1)
{
keyscan();
if(k==1) //如果允許發送
{
k=0; //發送標志清0,防止重復發送
SBUF=key_count; //發送數據
while(!TI); //等待發送中斷請求標志位為1(已發送)
TI=0; //發送中斷請求標志位清0
}
}
}
/*
//定時器0中斷函數
void timer0() interrupt 1
{
TH0 = 0xED;
TL0 = 0xFF; //定時5ms
}
//串口中斷函數
void UART() interrupt 4
{
uchar temp;
if(RI)//判斷接收是否完成
{
key_count = SBUF;//讀SBUF,讀出串口接收到的數據
RI = 0;//軟件清零接收標志位
temp = key_count;//
SBUF = ++temp;//寫SBUF,把要發送的數據送給發送緩存器
}
if(TI)//判斷是否發送完成
TI = 0;//清零發送完成標志位
}*/
作者:
匿名信封研
時間:
2019-1-20 13:52
wulin 發表于 2019-1-20 08:21
如果只需要串口發送不需要串口接收就不必開串口接收中斷。你的主要問題是按鍵掃描程序放在主循環外了。給你 ...
嗯嗯,這樣可以實現了,非常感謝了
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1