![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
8051单片机
好梦成真Kevin
Never ever give up.
展开
-
proteus7.7+Keil2仿真80C51控制路口信号灯(带左转信号灯)
要想设计带左转信号的路口信号灯, 就必须先将圆饼信号灯的控制逻辑理解透彻. 在本例的设计过程中, 我设计了本路口的信号控制逻辑: 南北直行放行 -> 东西直行放行 -> 南北左转放行 -> 东西左转放行, 若不考虑数码管的显示问题, 则只需对圆饼信号灯的控制程序稍加修改即可. 但在实际应用中, 大部分的路口都配备了数字显示数码管, 用于显示直行方...原创 2019-12-16 09:30:05 · 968 阅读 · 0 评论 -
proteus7.7+Keil2仿真80C51控制路口信号灯(无绿灯倒计时+绿灯倒计时)
本例的控制程序未使用80C51的(定时器)中断功能, 而是以for循环作为延时函数, 以粗略提供0.5s和1s的时延. 本例的控制逻辑为①南北方向圆饼灯为红灯时, 南北方向车辆停止在停车线内等待. ②南北方向圆饼灯为绿灯时, 南北方向车辆(直行和左转)同时放行. ③东西方向圆饼灯为红灯时, 东西方向车辆停止在停车线内等待. ④东西方向圆饼灯为绿灯时, 东西方向车辆...原创 2019-12-14 20:48:30 · 978 阅读 · 0 评论 -
proteus7.7+Keil2仿真80C51控制流水灯
在今年夏天发布的关于8051的诸多博文中, 我都是用STC89C52RC实验箱来验证8051控制程序的正确性的. 这样做的好处是可以直接和真正的8051单片机打交道, 且能熟练掌握将.hex文件烧写到8051程序存储器的步骤. 但凡事都不是绝对的. 若总是用实物来进行实验, 我们每修改一次控制程序, 就要重新烧写一次.hex文件: 在使用软件烧写的过程中, 有...原创 2019-12-14 11:05:02 · 2343 阅读 · 1 评论 -
基于8051实现的双倒计时器(Version1.0)
程序实现的功能:1. 实验箱上电后, 两倒计时器都不显示, 且都处于暂停状态.2. 向8051发送"Show countdown 1st.E"后, 第一个倒计时器显示秒数(初始为0, 然后从15开始倒计时).3. 向8051发送"Show countdown 2nd.E"后, 第二个倒计时器显示秒数(初始为0, 然后从25开始倒计时).4. 向8051发送"Start count...原创 2019-07-16 18:12:38 · 286 阅读 · 0 评论 -
可显示或隐藏秒数的两不同周期倒计时器(基于8051)
程序实现的功能:1. 实验箱上电后, 两计时器即开始计时, 但不显示.2. 若向8051发送"显示秒数"命令, 则指定的某个倒计时器显示秒数.3. 若向8051发送"隐藏秒数"命令, 则指定的某个倒计时器隐藏秒数.#include <STC89C5xRC.H>#include <string.h>unsigned char code DIG_C...原创 2019-07-16 16:35:20 · 213 阅读 · 0 评论 -
8051单片机(STC89C52)实现可修改初值(并可命令启停)的单倒计时器(Version1.2)
较Version1.1, 此处通过string.h文件中的strcmp()函数简化了对简单命令的判断.#include <STC89C5xRC.H>#include <string.h>unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f...原创 2019-07-16 10:25:07 · 460 阅读 · 0 评论 -
8051单片机(STC89C52)串口接收字符并将其ASCII码(小于100)显示在数码管上
#include <STC89C5xRC.H>unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};char buf;void delay()//提供时延{ int i, j; for(i = 0; i < 15; i ++)...原创 2019-07-11 21:18:04 · 3045 阅读 · 2 评论 -
8051单片机(STC89C52)以轮询方式实现串口通信(51接收数据后发送回PC端)
#include <STC89C5xRC.H>int main(){ char buf; TMOD = 0x21; //设定timer1的工作模式 SCON = 0x50; //设置串行通信格式 TH1 = 0xE6; //设定timer1的初始值 TL1 = 0xE6; TR1 = 1; //开启timer1 while(1) { if(RI == 1)...原创 2019-07-11 20:42:02 · 2690 阅读 · 0 评论 -
8051单片机(STC89C52)实现可修改初值(并可命令启停)的单倒计时器(Version1.1)
程序实现功能:1. 通过串口发送"Start.E"命令启动设备.2. 通过串口发送"Stop.E"命令暂停设备.3. 通过串口发送"Set init value as 12.E"(命令中的数字可以以两位数方式随意给定)设定下次计时开始初值.注: 为了避免启动设备后第一次计时无法按照用户的意愿进行这一问题, 启动设备后第一次计时先显示0(耗费1s), 之后按照用户给定的值进行倒计时...原创 2019-07-16 10:07:24 · 543 阅读 · 0 评论 -
对8051两个定时器(timer0和timer1)的使用解析
1.如何使用8051单片机内部的定时器timer0?#include<STC89C5xRC.h>void delay(int n){ int i; TMOD=0x01;//16bits for(i=0;i<n;i++) { TH0=0x3C; TL0=0xB0;...原创 2019-07-06 15:54:43 · 5216 阅读 · 0 评论 -
基于8051实现的倒计时器(最后3s闪烁)
最后3s的闪烁是依靠变量t来实现的. t将倒计时的26s(0 ~ 25为26s)等分成2600个10ms区间, 当t的值小于300时, 1000ms的区间被分成 "500ms刷新数字 + 500ms不显示数字".#include <STC89C5xRC.H>unsigned char code DIG_CODE[10] = {0x3f,...原创 2019-07-19 08:26:14 · 516 阅读 · 0 评论 -
8051单片机(STC89C52)之蜂鸣器发声
通过语句"sbit beep = P1 ^ 5"来指明蜂鸣器的驱动口: 当beep = 0时, 蜂鸣器不发生; 当beep = 1时, 蜂鸣器发声. 另外可通过改变驱动口电平翻转的时间来获得不同声调的声音, 还可通过改变高低电平在一个周期内的比例来获取不同音量的声音.源代码:#include <STC89C5xRC.H>int tcount = 0;sb...原创 2019-07-19 10:04:05 · 6578 阅读 · 0 评论 -
8051外部中断1解析
程序实现的功能:在实验板上左下方有一个黑色的独立按键(K4), 当我们按下它时, D1(LED灯)的状态就会取反.(外部中断1和外部中断0在处理上类似, 红色的部分为不同之处)中断处理程序标号:外部中断0 -----------> 0定时器0中断 -----------> 1外部中断1 -----------&...原创 2019-07-23 10:41:21 · 2552 阅读 · 0 评论 -
8051外部中断0解析
程序实现功能:在实验板上左下方有一个黑色的独立按键(K3), 当我们按下它时, D1(LED灯)的状态就会取反.思路分析:我们令IT0 = 1, 即选择了"边沿触发", 所以每当独立按键按下时, 中断处理函数EX_INT0()就会执行.当进入中断处理函数执行时, 若P32引脚的电平为低电平, 则说明K3按键已按下; 若P32引脚的电平为高电平, 说明K3按键已抬起."低电平触...原创 2019-07-23 10:23:44 · 2427 阅读 · 0 评论 -
基于8051实现的可启停/显示或隐藏时间/设定当前时间的电子时钟(Version1.3 the final)
程序实现的功能:1. 实验箱上电后, 不显示当前时间.2. 向8051发送"Show.E"后, 显示当前时间.3. 向8051发送"Hide.E"后, 隐藏当前时间.4. 向8051发送"Start.E"后, 时钟开始计时.5. 向8051发送"Stop.E"后, 时钟停止计时(若当前处于"Show"状态, 则显示停止计时前的时间).6.向8051发送"hour:minu...原创 2019-07-17 16:06:35 · 167 阅读 · 0 评论 -
基于8051实现的可启停/显示或隐藏时间的电子时钟(Version1.2)
程序实现的功能:1. 实验箱上电后, 不显示当前时间.2. 向8051发送"Show.E"后, 显示当前时间.3. 向8051发送"Hide.E"后, 隐藏当前时间.4. 向8051发送"Start.E"后, 时钟开始计时.5. 向8051发送"Stop.E"后, 时钟停止计时(若当前处于"Show"状态, 则显示停止计时前的时间).#include <STC89...原创 2019-07-17 15:35:05 · 195 阅读 · 0 评论 -
基于8051实现的电子时钟(Version1.1)
程序实现的功能:1. 实验箱上电后, 不显示当前时间.2. 向8051发送"Start.E"后, 电子时钟开始工作, 并显示当前时间(时 分 秒).3. 向8051发送"Stop.E"后, 电子时钟暂停工作, 并隐藏当前时间.#include <STC89C5xRC.H>#include <string.h>unsigned char code ...原创 2019-07-17 11:20:57 · 633 阅读 · 0 评论 -
基于8051实现的电子时钟(Version1.0)
本程序实现了基本的电子时钟功能, 初始时间为23:59:55.#include <STC89C5xRC.H>unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//对应数码管显示0~9int tcount = 0;//记录经过的2ms...原创 2019-07-17 10:49:26 · 319 阅读 · 0 评论 -
基于8051实现的双倒计时器(Version1.1)
Version1.1较Version1.0功能更加完善.程序实现的功能:1. 实验箱上电后, 两倒计时器都不显示, 且都处于暂停状态.2. 向8051发送"Show countdown 1st.E"后, 第一个倒计时器显示秒数(初始为0, 然后从15开始倒计时).3. 向8051发送"Show countdown 2nd.E"后, 第二个倒计时器显示秒数(初始为0, 然后从25开...原创 2019-07-17 09:39:33 · 169 阅读 · 0 评论 -
改变高低电平占空比的一种方式
通过查阅资料, 我们可以得知, 通过改变输出电平的高低电平占空比, 可以控制蜂鸣器发声的声音大小.要想使得改变占空比变得更为容易, 则采用下述方式来获取时延: 这样一来, 通过改变两个时延函数的所占时间即可实现对高低电平占空比的改变. 比如, delay_low()中需要执行10000次";"语句, delay_high()中也需要执行10000次";"语句, 这样一个完整的周期就为10000...原创 2019-07-19 11:03:55 · 4143 阅读 · 0 评论 -
8051单片机(STC89C52)之改变蜂鸣器发声频率
由于定时器0的中断处理程序为50ms触发一次, 故改变tcount归零时的临界值即可改变蜂鸣器发声的频率.当tcount = 40 进行电平翻转时, 发出的声音类似于公交车转向灯开启时的效果声音.当tcount = 10 进行电平翻转时, 发出的声音类似于倒计时秒表的哒哒声.当tcount = 5 进行电平翻转时, 发出的声音比tcount = 10进行翻转时更加急促.#in...原创 2019-07-19 10:35:48 · 8247 阅读 · 0 评论 -
8051单片机(STC89C52)实现可修改计时初值的单倒计时器(Version1.0)
程序启动后计时初值为15, 之后可通过串口发来的数据(如"99")来修改下一次计时初值.#include <STC89C5xRC.H>unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//对应数码管显示0~9 char buf[2...原创 2019-07-15 18:15:49 · 620 阅读 · 0 评论 -
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
相较单倒计时器对timer0初值的设定, 此处将中断处理程序触发时间间隔改为5ms, 目的是给人在视觉上以更好的体验(设定为10ms会明显感觉到闪烁).#include <STC89C5xRC.H>unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, ...原创 2019-07-15 17:25:11 · 797 阅读 · 0 评论 -
8051单片机(STC89C52)八段数码管稳定显示0 ~ 7
在轮流显示0~7程序的基础上, 将delay()函数提供的时延大幅缩小, 以达到视觉短暂的停留效果. 在该种情况下的数码管亮度和对比度较轮流显示时有一定幅度的降低. 另外, 如果想感知到动态扫描的存在, 可从拍摄视频中观察(到像波浪一样的光浪).#include <STC89C5xRC.H>void delay()//提供时延{ int i, j; for(i = 0...原创 2019-07-08 12:02:19 · 2866 阅读 · 0 评论 -
8051单片机(STC89C52)八段数码管轮流显示0~7
在8个数码管上自右开始, 轮流显示 0 ~ 7.#include <STC89C5xRC.H>void delay()//提供时延{ int i, j; for(i = 0; i < 300 ; i++) for(j = 0; j < 300; j++) ;}void f1_3_4_3()//在8个数码管上轮流显示0~7{ unsigned c...原创 2019-07-08 10:48:27 · 3756 阅读 · 0 评论 -
8051单片机(STC89C52)八段数码管静态点亮
在STC89C52的左上角, 有八个八段数码管. 在控制数码管点亮的过程中, 某一时刻只能根据P24 P23 P22三个引脚的高低电平情况(3-8译码器的三个输入)点亮一个数字. 这里(P24, P23, P22) = (0, 1, 1), 则从右数第四个数字亮. 再令P0 = 0x5b;//0101 1011, 则该位置显示数字"2". 补充说明一下P0给定数值与数码管引脚的对应情...原创 2019-07-08 09:32:18 · 3116 阅读 · 0 评论 -
带有Start/Reset/Stop/Rotate/Main motor runs命令的二自由度自动进样器(Version1.0)
#include <STC89C5xRC.h>char tcount = 0;char step = 0;//记录主电机走过的步数(走过的步数=step/2)char buf[30];//存放命令int en = 0;//en = 1 -> 系统工作, en = 0 -> 系统停止int k = 0;int len = 0;int re = 0;//复位信号...原创 2019-06-26 22:03:14 · 802 阅读 · 0 评论 -
带复杂命令启停功能的二自由度自动进样器
给8051发送"Start.E"后, 系统开始工作; 发送"Stop.E"后, 系统停止工作.与之前以串口中断为主线的控制逻辑不同, 这里以定时器0中断为主线(其实也就是以系统序列动作为主线), 并提高了串口中断的优先级(以实时响应命令).#include <STC89C5xRC.h>char tcount = 0;char step = 0;//记录主电机走过的步数(走过...原创 2019-06-26 10:09:20 · 290 阅读 · 0 评论 -
以串口中断为主线的二自由度自动进样器控制(有一定问题)(程序架构不可取, 只供研究)
我的本意是当输入"Start.E"后系统开启工作, 此时输入"Stop.E"后系统停止工作. 可实际上系统无法停止工作. 对于这其中的原因, 我也做了一定量的实验, 分析得出, 问题出在变量en上, 但是我还没找到方法去解决它. 还请各位大牛帮忙解决, 万分感谢.#include <STC89C5xRC.H>char buf[30];//存放串口传来的数据int steps...原创 2019-06-25 21:02:52 · 169 阅读 · 0 评论 -
带命令启动功能的二自由度自动进样器(2019.6.26修改完毕)
上位机发出'1'命令, 系统开始工作. 但发出'0'命令后, 系统并未停止工作.这里我想通过改变IE的值(0x92/0x90), 来控制timer0中断的屏蔽与否, 继而实现系统停止功能.#include <STC89C5xRC.h>char tcount = 0;char step = 0;//记录主电机走过的步数(走过的步数=step/2)char buf;//存放命...原创 2019-06-25 20:54:02 · 279 阅读 · 0 评论 -
二自由度自动进样器动作序列实现
本程序的实现是基于虚拟接口卡和8051单片机的. 通过对8051部分引脚的操作, 以合适的逻辑序列, 实现了 主转盘步进电机走8步 -> 针臂落下 -> 针臂在底部停留片刻 -> 针臂抬起至最高位 -> 主转盘步进电机走8步 这样的循环操作. 日后我会在此基础上加入上位机发送信号控制系统工作的部分.#include <STC89C5...原创 2019-06-25 19:54:25 · 480 阅读 · 0 评论 -
分别以轮询方式和中断处理方式实现8051的串口通信
#include <STC89C5xRC.H>//之前用轮询方式实现了串口的通讯,这里使用前后台系统结架构实现功能int s;void UART_INT() interrupt 4//UART中断处理程序{ if(RI == 1)//如果收到数据 { RI = 0; s = SBUF;//将收到的数据读取出来 ...原创 2019-06-25 17:40:26 · 1290 阅读 · 0 评论 -
8051单片机(STC89C52)八个LED灯闪烁
#include<STC89C5xRC.h>void delay(){ int i,j; for(i=0;i<200;i++) for(j=0;j<=200;j++) { ; }}int main(){ while(1) { ...原创 2019-07-12 21:54:24 · 10340 阅读 · 1 评论 -
8051单片机(STC89C52)八灯流动转向
#include<STC89C5xRC.h>void delay(){ int i,j; for(i=0;i<120;i++) for(j=0;j<120;j++) { ; }}int main(){ int i; while(1) { i=...原创 2019-07-12 22:06:35 · 242 阅读 · 0 评论 -
8051单片机(STC89C52)以定时器中断模式实现倒计时器
之前用轮询方式实现了定时器精准定时, 这里用前后台系统架构实现倒计时器. 每10ms都会触发一次中断处理程序T0_INT(), 根据tcount的值, 决定显示个位数字还是十位数字: 当tcount = 100时, 将tcount置回初始值0, 并将sec的值减1. 当sec的值减到-1时, 将sec重新置回15.#include <STC89C5...原创 2019-07-15 17:07:10 · 3801 阅读 · 1 评论 -
8051单片机(STC89C52)以轮询方式实现串行通信
8051向笔记本电脑发送0 ~ 15, 且本次发送和前一次发送间间隔一小段时间.#include <STC89C5xRC.H>void delay(){ int i, j; for(i = 0; i < 300; i++) for(j = 0; j < 300; j++) ;}void send(){ int i; for(i = 0...原创 2019-07-11 10:23:41 · 624 阅读 · 0 评论 -
8051单片机串行通信参数设置(8位UART+timer1 8位自动重装)
原创 2019-07-11 09:15:38 · 1296 阅读 · 0 评论 -
二自由度自动进样检测器控制(Version 1.1)
较Version 1.0, 增加了对针臂步进电机、针臂停留底部时间的控制模块, 可通过给定参数以定量方式控制针臂抬起落下的速度或控制针臂在底部停留的时间.硬件搭建:8051单片机(STC89C52RC) + 若干杜邦线 + 虚拟接口卡 + 虚拟接口卡专用USB线 + 8051专用USB线.连线对接:P1.0 -> P20P1.1 -> P21P1.2 ->...原创 2019-06-30 12:37:04 · 325 阅读 · 0 评论 -
8051单片机(STC89C52)两个倒计时器异步计数
#include <STC89C5xRC.H>void delay()//用定时器0实现5ms精准定时{ TMOD = 0x01; TH0 = 0xEA; TL0 = 0x84;//65536 - 5000 = 60036 TF0 = 0;//置溢出标志位为0 TR0 = 1;//开启定时器0 while(TF0 == 0); TR0 = 0;...原创 2019-07-10 09:43:54 · 540 阅读 · 0 评论 -
8051单片机(STC89C52)两个倒计时器同步计数
此处需要定时器0提供5ms精准定时, 则每个定时周期都需要(5*10^-3)/(1*10^-6)=5000次加1计数, 所以这里定时器0的初始值设为65536 - 5000 = 60536 = EA84H. 这里先实现两个倒计时器同时工作, 下一步该考虑怎么实现两个倒计时器不同步工作.#include <STC89C5xRC.H>v...原创 2019-07-10 09:25:58 · 1231 阅读 · 0 评论