标题:
单片机程序问题 一个按键按一下,然后串口显示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://www.51hei.com/bbs/)
Powered by Discuz! X3.1