㈠ 单片机 p1.0和 p1.1引脚有两个开关 s0和 s1。s0、s1均闭合的时, 只有 led0亮,
//设你的LED接在P0^1脚
#define <reg52.h>
void DetectInput()
{
while(P1^0==1 && P1^1==1)//当P1.0和P1.1均为高电平时
{
P0^1=1;
}
}
void main()
{
DetectInput();
}
㈡ 一、设计秒表:单片机的振荡频率fosc=11.0592MHz,两位数码管显示,用三个按键S0、S1、S2控制秒表,上电时
这是你们实训的内容吧,把中断看看,串行通讯看看,就ok了
㈢ 求单片机源程序将S0至S3按键所代表的二进制编制转换成十进制后在数码管上的显示
S0至S3按键所代表的二进制,到底代表的是什么呢?键值吗?
㈣ 单片机一个独立按键
#include<reg51.h> // 4*4 按键+数码管仿真,可以参考。
#define uchar unsigned char
uchar temp;
int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char ledx[8];
bit s0,s1;
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void scan() //要是按键了,扫描键盘编码值
{
P1=0xF0;
delay(1);
temp=P1;
switch(temp)
{
case 0xe0: key1=0;
break;
case 0xd0: key1=1;
break;
case 0xb0: key1=2;
break;
case 0x70: key1=3;
break;
}
P1=0x0f;
delay(1);
temp=P1;
switch(temp)
{
case 0x0E: key=key1+0;
break;
case 0x0D: key=key1+4;
break;
case 0x0B: key=key1+8;
break;
case 0x07: key=key1+12;
break;
default : key=-1;
}
if((key1+1)&&(key+1)) disbuf=key;
}
void ejjc() //判断是否按键
{
P1=0xF0;
if(P1!=0xF0) { scan();s0=1;}
else { s0=0; s1=1;}
}
void main()
{
uchar i;
while(1)
{
ejjc();
if(s0==1 && s1==1)
{
s0=0;s1=0;
for(i=0;i<8;i++)
{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }
}
P0=0xff;
P2=LED7Code[ledx[0]];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[ledx[1]];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[ledx[2]];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[ledx[3]];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[ledx[4]];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[ledx[5]];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[6]];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[7]];
P0=0x7f;
delay(5);
}
}
㈤ 求大神一个关于89c52单片机用S0键来启动和停止流水灯的程序,在这里先感谢各位大佬帮帮忙。
//键控流水灯
#include "REG52.H"
#define DataGPIO P1//显示端口
#define FLOWTIME 100//修改此值,改变流水速度
sbit KEY = P2^0;//按键
bit Start_flag =0;//流水灯控制
bit Flow_flag =0;//流水
unsigned char Cnt =0;//流水灯计数器
unsigned char KEY_Cnt=0;//按键识别计数器
void Init_Timer0()//定时器0初始化
{
TMOD |= 0x01;//16位计数器
TH0 = 0xEC;
TL0 = 0x77;//12M,12T,5000us=5ms
TCON |= 0x10;//定时器0启动
TCON |= 0x01;//定时器0中断允许
IE |= 0x80;//总中断开
}
void Flow_Cont()//流水计数
{
if(++Cnt>FLOWTIME)//500ms
{
Cnt=0;
Flow_flag =1;//流水控制位
}
}
void KEY_Scan()//键扫描
{
if(!KEY)//键被按下
{
if(KEY_Cnt!=0)//键计数器不为0,已经消抖
{
KEY_Cnt = 0;//清计数器
Start_flag =~Start_flag;//流水显示控制
}
else //键计数器为0,没有消抖
{
KEY_Cnt++;//键计数器+1,再扫描一次。
}
}
}
//
void Timer0_ISR() interrupt 1 //定时器0中断响应
{
TCON &= ~0x20;//定时器0清溢出
TH0 = 0x3C;
TL0 = 0xAF;//12M,12T,50000us=50ms
Flow_Cont();//流水计数
KEY_Scan();//键扫描
}
void DispFlashLED()//流水灯
{
if(Flow_flag)
{
Flow_flag =0;//
switch(DispBit)
{
case 0; DataGPIO = 0xfe; break;
case 0; DataGPIO = 0xfd; break;
case 0; DataGPIO = 0xfb; break;
case 0; DataGPIO = 0xf7; break;
case 0; DataGPIO = 0xef; break;
case 0; DataGPIO = 0xdf; break;
case 0; DataGPIO = 0xbf; break;
case 0; DataGPIO = 0x7f; break;
}
DispBit++;
}
}
int main()
{
Init_Timer0();//定时器0初始化
while(1)
{
if(Start_flag)//如果启动流水灯
{
DispFlashLED();//流水灯
}
else
{
DataGPIO = 0xff;//不显示
}
}
}
㈥ 单片机。c. bit s1,s2;啥意思
bit是位数据变量申明,这行的意思是位声明变量s0和s1,他们的取值只有0或者1.当取值为0以外的数值时候,系统均以1看待,有点类似高级语言的True和False。它与sbit的区别是,相同的地方都是位申明,bit和int char差不多,只是一个是8位,而bit是1位;bit在编译的时候分配的地址是随机的,sbit编译时候地址是固定的,即sbit可以寻址操作,而bit不行。
㈦ 单片机中断实验交通灯的实验原理
根据图3.2电路,用单片机的IO口控制4组红绿黄共12个发光二极管,使发光二极管按照一定规则与次序发光与闪亮以实现模拟交通灯的功能。假设初始状态为:(南北通行状态)南北绿灯、东西红灯(25s);后转为过度状态:南北黄灯、东西红灯(5s);再转为东西通行状态:东西绿灯、南北红灯25(s)。再转为过渡状态:东西黄灯、南北红灯(5s),然后循环往复。
要求采用定时器实现所需要的定时时间。
2、键控交通灯。
按一下K1键
,保持南北通行状态;按一下K2键
,保持东西通行状态;按一下K3键
,保持正常交通灯。
要求在中断中进行按键处理。
3、具有闪烁的交通灯。
在2的基础上增加,绿灯最后5s闪烁,即亮0.5S灭0.5S闪烁。
四、实验原理图
图3.2交通灯实验电路原理图
图3.2共有4个按键K1、K2、K3、K4,分别连接到单片机P2.0、P2.1、P2.2、P2.3引脚,按键后对应引脚为低电平,通过4个二极管D17、D18、D19、D20连接到P3.2(外部中断0),这是二极管构成的相与电路,即任意按一个键能在P3.2上产生一个低电平或下降,作为中断触发信号。
五、软件设计思想
1、定时思想。
采用定时器T0或T1的方式1定时500ms,每500ms中断进行计数,计数10次即0.5s,计数20次即1s,对秒计数实现所需要的定时时间。
2、亮灯控制思想。
单片机控制灯引脚与灯对应如下,0点亮。
一共有四种状态S0、S1、S2、S3,
a、南北通行S0状态:
南北绿灯、东西红灯,P0=11110111=0xf7,P1=10011110=0x9e;
南北通行S0
b、过渡状态S1:
南北黄灯、东西红灯,P0=11111011=0xfb,P1=10101110=0xae;
过渡状态S1
c、东西通行状态S2:
东西绿灯、南北红灯,P0=11111100=0xfc,P1=11110011=0xf3;
东西通行状态S2
d、过渡状态S3:
东西黄灯、南北红灯,P0=11111101=0xfd,P1=01110101=0x75;
过渡状态S3
设置一个秒计数单元SEC每秒+1,设置两个控制值变量a,b。
㈧ 89S51单片机上S0 S1键控制跑马灯
这怎么回答呢?
流程:
开始
S0,S1同时按下了?
是,开始主程序
不是,等待S0,S1同时按下
主程序
跑马灯
㈨ 单片机汇编语言
MOV R0,#30H ;y所在的起始地址
MOV R2,#10 ;循环初值,10个数,循环10次
S0:
MOV DPTR,#2000H ;x开始的起始地址
MOVX A,@DPTR ;取出x的值
RL A ;因为数在1~10之间,所以左移1位,相当于乘2
ADD A,@R0 ;2x+y
DEC A ;2x+y-1
MOV DPTR,#3000H
MOVX @DPTR,A ;结果送3000H
DJNZ R2,S0 ;控制循环10次
SJMP $
END
㈩ 单片机的独立按键
#include<reg51.h> // 4*4 按键+数码管仿真,可以参考。
#define uchar unsigned char
uchar temp;
int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char ledx[8];
bit s0,s1;
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void scan() //要是按键了,扫描键盘编码值
{
P1=0xF0;
delay(1);
temp=P1;
switch(temp)
{
case 0xe0: key1=0;
break;
case 0xd0: key1=1;
break;
case 0xb0: key1=2;
break;
case 0x70: key1=3;
break;
}
P1=0x0f;
delay(1);
temp=P1;
switch(temp)
{
case 0x0E: key=key1+0;
break;
case 0x0D: key=key1+4;
break;
case 0x0B: key=key1+8;
break;
case 0x07: key=key1+12;
break;
default : key=-1;
}
if((key1+1)&&(key+1)) disbuf=key;
}
void ejjc() //判断是否按键
{
P1=0xF0;
if(P1!=0xF0) { scan();s0=1;}
else { s0=0; s1=1;}
}
void main()
{
uchar i;
while(1)
{
ejjc();
if(s0==1 && s1==1)
{
s0=0;s1=0;
for(i=0;i<8;i++)
{ ledx[i]=ledx[i+1]; ledx[8]=disbuf; }
}
P0=0xff;
P2=LED7Code[ledx[0]];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[ledx[1]];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[ledx[2]];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[ledx[3]];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[ledx[4]];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[ledx[5]];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[6]];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[ledx[7]];
P0=0x7f;
delay(5);
}
}