REG52头文件

合集下载

51单片机C语言头文件及其使用

51单片机C语言头文件及其使用

51单片机C语言头文件及其使用2007-05-29 16:33很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这样的问题,看过本文后,就会明白。

其实这个是在头文件中用sfr定义的,现在定义好了的是这样的sfr P1 = 0x90;,也就是说,到底大写,还是小写,就是在这里面决定的。

这就说明,如果你要用小写,就得在头文件中改为小写。

其实它都是为了编程序方便才这样写的,在程序编译时,就会变成相应的地址(如P1就变成了0x90)。

还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。

下面是一个标准的C51头文件:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。

如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。

)/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;/* BIT Registers */ /* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 only/* TCON */sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;/* IE */sbit EA = IE^7;sbit ET2 = IE^5; //8052 onlysbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;/* IP */sbit PT2 = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/* P3 */sbit RD = P3^7;sbit WR = P3^6;sbit T1 = P3^5;sbit INT1 = P3^3;sbit INT0 = P3^2;sbit TXD = P3^1;sbit RXD = P3^0;/* SCON */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1 */sbit T2EX = P1^1; // 8052 onlysbit T2 = P1^0; // 8052 only/* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。

51单片机C语言头文件及其使用

51单片机C语言头文件及其使用

51单片机C语言头文件及其使用2007-05-29 16:33很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这样的问题,看过本文后,就会明白。

其实这个是在头文件中用sfr定义的,现在定义好了的是这样的sfr P1 = 0x90;,也就是说,到底大写,还是小写,就是在这里面决定的。

这就说明,如果你要用小写,就得在头文件中改为小写。

其实它都是为了编程序方便才这样写的,在程序编译时,就会变成相应的地址(如P1就变成了0x90)。

还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。

下面是一个标准的C51头文件:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。

如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。

)/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;/* BIT Registers */ /* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 only/* TCON */sbit TF1 = TCON^7;sbit TR1 = TCON^6;sbit TF0 = TCON^5;sbit TR0 = TCON^4;sbit IE1 = TCON^3;sbit IT1 = TCON^2;sbit IE0 = TCON^1;sbit IT0 = TCON^0;/* IE */sbit EA = IE^7;sbit ET2 = IE^5; //8052 onlysbit ES = IE^4;sbit ET1 = IE^3;sbit EX1 = IE^2;sbit ET0 = IE^1;sbit EX0 = IE^0;/* IP */sbit PT2 = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/* P3 */sbit RD = P3^7;sbit WR = P3^6;sbit T1 = P3^5;sbit INT1 = P3^3;sbit INT0 = P3^2;sbit TXD = P3^1;sbit RXD = P3^0;/* SCON */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1 */sbit T2EX = P1^1; // 8052 onlysbit T2 = P1^0; // 8052 only/* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;还有一点就是,现在有很多改进型的单片机,它们有很多新增的特殊功能寄存器在标准的reg51.h或reg52.h中没有定义,这就需要自己加进头文件(相关厂家已经把它们定义好了),当然也可以直接在程序中定义。

#includereg52.h#...

#includereg52.h#...

#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit LED1=P3^4;sbit LED2=P3^5;void delay(int x){uchar i,j;for(i=0;i<x;i++)for(j=0;j<120;j++);}uchar PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0}; void delay8us(uint x){uchar i,j;for(i=0;i<x;i++)for(j=0;j<1;j++);}//****************************//CC1100模块接口//*****************************sbit GDO2=P2^4;sbit GDO0=P2^2;sbit CSN=P2^6;sbit SI=P2^5;sbit SO=P2^3;sbit SCLK=P2^1;sbit OP1=P2^0;sbit OP2=P2^7;//**************************//定义cc1100的寄存器//***************************//配置寄存器部分#define CCxxx0_IOCFG2 0x00 // GDO2 输出配置脚#define CCxxx0_IOCFG1 0x01 // SO /GDO1输出配置脚#define CCxxx0_IOCFG0 0x02 // GDO0 输出配置脚#define CCxxx0_FIFOTHR 0x03 // RX FIFO 和TX FIFO 门限#define CCxxx0_SYNC1 0x04 // 同步词汇,高字节#define CCxxx0_SYNC0 0x05 // 同步词汇,低字节#define CCxxx0_PKTLEN 0x06 // 数据包长度#define CCxxx0_PKTCTRL1 0x07 // 数据包自动控制#define CCxxx0_PKTCTRL0 0x08 // 数据包自动控制#define CCxxx0_ADDR 0x09 // 设备地址#define CCxxx0_CHANNR 0x0A // 信道数#define CCxxx0_FSCTRL1 0x0B // 频率合成器控制#define CCxxx0_FSCTRL0 0x0C // 频率合成器控制#define CCxxx0_FREQ2 0x0D //频率控制字,高字节#define CCxxx0_FREQ1 0x0E //频率控制字,中字节#define CCxxx0_FREQ0 0x0F // 频率控制字,低字节#define CCxxx0_MDMCFG4 0x10 //调制器配置#define CCxxx0_MDMCFG3 0x11 // 调制器配置#define CCxxx0_MDMCFG2 0x12 //调制器配置#define CCxxx0_MDMCFG1 0x13 //调制器配置#define CCxxx0_MDMCFG0 0x14 //调制器配置#define CCxxx0_DEVIA TN 0x15 // 调制器背离设置#define CCxxx0_MCSM2 0x16 // 主通信控制状态机控制#define CCxxx0_MCSM1 0x17 //主通信控制状态机控制#define CCxxx0_MCSM0 0x18 //主通信控制状态机控制#define CCxxx0_FOCCFG 0x19 // 频率偏移补偿控制#define CCxxx0_BSCFG 0x1A // 位同步配置#define CCxxx0_AGCCTRL2 0x1B // AGC 控制#define CCxxx0_AGCCTRL1 0x1C // AGC 控制#define CCxxx0_AGCCTRL0 0x1D // AGC 控制#define CCxxx0_WOREVT1 0x1E // 高字节时间0暂停#define CCxxx0_WOREVT0 0x1F // 低字节时间0暂停#define CCxxx0_WORCTRL 0x20 // 电磁波激活控制#define CCxxx0_FREND1 0x21 // 前末端RX 控制#define CCxxx0_FREND0 0x22 // 前末端TX 控制#define CCxxx0_FSCAL3 0x23 // 频率合成器校准#define CCxxx0_FSCAL2 0x24 // 频率合成器校准#define CCxxx0_FSCAL1 0x25 // 频率合成器校准#define CCxxx0_FSCAL0 0x26 // 频率合成器校准#define CCxxx0_RCCTRL1 0x27 // RC 振荡器配置#define CCxxx0_RCCTRL0 0x28 // RC 振荡器配置#define CCxxx0_FSTEST 0x29 // 频率合成器校准控制#define CCxxx0_PTEST 0x2A // 产品测试#define CCxxx0_AGCTEST 0x2B // AGC 测试#define CCxxx0_TEST2 0x2C // 不同的测试设置#define CCxxx0_TEST1 0x2D // 不同的测试设置#define CCxxx0_TEST0 0x2E // 不同的测试设置//滤波命令部分#define CCxxx0_SRES 0x30 // 重启芯片#define CCxxx0_SFSTXON 0x31 // 开启和校准频率合成器(若MCSM0.FS_AUTOCAL=1). #define CCxxx0_SXOFF 0x32 // 关闭晶体振荡器#define CCxxx0_SCAL 0x33 //校准频率合成器并关断(开启快速启动)。

附录 程序代码

附录 程序代码

附录程序代码#include <reg52.h> //调用单片机头文件#define uchar unsigned char //无符号字符型宏定义变量范围0~255#define uint unsigned int //无符号整型宏定义变量范围0~65535#include "eeprom52.h"//数码管段选定义 0 1 2 3 4 5 6 7 8 9uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码//数码管位选定义uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8};uchar smg_i = 3; //显示数码管的个位数sbit dq = P2^4; //18b20 IO口的定义bit flag_lj_en; //按键连加使能bit flag_lj_3_en; //按键连3次连加后使能加的数就越大了uchar key_time,key_value; //用做连加的中间变量bit key_500ms ;sbit beep = P2^3; //声光报警接口uchar f_pwm_l ; //越小越慢uint temperature ; //bit flag_300ms ;uchar menu_1; //菜单设计的变量uint t_high = 300,t_low = 100; //温度上下限报警值uint number;/***********************1ms延时函数*****************************/void delay_1ms(uint q){uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);}/***********************小延时函数*****************************/void delay_uint(uint q){while(q--);}/***********************数码显示函数*****************************/void display(){static uchar i;i++;if(i >= smg_i)i = 0;P1 = 0xff; //消隐P3 = smg_we[i]; //位选P1 = dis_smg[i]; //段选}/******************把数据保存到单片机内部eepom中******************/void write_eeprom(){SectorErase(0x2000);byte_write(0x2000, t_high % 256);byte_write(0x2001, t_high / 256);byte_write(0x2002, t_low % 256);byte_write(0x2003, t_low / 256);byte_write(0x2055, a_a);}/******************把数据从单片机内部eepom中读出来*****************/void read_eeprom(){t_high = byte_read(0x2001);t_high <<= 8;t_high |= byte_read(0x2000);t_low = byte_read(0x2003);t_low <<= 8;t_low |= byte_read(0x2002);a_a = byte_read(0x2055);}/**************开机初始化保存的数据*****************/void init_eeprom(){read_eeprom(); //先读if(a_a != 22) //新的单片机初始单片机内问eeprom{t_high = 250;t_low = 200;a_a = 22;write_eeprom(); //保存数据}}/***********************18b20初始化函数*****************************/ void init_18b20(){bit q;dq = 1; //把总线拿高delay_uint(1); //15usdq = 0; //给复位脉冲delay_uint(80); //750usdq = 1; //把总线拿高等待delay_uint(10); //110usq = dq; //读取18b20初始化信号delay_uint(20); //200usdq = 1; //把总线拿高释放总线}/*************写18b20内的数据***************/void write_18b20(uchar dat){uchar i;for(i=0;i<8;i++){ //写数据是低位开始dq = 0; //把总线拿低写时间隙开始dq = dat & 0x01; //向18b20总线写数据了delay_uint(5); // 60usdq = 1; //释放总线dat >>= 1;}}/*************读取18b20内的数据***************/uchar read_18b20(){uchar i,value;for(i=0;i<8;i++){dq = 0; //把总线拿低读时间隙开始value >>= 1; //读数据是低位开始dq = 1; //释放总线if(dq == 1) //开始读写数据value |= 0x80;delay_uint(5); //60us 读一个时间隙最少要保持60us的时间}return value; //返回数据}/*************读取温度的值读出来的是小数***************/uint read_temp(){uint value;uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); //初始化18b20EA = 0;write_18b20(0xcc); //跳过64位ROMwrite_18b20(0x44); //启动一次温度转换命令EA = 1;delay_uint(50); //500usinit_18b20(); //初始化18b20EA = 0;write_18b20(0xcc); //跳过64位ROMwrite_18b20(0xbe); //发出读取暂存器命令low = read_18b20(); //读温度低字节value = read_18b20(); //读温度高字节EA = 1;value <<= 8; //把温度的高位左移8位value |= low; //把读出的温度低位放到value的低八位中value *= 0.625; //转换到温度值小数return value; //返回读出的温度带小数}/*************定时器0初始化程序***************/void time_init(){EA = 1; //开总中断TMOD = 0X11; //定时器0、定时器1工作方式1ET0 = 1; //开定时器0中断TR0 = 1; //允许定时器0定时ET1 = 1; //开定时器0中断TR1 = 0; //允许定时器0定时}/********************独立按键程序*****************/uchar key_can; //按键值void key() //独立按键程序{static uchar key_new;key_can = 20; //按键值还原P2 |= 0x07;if((P2 & 0x07) != 0x07) //按键按下{if(key_500ms == 1) //连加{key_500ms = 0;key_new = 1;}delay_1ms(1); //按键消抖动if(((P2 & 0x07) != 0x07) && (key_new == 1)){ //确认是按键按下key_new = 0;switch(P2 & 0x07){case 0x06: key_can = 3; break; //得到k2键值case 0x05: key_can = 2; break; //得到k3键值case 0x03: key_can = 1; break; //得到k4键值}flag_lj_en = 1; //连加使能}}else{if(key_new == 0){key_new = 1;write_eeprom(); //保存数据flag_lj_en = 0; //关闭连加使能flag_lj_3_en = 0; //关闭3秒后使能key_value = 0; //清零key_time = 0;key_500ms = 0;}}}/****************按键处理数码管显示函数***************/void key_with(){if(key_can == 1) //设置键{f_pwm_l = 30;menu_1 ++;if(menu_1 >= 3){menu_1 = 0;smg_i = 3; //数码管显示3位}}if(menu_1 == 1) //设置高温报警{smg_i = 4; //数码管显示4位if(key_can == 2){if(flag_lj_3_en == 0)t_high ++ ; //按键按下未松开自动加三次elset_high += 10; //按键按下未松开自动加三次之后每次自动加10if(t_high > 990)t_high = 990;}if(key_can == 3){if(flag_lj_3_en == 0)t_high -- ; //按键按下未松开自动减三次elset_high -= 10; //按键按下未松开自动减三次之后每次自动减10if(t_high <= t_low)t_high = t_low + 1;}dis_smg[0] = smg_du[t_high % 10]; //取小数显示dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf; //取个位显示dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示dis_smg[3] = 0x64; //H}if(menu_1 == 2) //设置低温报警{smg_i = 4; //数码管显示4位if(key_can == 2){if(flag_lj_3_en == 0)t_low ++ ; //按键按下未松开自动加三次elset_low += 10; //按键按下未松开自动加三次之后每次自动加10if(t_low >= t_high)t_low = t_high - 1;}if(key_can == 3){if(flag_lj_3_en == 0)t_low -- ; //按键按下未松开自动减三次elset_low -= 10; //按键按下未松开自动加三次之后每次自动加10if(t_low <= 10)t_low = 10;}dis_smg[0] = smg_du[t_low % 10]; //取小数显示dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf; //取个位显示dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示dis_smg[3] = 0x3D; //L}}/****************报警控制函数***************/void baojing_kz(){if(temperature<t_high && temperature>t_low){TR1 = 0;beep = 1;}else{TR1 = 1;if(number >= 1000){number = 0;beep = ~beep;}}}/****************主函数***************/void main(){P0 = P1 = P2 = P3 = 0xff;time_init(); //初始化定时器temperature = read_temp(); //先读出温度的值init_eeprom(); //开始初始化保存的数据delay_1ms(650);temperature = read_temp(); //先读出温度的值dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示f_pwm_l = 50;while(1){key(); //按键程序if(key_can < 10){key_with(); //设置报警温度}if(flag_300ms == 1) //300ms 处理一次温度程序{flag_300ms = 0;temperature = read_temp(); //先读出温度的值if(menu_1 == 0){smg_i = 3;dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示}}baojing_kz(); //报警控制函数}}/*************定时器0中断服务程序***************/void time0_int() interrupt 1{static uchar value; //定时2ms中断一次TH0 = 0xf8;TL0 = 0x30; //2msdisplay(); //数码管显示函数value++;if(value >= 150){value = 0;flag_300ms = 1;}if(flag_lj_en == 1) //按下按键使能{key_time ++;if(key_time >= 250) //500ms{key_time = 0;key_500ms = 1; //500mskey_value ++;if(key_value > 3){key_value = 10;flag_lj_3_en = 1; //3次后1.5秒连加大些}}}}/*******************定时器1用做单片机模拟PWM 调节***********************/ void Timer1() interrupt 3 //调用定时器1{TH1=0xfe; // 定时10ms中断一次TL1=0x0c; //500usnumber++;}。

自定义reg52.h头文件(单片机学习重难点核心知识点)

自定义reg52.h头文件(单片机学习重难点核心知识点)

⾃定义reg52.h头⽂件(单⽚机学习重难点核⼼知识点)/*--------------------------------------------------------------------------⾃定义REG52头⽂件@auth lei@date 2017-05--------------------------------------------------------------------------*/#ifndef __REG52_H__#define __REG52_H__/* ⼀个字节的寄存器 */sfr P0 = 0x80;//双向IO,向外输出要接上拉电阻sfr P1 = 0x90;//准双向IO,作为输⼊要先置1sfr P2 = 0xA0;//准双向IO,作为输⼊要先置1sfr P3 = 0xB0;//准双向IO,作为输⼊要先置1,有第⼆功能sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;//中断控制寄存器sfr TMOD = 0x89;//定时器⼯作⽅式寄存器sfr TL0 = 0x8A;//定时器/计数器0低8位sfr TL1 = 0x8B;//定时器/计数器1低8位sfr TH0 = 0x8C;//定时器/计数器0⾼8位sfr TH1 = 0x8D;//定时器/计数器1⾼8位sfr IE = 0xA8;//中断允许寄存器sfr IP = 0xB8;//中断优先级寄存器sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052单⽚机扩展的寄存器 */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;/* ⼀位长度的寄存器 *//* PSW */sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;sbit P = PSW^0; //8052 专⽤/*------------中断内容详解----------------------------*相关的寄存器* 1.IE中断允许寄存器* 2.TCON定时控制寄存器* 3.IP中断优先级寄存器(不常⽤)* 4.TMOD定时器⼯作⽅式寄存器(定时器/计数器中断才⽤到)*使⽤中断的步骤:* 1.中断初始化函数(只需要调⽤⼀次,不要放到循环⾥重复调⽤)* 2.编写中断处理函数* 3.主函数中调⽤中断初始化函数*------------中断内容详解----------------------------//* TCON定时控制寄存器 */sbit TF1 = TCON^7;//定时器/计数器中标志位:sbit TR1 = TCON^6;//定时器/计数器中1启动、停⽌:sbit TF0 = TCON^5;//定时器/计数器中0标志位:sbit TR0 = TCON^4;//定时器/计数器中断0启动、停⽌:sbit IE1 = TCON^3;//外部中断1中断标志位:中断产⽣时硬件置1,中断函数处理完后硬件置0sbit IT1 = TCON^2;//外部中断1触发⽅式:0为电平、1为下降沿sbit IE0 = TCON^1;//外部中断0中断标志位:中断产⽣时硬件置1,中断函数处理完后硬件置0sbit IT0 = TCON^0;//外部中断0触发⽅式:0为电平、1为下降沿/* IE中断允许寄存器 */sbit EA = IE^7;//中断总开关sbit ET2 = IE^5; //8052 专⽤sbit ES = IE^4;sbit ET1 = IE^3;//定时器/计数器中断1开关sbit EX1 = IE^2;//外部中断1开关sbit ET0 = IE^1;//定时器/计数器中断0开关sbit EX0 = IE^0;//外部中断0开关/* IP中断优先级寄存器 */sbit PT2 = IP^5;sbit PS = IP^4;sbit PT1 = IP^3;sbit PX1 = IP^2;sbit PT0 = IP^1;sbit PX0 = IP^0;/*------------------TMOD寄存器详解-----------------8位从⾼到低依次为:GATE C/T M1 M0 GATE C/T M1 M0{----配置定时器1----} {----配置定时器0----}GATE:门控位,由外部引脚(T0、T1)作为定时器的启动总开关:GATE=0时,T0和T1⽆效;GATE=1时,需要T0或者T1开关打开(⾼电平)定时器才能启动C/T:计数⽅式选择,C/T=0时⽤作定时器,C/T=1时⽤作计数器M1、M0:⼯作⽅式选择位,00为⼯作⽅式0,13位定时器/计数器,TH存放⾼8位,TL存放低5位01为⼯作⽅式1,16位定时器/计数器,TH存放⾼8位,TL存放低8位(常⽤)10为⼯作⽅式2,初值⾃动装载的8位定时器/计数器(常⽤)11为⼯作⽅式3,T0被分为两个8位独⽴计数器,T1停⽌⼯作*------------------TMOD寄存器详解-----------------//* P3⼝的第⼆功能 */sbit RD = P3^7;//外部存储器读选通信号sbit WR = P3^6;//外部存储器写选通信号sbit T1 = P3^5;//外部控制定时器/计数器1的启动(TMOD寄存器第7位GATE = 1时才有效),1为启动,0位停⽌sbit T0 = P3^4;//外部控制定时器/计数器0的启动(TMOD寄存器第3位GATE = 1时才有效),1为启动,0位停⽌sbit INT1 = P3^3;//外部中断1输⼊sbit INT0 = P3^2;//外部中断0输⼊sbit TXD = P3^1;//串⾏输出sbit RXD = P3^0;//串⾏输⼊/* SCON串⼝控制寄存器 */sbit SM0 = SCON^7;sbit SM1 = SCON^6;sbit SM2 = SCON^5;sbit REN = SCON^4;sbit TB8 = SCON^3;sbit RB8 = SCON^2;sbit TI = SCON^1;sbit RI = SCON^0;/* P1⼝第⼆功能 */sbit T2EX = P1^1; // 8052 专⽤sbit T2 = P1^0; // 8052 专⽤/* T2CON */sbit TF2 = T2CON^7;sbit EXF2 = T2CON^6;sbit RCLK = T2CON^5;sbit TCLK = T2CON^4;sbit EXEN2 = T2CON^3;sbit TR2 = T2CON^2;sbit C_T2 = T2CON^1;sbit CP_RL2 = T2CON^0;#endif。

单片机电子时钟设计程序

单片机电子时钟设计程序

单片机电子时钟设计程序
1.引用头文件和定义全局变量
首先需要引用相应的头文件,例如`reg52.h`,并定义全局变量用于
存储时间、闹钟时间以及其他相关参数。

2.初始化时钟
在主函数中,首先进行时钟的初始化。

这包括设置定时器和中断相关
的寄存器,以及初始化显示屏和按钮等外设。

3.时间更新
编写一个中断服务函数,用于根据定时器的中断来更新时间。

在该中
断服务函数中,需要将全局变量中的时间进行递增,并考虑到分钟、小时、日期和星期等的进位和换算。

4.按钮输入
设置一个子函数用于读取按钮输入,并根据按钮的状态来进行相应的
操作,比如切换时钟显示模式、设置闹钟等。

5.显示时间
编写一个子函数用于将时间信息显示在数码管上。

这需要先将时间信
息转换为数码管的显示格式,然后通过IO口输出控制数码管的显示。

6.闹钟设置
使用按钮输入的功能,可以设置闹钟时间和开关闹钟功能。

当闹钟时
间到达时,可以通过控制蜂鸣器发声或点亮LED等方式来进行提醒。

7.主函数
在主函数中,循环执行按钮输入的检测和相应操作,以及时间的更新和显示等功能。

可以通过一个状态机来控制整个程序的流程。

以上是一个简要的单片机电子时钟设计程序的概述。

实际的程序设计过程中,还需要考虑到各个模块之间的交互、错误处理、电源管理以及代码的优化等细节问题。

具体的程序实现可以根据具体需求和硬件平台的差异进行适当的修改和扩展。

单片机C51头文件reg51.h及reg52.h解析

单片机C51头文件reg51.h及reg52.h解析

单片机中用c编程时头文件reg51.h及reg52.h解析我们在用c语言编程是往往第一行就是reg51.h或者其他的自定义头文件,我们怎么样来理解呢?1)“文件包含”处理。

程序的第一行是一个“文件包含”处理。

所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来。

程序中包含REG51.h文件的目的是为了要使用P1 (还有其他更多的符号)这个符号,即通知C 编译器,程序中所写的P1 是指80C51 单片机的P1 端口而不是其它变量。

这是如何做到的呢?打开reg51.h 可以看到这样的一些内容:(此文件一般在C:\KEIL\C51\INC下,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。

如果我们要使用自己写的头文件,使用的时候只需把对应头文件拷贝到INC文件夹里就可以了。

)#ifndef __REG51_H__#define __REG51_H__sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99;sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;sbit TF1 = 0x8F;sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8;sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8;sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;#endif熟悉80C51 内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系。

51单片机C语言程序设计源代码

51单片机C语言程序设计源代码

新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 - 例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。

(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档