51单片机 用stc烧写 我的是学习板 然后 扫描不到串口 怎么破?如图 我也是不
STC单片机,烧录程序要安装USB转串口的驱动程序。
你要买一条USB转串口线,或USB转TTL线,然后电脑上安装驱动程序,才能找到串口的。
你这STC-ISP的烧录软件是最新版的吗?应该是下载的一个软件包,里有就有驱动程序和安装方法的。没有,就重新下载一个软件包。
单片机实现对按键的定时扫描 哪位高手能帮忙把下面按键扫描程序改成用定时器对按键进行定时扫描啊,我用的
楼主的那个程序我看不太懂:不过根据你的大概意思更改了一下程序,希望对你有帮助!下面是我的程序代码:
/********************************************************************
* 文件名 : 矩阵键盘.c
* 描述 : 该文件实现了 4 * 4 键盘的试验。通过数码管的最后一位来显示
当前的按键值。
*********************************************************************/
#includereg51.h
#includeintrins.h
#define uint unsigned int
#define uchar unsigned char
uchar code table[16] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //用于数码管显示 本程序未用
uchar Key; //读出的键值
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;ji;j++)
for(x=0;x=148;x++);
}
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay()
{
int i,j;
for(i=0; i=10; i++)
for(j=0; j=2; j++);
}
/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j=0; j4; j++)
{
P1 = Buffer[j];
temp = 0x01;
for(i=0; i4; i++)
{
if(!(P1 temp))
{
return (i+j*4); //这里返回的是按键牌排列值!
}
temp = 1;
}
}
}
/********************************************************************
* 名称 : InitTimer0()
* 功能 : 用于定时器初始化。
* 输入 : 无
* 输出 :
***********************************************************************/
unsigned int Timer_1s=0;//定时器中断响应次数变量
//定时时间长度=定时中断响应时间*定时中断响应次数
void InitTimer0()
{
// AUXR=0x80; //定时时钟为Sysclk,即晶振时钟 实用于具有单时钟周期的单片机系列
//特别的还需要注意时钟设置在其它模块中的设置,如波特率的定时器1时钟设置
TMOD = 0x21; //定时器0工作于方式1,,16位定时,定时器1为波特率发生器
//特别地,高四位控制定时器1,低四位控制定时器0,
//所以此处需要注意程序中是否并存定时器1工作,如串口就需要定时1的设置为TMOD=0x20
TH0 = 0x0B8; //定时装如初值 //定时1000us 即1ms
TL0 = 0x00; //定时其它值可由需要重新计算初值
ET0 = 1; //允许中断
TR0 = 1; //启动定时器
}
/********************************************************************
* 名称 : Timer0Interrupt()interrupt 1
* 功能 : 定时器中断。
* 输入 : 无
* 输出 :
***********************************************************************/
void Timer0Interrupt() interrupt 1
{
TR0 = 0; //关闭定时器
TH0 = 0x0B8; //重装初值
TL0 = 0x00;
Timer_1s++; //中断响应次数自加1
if(Timer_1s=20) //可以在此处调节按键的扫描时间
{
/*一下是扫描按键并带返回值的结果*/
P1 = 0xf0;
if(P1 != 0xf0)
{
Delay_1ms(15); //按键消抖
if(P1 != 0xf0)
{
Key = Keyscan();
}
}
}
TR0 = 1; //启动定时器
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
InitTimer0();//初始化定时器
EA =1; //开中断
while(1)
{
switch (Key) //判断键值(那一个键按下)
{
case 0: /*加入需要执行该按键下的程序*/; break; //假设0号按键被按下
case 1: /*加入需要执行该按键下的程序*/; break;
case 2: /*加入需要执行该按键下的程序*/; break;
case 3: /*加入需要执行该按键下的程序*/; break;
case 4: /*加入需要执行该按键下的程序*/; break;
case 5: /*加入需要执行该按键下的程序*/; break;
case 6: /*加入需要执行该按键下的程序*/; break;
case 7: /*加入需要执行该按键下的程序*/; break;
case 8: /*加入需要执行该按键下的程序*/; break;
case 9: /*加入需要执行该按键下的程序*/; break;
case 10: /*加入需要执行该按键下的程序*/; break;
case 11: /*加入需要执行该按键下的程序*/; break;
case 12: /*加入需要执行该按键下的程序*/; break;
case 13: /*加入需要执行该按键下的程序*/; break;
case 14: /*加入需要执行该按键下的程序*/; break;
case 15: /*加入需要执行该按键下的程序*/; break;
default: break;
}
}
}
单片机键盘扫描程序
2*3的键盘,太简单了,不值得用循环,特别是双重循环。
最简明、高效的程序如下:
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
char scan_key(void)
{
P13 = 0;
if (!P10) return 0;
if (!P11) return 1;
if (!P12) return 2;
P13 = 1;
P14 = 0;
if (!P10) return 3;
if (!P11) return 4;
if (!P12) return 5;
}
本程序,使用的变量最少,也不涉及其它接口。
代码最少,执行效率最高。
51单片机不用开发板下程序,直接用p3.0和p3.1口下程序,应该怎样下载呢?
STC单片机可以这么做,用USB转TTL下载线,一端接电脑,另外一端有4根线,分别接P3·0 P3·1 地 电源(如果已经有电源,该线不用),电脑上要装一个驱动程序
插上下载线,然后在设备管理器里查看端口,可以发现己经多个一个串口如com3,下载时就选这个串口,有些版本的下载软件会自动扫描串口,更加方便
求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。
这里只讲原理,不关注速度。实际设计工作中,已经有很多单片机能够识别io端口上升沿和下降沿中断,且方式不止一种。
sbit io_inp=P2^1;输入端
bit old_bit;输入端电平记忆
unsigned char low_high;上升下降沿标志,0=无变化,1=上升沿,2、下降沿
void io_rest(void)
{
if(old_bit=!io_inp)
{
old_bit=io_inp;
if(io_inp=1)
low_high=1;
else
low_high=2;
}
}
void main(void)
{
old_bit=io_inp=P2^1;
while(1)
{
low_high=0;
io_rest(void);
//在此应用
}
}
0条大神的评论