1 定时器0、1

模块Time01.c 代码

#include <REGX52.H>#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1000个1ms是1s,10ms中断的话,1000改成100void Time0_init(void)       //1毫秒@11.0592MHz
{TMOD &= 0xF0;     //设置定时器016位模式TMOD |= 0x01;     //设置定时器0模式TL0 = T1MS;         //initial timer0 low byteTH0 = T1MS >> 8;    //initial timer0 high byteTF0 = 0;      //清除TF0标志ET0=1;EA=1;PT0=0;TR0 = 1;      //定时器0开始计时
}/* 主程序main.c代码
#include <REGX52.H>
#include "Time01.h"#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1000个1ms是1s,10ms中断的话,1000改成100void main()
{Time0_init();while(1){}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = T1MS;                     //reload timer0 low byteTH0 = T1MS >> 8;       //设置定时初始值T0Count++;if(T0Count>=1000){T0Count=0;P2=~P2;//执行代码}
}
//头文件Time01.h代码
#ifndef __TIME01_H__
#define __TIME01_H__void Time0_Init(void);#endif
*/

2 定时器2

模块Time2.c 代码

#include <REGX52.H>#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1000个1ms是1s,10ms中断的话,1000改成100void Time2_init()
{T2MOD = 0;        //初始化模式寄存器,16位重装T2CON = 0;RCAP2L = TL2 = T1MS;            //initial timer2 low byteRCAP2H = TH2 = T1MS >> 8;       //initial timer2 high byteET2 = 1;                        //enable timer2 interruptEA = 1;                         //open global interrupt switchTR2 = 1;                        //timer2 start running
}/* 主程序main.c代码
#include <REGX52.H>
#include "Time2.h"#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1000个1ms是1s,10ms中断的话,1000改成100void main()
{Time2_init();while(1){}
}void tm2_isr() interrupt 5
{static unsigned int count;TF2 = 0;if (count-- == 0)               //1ms * 1000 -> 1s{count = 1000;               //reset counterP2=~P2;//执行代码       }
}
//头文件Time2.h代码
#ifndef __TIME2_H__
#define __TIME2_H__void Time2_init();#endif
*/

3 定时器1串口

Time1Uart.c

#include <REGX52.H>void Time1Uart_Init()
{SCON=0x50;  //SM0 SM1为方式1,8位UART。REN为1,允许接收。TI RI为0PCON &= 0x80;  //SMOD保持不变为0,波特率不加倍。TMOD &= 0x0F;        //设置定时器1模式,不影响定时器0TMOD |= 0x20;     //设置定时器1,8位重装TL1 = 0xFA;        //设定定时初值 4800波特率,11.0592MHzTH1 = 0xFA;     //设定定时器重装值ET1 = 0;     //禁止定时器1中断TR1 = 1;     //启动定时器1EA=1;   //打开总中断ES=1;   //打开串口中断
}void Uart_SendByte(unsigned char Byte) //发送一字节
{SBUF=Byte;while(TI==0);TI=0;
}void Uart_SendString(char *s) //发送字符串,实参如"sun wen ping."
{while (*s)              //Check the end of the string{Uart_SendByte(*s++);  //Send current char and increment string ptr}
}/*
//main.c程序
#include <REGX52.H>
#include "Time1Uart.h"void main()
{Time1Uart_init();Uart_SendString("sun wen ping!");Uart_SendByte(0x66);while(1){}
}void UART_Routine() interrupt 4 // 函数名任意,interrupt 4 标明是串口中断处理程序
{if (RI)   //利用TI发送的程序,参见Time2Uart.c{RI = 0;             //Clear receive interrupt flagP2 = SBUF;          //P2 show UART data}
}
//头文件Time1Uart.h
#ifndef __TIME1UART_H__
#define __TIME1UART_H__void Time1Uart_Init();
void Uart_SendByte(unsigned char Byte);
void Uart_SendString(char *s);#endif
*/

4 定时器2串口

Time2Uart.c

#include <REGX52.H>
#include "intrins.h"#define FOSC 11059200L      //时钟频率
#define BAUD 4800       //UART 波特率#define NONE_PARITY     0   //无奇偶校验
#define ODD_PARITY      1   //奇校验
#define EVEN_PARITY     2   //偶校验
#define MARK_PARITY     3   //校验位始终为1
#define SPACE_PARITY    4   //校验位始终为0#define PARITYBIT NONE_PARITY   //测试奇偶校验bit busy;                   //发送忙标志void Time2Uart_init()
{#if (PARITYBIT == NONE_PARITY)SCON = 0x50;            //方式1 8位UART,波特率可变
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)SCON = 0xda;            //方式3,9位,波特率可变, 校验位置1,TI=1(开中断就中断一次)
#elif (PARITYBIT == SPACE_PARITY)SCON = 0xd2;            //方式3,9位,波特率可变, 校验位置0,TI=1
#endifTL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vauleTH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;T2CON = 0x34;           //T2作为串口发送接收波特率发生器,启动T2ES = 1;                 //Enable UART interruptEA = 1;                 //Open master interrupt switch
}void Uart_SendByte(unsigned char dat)
{while (busy);           //等待发送完ACC = dat;              //把字节放入寄存器ACC,其中的1的个数为奇数时 P置位 (PSW.0)if (P)                  //判断奇偶{#if (PARITYBIT == ODD_PARITY)TB8 = 0;            //Set parity bit to 0
#elif (PARITYBIT == EVEN_PARITY)TB8 = 1;            //Set parity bit to 1
#endif}else{#if (PARITYBIT == ODD_PARITY)TB8 = 1;            //Set parity bit to 1
#elif (PARITYBIT == EVEN_PARITY)TB8 = 0;            //Set parity bit to 0
#endif}busy = 1;SBUF = ACC;             //Send data to UART buffer
}void Uart_SendString(char *s)
{while (*s)              //Check the end of the string{Uart_SendByte(*s++);     //Send current char and increment string ptr}
}

main.c

#include <REGX52.H>
#include "Time2Uart.h"extern bit busy;void main()
{Time2Uart_init();Uart_SendString("sun wen ping!");Uart_SendByte(0x66);while(1){}
}void UART_Routine() interrupt 4 // 函数名任意,interrupt 4 标明是串口中断处理程序
{if (RI){RI = 0;             //Clear receive interrupt flagP2 = SBUF;          //P2 show UART dataP2_0 = RB8;         //P2.0 show parity bit}if (TI){TI = 0;             //Clear transmit interrupt flagbusy = 0;           //Clear transmit busy flag}
}

Time2Uart.h

#ifndef __T2UART_H__
#define __T2UART_H__void Time2Uart_init();
void Uart_SendByte(unsigned char dat);
void Uart_SendString(char *s);#endif

5 外部中断0、1(下降沿)

测试程序main.c

#include <REGX52.H>void main()
{INT0 = 1;            //P3_2(int0),P3_3(int1)) IT0 = 1;            //1:下降沿,0:低电平 EX0 = 1;                        //enable INT1 interruptEA = 1;                         //open global interrupt switchwhile(1);
}void exint1() interrupt 0           //int0:0,int1:2
{P2++;
}

6 T0、1下降沿计数中断

#include <REGX52.H>void t0int() interrupt 1           //(location at 000BH)
{P2++;
}void main()
{TMOD = 0x06;      //time0 计数模式,8位重装TL0 = TH0 = 0xff;   //有一个脉冲就中断TR0 = 1;           //timer0 start runET0 = 1;            //enable T0 interruptEA = 1;              //open global interrupt switchwhile (1);
}

7 掉电唤醒(INT0)

#include <REGX52.H>
#include "intrins.h"void exint0() interrupt 0           //(location at 0003H)
{}void main()
{IT0 = 1;                        //set INT0 int type (1:Falling 0:Low level)EX0 = 1;                        //enable INT0 interruptEA = 1;                         //open global interrupt switchwhile (1){INT0 = 1;                   //ready read INT0 portwhile (!INT0);              //check INT0_nop_();_nop_();PCON = 0x02;                //MCU power down_nop_();            //INT0中断后,先进入中断程序,返回后从这条语句开始执行_nop_();P2++;}
}

8 独立按键用定时器1ms中断扫描

TimeKey.c

#include <REGX52.H>unsigned char TimeKey_get_key()  //返回按键值1-4,无按键返回0
{unsigned char key=0;if(P3_1==0){key=1;} if(P3_0==0){key=2;}if(P3_2==0){key=3;}if(P3_3==0){key=4;}return key;
}
/*
void Timer0_Routine() interrupt 1 //定时器0 1ms中断一次
{static unsigned int T0Count;static unsigned char last_key,now_key;TL0 = T1MS;                     //reload timer0 low byteTH0 = T1MS >> 8;         //设置定时初始值T0Count++;if(T0Count>=20){T0Count=0;last_key=now_key;now_key=TimeKey_get_key();if(last_key==0 && now_key!=0)P2=now_key;//执行代码,只有上次无按键,这次有按键才动作}
}
*/

9 矩阵按键用定时器1ms中断扫描

TimeScanKey.c

#include <REGX52.H>#define GPIO_KEY P1 //P17-P14为行(P17在上),P13-P10为列(P13在左)/*** @brief  获取矩阵按键的值* @param  GPIO_KEY的四位用于键盘的行,另4位用于键盘的列* @retval 按键的值(0-15),无按键返回255*/
unsigned char TimeScanKey_getKey()
{unsigned char key=255; //无按键返回255GPIO_KEY = 0xf0; //四列置低if(GPIO_KEY!=0xf0) //有按键,高四位就不全为高电平{GPIO_KEY = 0xf0;      //先置列全为0switch(GPIO_KEY){case(0x70):key=0;break; //第一行有按键case(0xb0):key=4;break;case(0xd0):key=8;break;case(0xe0):key=12;break;}GPIO_KEY = 0x0f;      //再置行全为0switch(GPIO_KEY){case(0x07):key=key;break; //第一列有按键case(0x0b):key=key+1;break;case(0x0d):key=key+2;break;case(0x0e):key=key+3;break;}}return key;
}
/*
void Timer0_Routine() interrupt 1 //定时器0 1ms中断一次
{static unsigned int T0Count;static unsigned char last_key,now_key;TL0 = T1MS;                     //reload timer0 low byteTH0 = T1MS >> 8;         //设置定时初始值T0Count++;if(T0Count>=20){T0Count=0;last_key=now_key;now_key=TimeScanKey_getKey();if(last_key=255 && now_key!=255)P2=now_key;//执行代码,只有上次无按键,这次有按键才动作}
}
*/

10 数码管用定时器中断动态显示

Nixie.c

//定时器1ms中断一次,中断中调用一次,显示一位。
#include <REGX52.H>//数码管段码表
unsigned char idata NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0xbf,0x86,0xdB,0xcF,0xe6,0xeD,0xfD,0x87,0xfF,0xeF,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,0x00}; //共阴数码管d0-d7对应abcdefg和dp,第一排是0-9a-f,第二排是0.-9.a.-f.,最后一排是熄灭//数码管显示缓存区
unsigned char Nixie_Buf[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //从左到右的8位led数码管的显示数据区,开始都存放熄灭段码#define SegmentGPIO P0    //段码:P0口经过74hc245缓冲,1点亮
#define PosGPIO P2 //位选P24、P23、P22经过74HC138译码器,最左边数码管y7(对应3个全一)
void Nixie_scan(unsigned char location)  //location 显示位置(从最左到最右依次是1到8)
{SegmentGPIO=0x00;  //消影PosGPIO=(PosGPIO & 0xe3) | ((8-location)<<2); //送位选,位置1,位选应该是全一SegmentGPIO=NixieTable[Nixie_Buf[location-1]];
}void Nixie_loop(void)
{static unsigned char i=0;Nixie_scan(i+1);i=++i & 0x07; //i值 0-7
}/*
main程序中,extern unsigned char Nixie_Buf[];
或者在 Nixie.h unsigned char Nixie_Buf[];
*/

11 _74HC595_WriteByte

sbit RCK=P3^5;      //RCLK
sbit SCK=P3^6;     //SRCLK
sbit SER=P3^4;     //SER
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);//先移位高位SCK=1;  //SCK上升沿移位SCK=0;}RCK=1;   //RCK上升沿移位寄存器输出RCK=0;
}
void MatrixLED_Init()
{SCK=0;RCK=0;
}

12 把字节存入内部RAM

需求:调试中,需要观察各种数据,可以用串口发出去,电脑用串口助手接收观察,但是发送需要时间,等待发送完会阻塞,影响定时中断。把数据存放到片内高128B存储区,这样速度快,不影响程序运行。

设计:片内高128B存储区开辟64字节的内存空间,程序中需要调试的地方,存入一字节,如果64字节空间用完,则不再存入新数据。定时器0设计1ms中断一次,每次中断,显示led数码管一位,20ms判断按键,16个按键,占用0,1,3三个键。0和1键:根据读取指针把RegData数组中的4字节存入显示缓存区后,0键读取指针加4,1键读取指针减4。3键,存放指针置零,这样可以从头存入。
RegData.c

#include <REGX52.H>
#include "Nixie.h"unsigned char idata RegData[64]={0x00};/*** @brief  根据指针RegData[64]数组4字节到显示缓存区,option参数,为1送显后指针加4,为-1送显后指针减4* @param  RegData[64]数组,功能参数option* @retval */
void RegToShow(char option)
{static unsigned char p;Nixie_Buf[1]=*(RegData+p) & 0x0f;Nixie_Buf[0]=*(RegData+p)>>4 & 0x0f;Nixie_Buf[3]=*(RegData+p+1) & 0x0f;Nixie_Buf[2]=*(RegData+p+1)>>4 & 0x0f;Nixie_Buf[5]=*(RegData+p+2) & 0x0f;Nixie_Buf[4]=*(RegData+p+2)>>4 & 0x0f;Nixie_Buf[7]=*(RegData+p+3) & 0x0f;Nixie_Buf[6]=*(RegData+p+3)>>4 & 0x0f;if(option==1){if(p<=59) p+=4;}else if(option==-1){if(p>=4) p-=4;}
}void PutU8(unsigned char u8,reset) //第二个参数为非1,存入一个字节。第二个参数为1,不理u8,p指针复位为0
{static unsigned char p;if(reset==1)p=0;elseif(p<64){RegData[p]=u8;p++;}
}
/* 头文件 RegData.h
#ifndef __REGDATA_H__
#define __REGDATA_H__unsigned char idata RegData[];
void RegToShow(char option);
void PutU8(unsigned char u8,reset);#endif
*/
/*main中代码
.....
PutU8(T0Count>>8,0);
PutU8(T0Count,0);
......
if(last_key==255 && now_key!=255){if(now_key==3)  //按键值为3,复位存放指针PutU8(0x66,1);else if(now_key==0) //按键值为0,RegData区送显示后读取指针加4RegToShow(1);else if(now_key==1) //按键值为1,RegData区送显示后读取指针键减4RegToShow(-1);}
*/

stc89c52 单片机模块相关推荐

  1. 基于C语言STC89C52单片机电子密码锁的设计与仿真

    arm实现较为简单, 功能较为完善, 因此使用单片机控制较多. 显示器少数用数码管. 而本文所介绍的电子密码锁使用移植性及可读性强的高级语言C语言编写, 使用更加方便. 从经济适用的角度出发, 采用S ...

  2. 基于STC89C52单片机的密码锁设计与实现

    目 录 一.引言 3 1.1 课题研究背景及意义 3 1.2 课题设计的目的以及主要内容 4 二.系统硬件设计 5 2.1.系统硬件总体设计 5 2.2 单片机型号的选择 6 1.STC89C52单片 ...

  3. 89c51控制小车运行c语言,基于STC89C52单片机和STM32的智能小车控制系统

    摘要:针对智能车的控制系统, 选用STC89C52作为整个系统的主控芯片, 并进行硬件电路设计;以NREF24L01作为无线接收模块, 选取E18-D80NK-N红外光电传感器作为避障模块的核心器件; ...

  4. 基于STC89C52单片机的霓虹灯

    基于STC89C52单片机的霓虹灯 1.设计要求 使用PWM驱动8个LED灯         人眼不能观察到灯光全灭         灯光要有动画效果 2.设计概述         本实验所用芯片为S ...

  5. 基于STC89C52单片机的智能车控制系统设计

    目 录 1系统概述 1 1.1设计目的和意义 1 1.2设计思路 2 1.3系统需求分析 2 1.3.1市场需求 2 1.3.2实现功能 2 1.4开发环境 3 1.5运行环境 3 2总体设计 4 2 ...

  6. C语言智能窗帘编码,基于STC89C52单片机智能窗帘控制系统.doc

    基于STC89C52单片机智能窗帘控制系统 基于STC89C52单片机智能窗帘控制系统 [摘要] 本设计以STC89C52单片机为主控芯片,接收并处理BH1750FVI光照传感器的光强信号.DS18B ...

  7. 基于stc89c52单片机的密码锁制作

    1.制作所需材料:stc89c52单片机,普中51实验板,LCD屏幕 2.制作过程         程序设计 打开Keil uVision5,新建工程文件. 编辑LCD驱动模块(直接使用下方代码即可) ...

  8. c语言密码锁门禁系统程序,基于C语言STC89C52单片机电子密码锁的系统设计与仿真...

    摘 要:介绍一种通过 Protues 软件成功仿真的电子密码锁的实现过程.它采用高可靠性的STC89C52单片机来实现*和密码酌识别,采用具备IC总线接田的EPROM芯片来完成密码的聋储,通过l602 ...

  9. 基于STC89C52单片机的脉搏测量仪设计

    目 录 摘要 I Abstract II 引言 1 第一章 概述 2 1.1 选题的背景和意义 2 1.2 脉搏测量仪的发展与应用 3 第二章 总体方案的论证与设计 5 2.1主控模块的选型和论证 5 ...

  10. 如何用c语言编写智能照明系统,基于STC89C52单片机的智能照明控制系统方案设计...

    目前我国高校的教学楼和学生宿舍的照明系统大多采用定时方式控制,存在电能的大量浪费和照明模式不灵活等问题.本文基于51单片机,通过设置时间.感应光照与声音,针对教学楼和宿舍的不同需求设定照明状态,实现对 ...

最新文章

  1. [敏捷开发实践](2) 用于开发和维持复杂产品的敏捷开发框架Scrum
  2. Angular-搜索框及价格上下限
  3. 中国程序员如何去 Facebook 工作?
  4. Linux如何进入微服务看日志,Linux日志查找与服务器重启
  5. ARX中实现实体的偏移
  6. python画画零基础_Python获取英雄联盟皮肤原画:新手玩家们都懵了!
  7. MyEclipse激活步骤
  8. Python+Selenium自动化学习笔记
  9. 拓端tecdat|tableau的骑行路线地理数据可视化
  10. JSjavascript获取B站封面图片超高清批量下载原图
  11. 计算机网络配置——静态路由的配置
  12. vue3 + router-view + keepalive parentComponent.ctx.deactivate is not a function
  13. Win10联想电脑连不上wifi解决方法
  14. 详解去中心化资产管理协议BlackHoleDAO
  15. Python:XPath提取猫眼电影(转载)
  16. 1897个D3 例子
  17. linux统计函数调用次数实验,统计linux系统调用的次数
  18. 超详解三子棋(优化后)【万字教程包教包会】
  19. 使用HTML 5/CSS3五步快速制作便签贴特效
  20. 一键修复服务器,云服务器漏洞一键修复命令

热门文章

  1. linux firefox flashplayer 升级,在deepin中更新火狐浏览器firefox和firefox-flashplayer的方法...
  2. BAT的校园大赛,都秀出了哪些肌肉?
  3. Sass基础学习(一)
  4. 核磁共振重建算法综述
  5. 计算机毕业设计Java-ssm博雅楼自习室预约系统源码+系统+数据库+lw文档
  6. 苹果开发者账号实名认证相关问题
  7. 智能手机企业现状 行业发展趋势
  8. 前端学习图谱与新奇趣玩之前端Q直播回顾
  9. 统一资源定位符URL和统一资源标识符URI
  10. python 修改ip地址