找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3159|回复: 1
收起左侧

单片机中断,定时器,串行口通信实验指导(附经过测试的参考电路图与源代码)

[复制链接]
ID:267855 发表于 2017-12-27 17:28 | 显示全部楼层 |阅读模式
初接触单片机,老师给的单片机实验,可以练练手。

调整一下实验内容,具体情况如下:
第一次流水灯实验不变,采用第一次试验课内容。
其余三次实验现分别确定为中断实验、定时器实验和串行通信实验,这三次实验推荐分别采用如下三个(列出的电路图和源代码老师都自己全程测试过,没有问题);如果想在“中断实验、定时器实验和串行通信实验”框架下选择其他具体实验内容也可以,注意把题目要求等都写清楚。

二、中断实验
中断扫描法行列式键盘
1)实验要求
利用中断扫描法实现4*4行列式键盘,并利用1位共阴极数码管进行显示。要求开机后数码管暂时为黑屏状态,按下任意键后,显示该键的键值字符(0—F)。若没有新键按下,则维持前次按键结果。
2)参考电路图
0.png 0.jpg

3)参考源程序
#include <reg51.h>
char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};  //led字模
char key_buf[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};  //键值

void getKey() interrupt 0         //中断函数
{
  char key_scan[]={0xef,0xdf,0xbf,0x7f};    //键扫描码
  char i=0,j=0;
  for(i=0;i<4;i++)
     {
       P2=key_scan[ i];            //输出扫描码
       for(j=0;j<16;j++)
       {
            if(key_buf[j] == P2)       //读键值,判断键号
           {
              P0=led_mod[j];       //显示闭合键键号
              break;
           }
       }
     }
     P2=0x0f;
}

void main(void)
{
    P0=0x00;       //开机黑屏
    IT0=1;          //脉冲触发
    EX0=1;          //INT0允许
    EA=1;           //总中断允许
    P2=0x0f;      //为首次中断做准备,列线全为0,行线全为1
    while(1);       //模拟其它程序功能
}

三、定时器实验
对流水灯进行定时中断控制
1)实验要求
采用定时中断方法实现流水灯的控制功能。要求流水灯的闪烁速率约为每秒一次。
2)参考电路图
0.jpg
3)参考源程序
#include <reg51.h>
#define uchar unsigned char
bit ldelay=0;
uchar t=0;
void main()
{
    uchar code ledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
    uchar ledi;
    TMOD=0x01;
    TH0=0x3c;
    TL0=0xb0;
    TR0=1;
    ET0=1;
    EA=1;
    while(1){
        if(ldelay) {
            ldelay=0;
            P2=ledp[ledi];
            ledi++;
            if(ledi==8) ledi=0;
        }
    }
}

timer0() interrupt 1{
    t++;
    if(t==20) {t=0;ldelay=1;}
    TH0=0x3c;TL0=0xb0;
}

四、串行口通信实验
2只单片机的串口方式1通信
1)实验要求
两只51单片机进行串口方式1通信,其中两机fosc约为12MHz,波特率约为2.4kbps。甲机循环发送数字0-F,并根据乙机的返回值决定发送新数(返回值与发送值相同时)或重复当前数(返回值与发送值不同时);乙机接收数据后直接返回接收值;双机都将当前值以十进制形式显示在各机的共阴极数码管上。
2)参考电路图
0.jpg
3)参考源程序
发送程序:
#include <reg51.h>
#define uchar unsigned char
char code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void delay(unsigned int time)
{
     unsigned int j=0;
    for(;time>0;time--)
        for(j=0;j<125;j++);
}

void main(void)
{
     uchar counter=0;
    TMOD=0x20;
    TH1=TL1=0xf4;
    PCON=0;
    SCON=0x50;
    TR1=1;
    while(1)
    {
        SBUF=counter;
        while(TI==0);
        TI=0;
        while(RI==0);
        RI=0;
        if(SBUF==counter)
        {
            P2=map[counter];
            if(++counter>9) counter=0;
            delay(500);
        }
    }
}

接收程序:
#include <reg51.h>
#define uchar unsigned char
char code map[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void delay(unsigned int time)
{
     unsigned int j=0;
    for(;time>0;time--)
        for(j=0;j<125;j++);
}

void main(void)
{
     uchar counter=0;
    TMOD=0x20;
    TH1=TL1=0xf4;
    PCON=0;
    SCON=0x50;
    TR1=1;
    while(1)
    {
        SBUF=counter;
        while(TI==0);
        TI=0;
        while(RI==0);
        RI=0;
        if(SBUF==counter)
        {
            P2=map[counter];
            if(++counter>9) counter=0;
            delay(1000);
        }
    }
}

完整的Word格式文档51黑下载地址:
单片机后三次实验调整情况说明(附经过测试的参考电路图与源代码).doc (112 KB, 下载次数: 13)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:12060 发表于 2018-1-8 16:44 | 显示全部楼层
很好的,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表