单片机芯片型号 STC89C516
需求
需要的知识
关于串口通信与系统中断,请看
串口通信
系统中断
或者这个专辑
链接
这位大佬更专业
硬件设计
关于1,详见本篇的三
关于2,只需和电脑链接就可以
软件设计
pc>>单片机 数码管显示
#include "reg52.h"
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 i;
/*******************************************************************************
* 函数名 :UsartInit()
* 函数功能 :设置串口
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
UsartInit(); // 串口初始化
while(1);
}
/*******************************************************************************
* 函数名 : Usart() interrupt 4
* 函数功能 : 串口通信中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Usart() interrupt 4
{
i=SBUF;//出去接收到的数据
switch(i)
{
case '0':P0=~smgduan[0];;break;
case '1':P0=~smgduan[1];;break;
case '2':P0=~smgduan[2];;break;
case '3':P0=~smgduan[3];;break;
case '4':P0=~smgduan[4];;break;
case '5':P0=~smgduan[5];;break;
case '6':P0=~smgduan[6];;break;
case '7':P0=~smgduan[7];;break;
case '8':P0=~smgduan[8];;break;
case '9':P0=~smgduan[9];;break;
case 'a':P0=~smgduan[10];;break;
case 'b':P0=~smgduan[11];;break;
case 'c':P0=~smgduan[12];;break;
case 'd':P0=~smgduan[13];;break;
case 'e':P0=~smgduan[14];;break;
case 'f':P0=~smgduan[15];;break;
}
RI = 0;
}
单片机>>pc 发送hello world
#include "reg52.h"
#include<stdio.h>
#include <intrins.h>//使用延时函数需要加这个头文件
typedef unsigned int u16;
void Delay1000ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 154;
k = 122;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u16 i;
i = 0;
UsartInit();
while(1){
i++;
TI=1; //printf将T1置为1
printf("%d Hello Worid!\n", i);
Delay1000ms();
while(!TI);
TI=0;}
}
效果
1.
2.