STC51单片机实现报警亮灯中断等多功能

举报
永不言弃 发表于 2022/02/27 15:56:01 2022/02/27
【摘要】 STC51单片机实现报警亮灯中断定时等多功能

#include <reg52.h>
#include "intrins.h"//调用crol cror 函数
#define led P1
sbit L0=P1^0;
sbit L1=P1^1;
sbit L2=P1^2;
sbit L3=P1^3;
sbit L4=P1^4;
sbit K1=P3^0;//按键 K1.2.3.4
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
sbit A=P2^0;//段选
sbit G=P2^1;//位选
sbit C=P2^2;//点阵
sbit D=P2^3;//蜂鸣器
sbit E=P2^5;//液晶
sbit F=P2^7;//时钟使能端
void delay(int z)
{
    int x,y;
    
    for(x=100;x>0;x--)
            for(y=z;y>0;y--);
} //延迟函数

    //串口通信函数
void UsartInit()
{
    SCON=0X50;            //设置工作方式1
    TMOD=0X20;            //设置计数器工作方式2
    PCON=0X80;            
    TH1=0XF3;                //计数器初始值设置
    TL1=0XF3;
    ES=1;                        //打开接收中断
    EA=1;                        //打开总中断
    TR1=1;                    //打开计数器
}
void main()
{int i;
    char temp;
    //流水灯
    led=0xfe;
    delay(500);
    {  
        for(i=0;i<7;i++)
        {
        led=_crol_(led,1);//依次向左进1位
            delay(500);
        
        }
        for(i=0;i<7;i++)
        {
        led=_cror_(led,1);//向右进1位
            delay(500);
        }
        }
    //蜂鸣器

    D=0; //开
    delay(500);
    D=1;//关
    delay(500);
    
    //数码管
C=0;//关闭共用P2的其他引脚
    D=1;
    E=0;
    F=0;
    
        A=1;//段选
    P0=0X3F;//选择可以表示的字符0(共阴)
    A=0;
    P0=0XFF;
        G=1;//位选
        P0=0XFE;//选择数码管的第一位
        G=0;
        delay(500);
        A=1;//段选
    P0=0X06;//数码管第二位
    A=0;
    P0=0XFF;
        G=1;//位选
        P0=0XFD;//选择可以表示的字符1
        G=0;
        delay(500);
        A=1;//段选
    P0=0X06;//选择可以表示的字符1
    A=0;
    P0=0XFF;
        G=1;//位选
        P0=0XFB;//数码管第三位
        G=0;
        delay(500);
    

    
        led=0xFF;//中断
EA=1; //打开总中断允许位
        EX0=1;  //打开外部中断使能位
    //默认电平触发
    
        led=0XFF;
        
        
//定时器

    TMOD |=0X01;//按位或 选择定时器0
    TH0=0X00;//高八位 计数器赋值
    TL0=0X00;//低五位 高三位未用 默认都为0
    EA=1;//打开总中断
        
    ET0=1;//打开定时器0中断允许
        TR0=1;//定时器启动
        
    
while(1)
{//按键
    P1=0xff;
        L0=K1;//L0灯与K1状态相同(无防抖)
            L1=K2;//同上
                L2=K3;//同上
                    L3=K4;//同上
    //矩阵按键
    /*P3=0xfe; //1111 1110 P3.0排
    temp=P3; 
    temp=temp&0xf0; //11110000屏蔽其他排干扰
    while(temp!=0xf0) 
        
                {     temp=P3;
        switch(temp)   
        {    case 0xee:
            L0=0;   
        break;    
        case 0xde:
            L1=0;   
        break;    
        case 0xbe:
            L3=0;   
        break;   
        case 0x7e:
            L3=0;  
        break;   
        }  */
    }
//串口
    UsartInit(); 
}

}



void Usart() interrupt 4 //串口通信接收函数 4串行中断 1工作寄存器
{
    char receiveData;

    receiveData=SBUF;//接收到的数据
    RI = 0;//清除中断
    SBUF=receiveData;//将接收到的数据存入寄存器
    while(!TI);             //等待发送完成
    TI=0;                         //清楚发送数据
}

void Timer0_isr(void) interrupt 1 using 1 //定时器接收函数  1定时器0  1工作寄存器
    {
    TH0=0X00; //计时器赋值
    TL0=0X00;
        led=~led; //P1改变状态
    delay(500);
        TR0=0; //关闭定时器
}

void ISR_KEY(void) interrupt 0 using 1 //中断函数  0外部中0 1工作寄存器
{
led=0xfe;
        delay(500);
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。