写一个设单片机的晶振位 12MHz。将 K1 连接到 P3.2 引脚,将 LED1 连接 到 P1.1,LED2 连接到 P1.2,LED3 连接到 P1.3。并且实现如下功能: 1、LED1 每 40ms 闪烁一次; 2、LED2 在外部按键中断发生以后,亮 0.5 秒,然后熄灭; 3、LED3 在 LED2 熄灭以后以 20Hz 的频率闪烁 20 次然后熄灭; 4、将 LED 的亮灭情况实时通过串口输出;实验的200字心得体会
时间: 2024-01-08 16:02:28 浏览: 63
两个80c51单片机通信;单片机一控制两位按键从而控制单片机二的两位数码管加一和减一
代码如下:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit K1=P3^2;
uchar Count = 0;
uchar LED2_Flag = 0;
uchar LED3_Count = 0;
uchar LED3_Flag = 0;
void Init();
void LED1_Blink();
void LED2_Control();
void LED3_Blink();
void Send_Data(uchar dat);
void main()
{
Init();
while(1) {
LED1_Blink();
LED2_Control();
LED3_Blink();
Send_Data(P1);
}
}
void Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x67;
EA = 1;
ET0 = 1;
TR0 = 1;
ES = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
}
void LED1_Blink()
{
if(Count == 5) {
Count = 0;
LED1 = ~LED1;
}
}
void LED2_Control()
{
if(K1 == 0 && LED2_Flag == 0) {
LED2_Flag = 1;
LED2 = 1;
}
if(LED2_Flag == 1) {
Count++;
if(Count == 10) {
Count = 0;
LED2 = 0;
LED2_Flag = 0;
}
}
}
void LED3_Blink()
{
if(LED2_Flag == 0 && LED3_Flag == 0) {
LED3_Count++;
if(LED3_Count == 5) {
LED3_Count = 0;
LED3_Flag = 1;
}
}
if(LED3_Flag == 1) {
Count++;
if(Count == 5) {
Count = 0;
LED3 = ~LED3;
LED3_Count++;
if(LED3_Count == 20) {
LED3_Count = 0;
LED3_Flag = 0;
}
}
}
}
void Send_Data(uchar dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void Timer0() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67;
Count++;
}
void UART() interrupt 4
{
if(RI) {
RI = 0;
}
if(TI) {
TI = 0;
}
}
```
实验心得:
本次实验是一个比较全面的综合性实验,需要我们综合运用到了单片机的定时器、外部中断、串口通信等知识点。
在编写代码的过程中,需要我们分析每个 LED 的控制方式和亮灭时间,结合定时器的中断时间,来实现各个 LED 的控制。
在实验的过程中,我遇到了很多问题,例如串口通信时发送数据时需要等待 TI 标志位置位,否则会导致数据发送错误;LED2 控制时需要注意按键的抖动问题,需要通过中断标志位来控制 LED2 的亮灭等等。
通过这次实验,我深入了解了单片机的定时器、外部中断、串口通信等知识点,提高了编程能力和解决问题的能力。
阅读全文