从软件转硬件路总是很艰难,各种电路知识,3个多月了,现在总算是入门了。
AT 8051/2
1.驱动LED闪烁
2.驱动蜂鸣器进行响动
3.驱动共阳级,单数码管,0—9 变化(MPX1-CA) - 使用8排阻 + NPN三极管
4.驱动共阴级,但数码管,0-9 变化(MPX1-CC) - 使用芯片74HC245 + PNP三极管
5.独立按键,控制单片机,并点亮/熄灭LED
6.中断,控制点亮/熄灭LED - INT0 , INT1
7.定时中断,控制点亮/熄灭LED - T0 , T1
8.串口通信
电路图:
C代码:
/**
* 8051 DEMO 1
* 1.驱动LED闪烁
* 2.驱动蜂鸣器进行响动
* 3.驱动共阳级,单数码管,0—9 变化(MPX1-CA) - 使用8排阻 + NPN三极管
* 4.驱动共阴级,但数码管,0-9 变化(MPX1-CC) - 使用芯片74HC245 + PNP三极管
* 5.独立按键,控制单片机,并点亮/熄灭LED
*
* 8051 规定中断号如下
* INT0 中断号 0
* INT1 中断号 2
* T0 中断号 1
* T1 中断号 3
* 串口 中断号 4
*
* 6.中断,控制点亮/熄灭LED - INT0 , INT1
* 7.定时中断,控制点亮/熄灭LED - T0 , T1
* 8.串口通信
*/
#include "REG52.H"
#include "intrins.h"
//数据类型定义
typedef unsigned char U8;
//段选,显示0~9的值,共阳极
U8 code yang[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//段选,显示0~9的值,共阴极
U8 code yin[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//使用P2^0 进行LED闪烁
sbit led = P2^0;
//使用P2^1 进行蜂鸣器报警
sbit buz = P2^1;
//使用P2^2 控制,P0共阳极数码管进行片选
sbit ls1 = P2^2;
//使用P2^3 控制,P1 共阴级数码管进行片选
sbit ls2 = P2^3;
//使用P2^4 捕获按键状态,控制 P2^5 的LED
sbit btn = P2^4;
sbit btn_led = P2^5;
//使用P2^6 捕获按键状态,进行中断控制 P2^5 的LED
sbit btn2 = P2^6;
//使用P2^7 接入LED实现,定时器1秒控制LED闪烁
sbit timer_led = P2^7;
//延迟1秒
void delay1s() //误差 -0.000000000227us
{
U8 a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
//延迟 10ms
void delay10ms() //误差 -0.000000000002us
{
U8 a,b;
for(b=249;b>0;b--)
for(a=17;a>0;a--);
}
//按键按下,点亮或者熄灭LED
void btn_click()
{
if(btn==0){ //检查按键是否按下
delay10ms();
if(btn==0){ //再次检查是否按下
btn_led = !btn_led;
}
while (!btn);
}
}
/**
* INT0,INT1
* 中断方式,按键按下,点亮或者熄灭LED
*/
//初始化按钮2的中断,使用P3^2 INT0 中断实现
void btn2_init()
{
IT0 = 1; //下降沿 触发
EX0 = 1; //打开INT0的中断允许
EA = 1; //打开总中断
}
void btn2_start() interrupt 0
{
delay10ms();
if(btn2==0){
btn_led = !btn_led;
}
}
/**
* T0,T1
* 定时器中断,实现定时点亮或者熄灭LED
* 这里使用T0
*/
void timer_init()
{
TMOD = 0X01;
TH0 = (65536 - 10*1000) / 256;//(65536-X)为定时器初值,如定时10ms
TL0 = (65536 - 10*1000) % 256;
ET0 = 1; //打开定时器0 的中断
EA = 1; //打开总中断
TR0 = 1; //打开定时器0
}
void timer_start() interrupt 1
{
TH0 = (65536 - 100*1000) / 256;//(65536-X)为定时器初值,如定时100ms
TL0 = (65536 - 100*1000) % 256;
timer_led = !timer_led;
}
/**
* 串口通信
* RXD 和 TXD
* 接线方法为,RXD - TXD , TXD - RXD
* IO口:P3^0 和 P3^1
*/
void uart_init()
{
SCON = 0x50;
TMOD = 0x20;
//装在波特率 高8位和低8位,9600
TH1 = 0xFD;
TL1 = 0xFD;
ES = 1; //打开接收中断
TR1 = 1; //打开总中断
EA = 1; //打开总中断
}
//收串口数据
U8 uart_get()
{
U8 rx_data = 0;
while(0==RI); //0 串口没有数据
//如果是1
rx_data = SBUF;
RI=0;
return rx_data;
}
//发送一个字符
void uart_char(char data1)
{
SBUF = data1; //将待发送的字符串放入缓冲器
while(TI==0); //等待完发送
TI=0; // 发送中断标志 清0
}
//发送字符串
void uart_string(U8 *buffer)
{
U8 *plter = buffer;
while((*plter)!=0x00){
uart_char(*plter);
plter++;
}
}
void uart_start() interrupt 4
{
U8 rx_data = 0;
rx_data = uart_get();
uart_string("recv data : ");
uart_char(rx_data);
uart_string("rn");
}
//主函数执行
void main()
{
U8 i;
i = 0;
led = 0;
buz = 0;
ls1 = 1; //选用NPN型3级管,单片机给高电平导通
ls2 = 0; //选用PNP型3级管,单片机给低电平导通
btn_led = 1;//默认是关的
timer_led = 1; //默认不点亮
//开启中断监听
btn2_init();
//开启定时器监听
timer_init();
//初始化串口
uart_init();
while (1)
{
buz=!buz;
led=!led;
//独立按键检查
btn_click();
//> 9 重置为0
if(i>9){
i=0;
}
//进行片选
P0 = yang[i];
P1 = yin[i];
//延迟1秒
delay1s();
i = i+1;
//消隐 共阳数码管
P0 = 0xFF;
//消隐 共阴数码管
P1 = 0x00;
}
}
上一篇:8051/2单片机基础 实现开关,驱动2位的共阳极数码管显示小数,驱动喇叭播放音乐
下一篇:8051单片机串口波特率计算方式
推荐阅读最新更新时间:2024-11-11 10:22
设计资源 培训 开发板 精华推荐
- CY4541,基于 CCG4 双端口 Type-C 供电 (PD) 控制器的 EZ-PD CCG4 评估套件
- 使用 STMicroelectronics 的 L9929 的参考设计
- 具有关断功能的 LT1129CT-5 5V 低压差稳压器电源的典型应用电路
- M68xxx 数码相机单片机开发系统
- 带参考稳压器的 AZ432 PWM 转换器的典型应用
- NE555心形流水灯
- 典型应用图:I2C 总线模式下的 4 个 BTL,用于 TDF8530 I2C 总线控制的四通道 45W/2 个 D 类功率放大器,具有完整的诊断功能
- NCP1083QBCGEVB,高功率 PoE-PD 模块评估板
- AM2G-4824DH30Z ±24V 2 瓦 DC-DC 转换器的典型应用
- 使用 Analog Devices 的 LTC1315CG 的参考设计