51单片机实验及protues仿真
实验内容:
设计一个单片机实验,完成对外部事件进行计数,当来2个脉冲时,通过中断用数码管显示相应信息或执行一个任务,当来6个脉冲时,又显示另外的信息或执行另一个任务,计数具备清零,发现中断时,有相应信息提示。
设计任意流水灯电路,实现两种以上方式的流水灯效果,通过按键切换或者自动切换。
一、实验一
1.protues仿真
2.程序
#include <reg51.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit led1=P3^0;
sbit led2=P1^0;
sbit k0=P3^2; //定义按键K3
#define smg P2
u8 tab[]= //段码表
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//0, 1, 2, 3, 4, 5, 6, 7, 8, 9,这是共阴极数码管0-9的段码
int count0,count1;
//定时器0溢出中断程序
void timer0() interrupt 1 //定时器0中断标志位为1
{
//重新装载定时器0计数初值
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(count0==20) //T0*10=1s LED1闪烁
{
led1=~led1;
count0=0;
}
count0++;
}
//定时器1溢出中断程序
void timer1() interrupt 3 //定时器1中断标志位为3
{
//重新装载定时器1计数初值
TH1=(65536-25000)/256;
TL1=(65536-25000)%256;
count1++;
if(count1==40) //T1*10=0.5s LED2闪烁 20为2秒
{
led2=~led2;
//count1=0;
}
if(count1==120*3) //为6秒
{
smg = tab[6];
//count1 = 0;
}
}
int main()
{
EA=1; //全局中断使能
ET0=1; //定时器0溢出中断使能
ET1=1; //定时器1溢出中断使能
TR0=1; //定时器0使能
TR1=1; //定时器1使能
TMOD=0x11; //00010001B,定时器0、1使用工作方式1,16位定时器
//装载定时器0计数初值
TH0=(65536-50000)/256; //内置时钟频率为6MHz,定时器0计数50000次,计数初值为15536转为16进制
TL0=(65536-50000)%256; //机械周期为2us,T0=(65536-计数初值)*2us=0.1s
//装载定时器1计数初值
TH1=(65536-25000)/256; //内置时钟频率为6MHz,定时器0计数25000次,计数初值为40536转为16进制
TL1=(65536-25000)%256; //机械周期为2us,T1=(65536-计数初值)*2us=0.05s
led1=0; //控制P3.0
led2=0; //控制P1.0
while(1)
{
}
}
二、实验二
1.protues仿真
2.程序
#include<reg51.h>
#include<intrins.h>
#define led P2
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//延迟函数
void delay(){
u16 a, b;
for(a = 0; a < 400; a++)
for(b = 0; b < 400; b++);
}
// LED点亮方式:依次点亮(一次一个,循环三次)
void yici(){
char i, j;
for(j = 0; j < 1; j++){
led = 0xfe;
for(i = 0; i < 7; i++){
led = _cror_(led, 1);
delay();
}
led = 0x7f;
for(i = 0; i < 7; i++){
led = _crol_(led, 1);
delay();
}
}
}
// 从两边到中间
char toMiddle[] = {0x7e, 0xbd, 0xdb, 0xe7, 0xdb, 0xbd, 0x7e};//LED灯点亮方式
void bianToMiddle(){
char i, j;
for(j = 0; j < 1; j++){//循环三遍
for(i = 0; i < 7; i++){//LED点亮方式:从两边到中间
led = toMiddle[i];
delay();
}
}
}
//由上向下依次点亮LED灯
char toBottom[] = {0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};
void topToBottom(){
char i, j;
for(j = 0; j < 1; j++){
led = 0xff;
for(i = 0; i < 8; i++){
led = led << 1;
delay();
}
for(i = 6; i >= 0; i--){
led = toBottom[i];
delay();
}
}
}
void main(){
while(1){
yici(); //LED灯依次亮
bianToMiddle();//LED灯从两边向中间逐次点亮
led = 0xff; //关闭LED灯
topToBottom();//由上向下依次点亮LED灯
}
}
总结
大佬可以支持一下: