1、 头文件
因为习惯原因和节约时间,虽然15单片机有专门的头文件,但是内部框架和51单片机是同样的,所以可以直接使用51的头文件,因为15的单片有多几个IO口,所以需要多定义几个IO口,另外引入头文件还有一些其他的,通过#include方式引入 ,代码模板如下。
- #include "reg52.h" //包含51单片机寄存器定义的头文件
- #include "intrins.h" //包含_nop_()定义的头文件
- #include "iic.h" //通信驱动
- #include "AT24C02.h" //数据写入
- #include "display.h" //数码管
- #include "cls.h" //关闭外设
- #include "delay.h" //延迟
- #include "key.h" //按键
- #include "interrupt.h"//中断
- sfr P4 = 0xC0; //定义P4 io口
- sbit P42 = P4^2;
- sbit P44 = P4^4;
2、 按键函数
(1) 普通按键
- sbit S7 = P3^0; //给io口命名
- unsigned char count=0;
- unsigned char key_value = 0;
- void key_scanf()
- {
- if(S7==0) //判断按键按下
- {
- Delay(5); //消抖 需要引入延时函数
- if(S7==0) //再次判断按键按下
- {
- key_value=1; //判断按下的数值
- count++; //判断按键按下次数
- while(!S7);
- }
- }
- }
(2) 矩阵按键
需要提前定义 n变量和key_value,count变量
- void key_scan()
- {
- P3=0xf0;P44=1;P42=1;
- if(P3!=0xf0||P44!=1||P42!=1)
- {
- Delay50ms();
- if(P3!=0xf0||P44!=1||P42!=1)
- {
- P3=0xf0;P44=1;P42=1;
- if(P44==0) n=0; //判断哪一列被拉低
- else if(P42==0) n=1;
- else if((P3&0X10)==0) n=3;
- else if((P3&0x20)==0) n=2;
- P3=0x0F;P44=0;P42=0; //行信号置零,列信号置一
- if((P3&0x01)==0) key_value =n; //判断哪一行被拉低
- else if((P3&0x02)==0) key_value =n+4;
- else if((P3&0x04)==0) key_value =n+8;
- else if((P3&0x08)==0) key_value =n+12;
- count++; //判断按键按下操作
- while(P3!=0x0F);
- }
- }
- }
3、 延时函数
延时函数可以通过软件直接生成精准延时,然后对其进行修改,这里的是一毫秒。通过形式参数可以实现调用不同时间的延时,因为延时会卡住单片机无法继续线下运行,因此中断中尽量少用。_nop_()需要引入同文件#include“intrins.h”。
- void Delay(unsigned int t) //@11.0592MHz
- {
- unsigned char i, j;
- for(;t>0;t--)
- {
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
- }
4、 关闭外设
因为单片机初始化会默认所有引脚高电平,容易对外设产生影响,因此需要上电过乘进行外设的关闭。
- void cls_buzz(void) //关闭蜂鸣器,继电器等。
- {
- P2=(P2&0X1F)|0XA0;
- P0=0x00;
- P2&=0X1F;
- }
- void cls_led(void) //关闭led灯
- {
- P2=(P2&0X1F)|0X80;
- P0=0XFF;
- P2 &= 0X1F;
- }
- void cls_display(void) //关闭数码管
- {
- P2 = (P2&0x1F|0xC0);
- P0 = 0xff; //关闭位选起消影作用
- P2 &= 0x1f;
- }
5、 流水灯
流水灯千变万化,为了适用各种流水灯的操作,这里编写了能过适用各种方式的流水灯。可以静态点灯调用也可以动态点灯调用。
- unsigned char led_flash[8]={0x80,0x40,0x20,0x10,0x08,0x40,0x02,0x01}//通过数组方法点灯
- unsigned char led_num = 0;
- void led_location(unsigned char Led_Mode,unsigned char Led_Num)
- {
- P0=0xff; //消隐
- P2=(P2&0x1f)|0x80;
- switch(Led_Mode)
- {
- case 0:P0=0xff;break;
- case 1:P0=~(0x01<<Led_Num);break;
- case 2:P0=~(0x80>>Led_Num);break;
- case 3:P0=led_flash[Led_Num];break;
- case 4:P0=0x00;break;
- case 5:P0=~0x80;break;
- }
- P2&=0x1f;
- }
- void led_flash_mode1() //模式1的方法闪烁流水灯将函数放入循环中
- {
- if(led_flash_mode1_switch == 0xff)//led流水灯运行标志位
- {
- delay(500);//如果在中断中可以删除延迟,调节中断间隔。
- if(++led_num<8)
- {
- void led_location(1,led_num);
- }else
- {
- led_num=0;
- }
- }
- }
6、按键功能处理
需要放在循环中
- void key_pro()
- {
- if(count!=0)
- {
- count=0;
- switch(key_value)
- {
- case 1:led_flash_mode1_switch =~led_flash_mode1_switch;break;
- case 2:break;
- case 3:break;
- }
- }
- }
7、 数码管动态显示
动态显示就可以当作静态的功能,因此这里只用动态的方法。调用只需要对数组
- code unsigned char tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X7f,0XFF}; //数码管显示数字表
- // 0 1 2 3 4 5 6 7 8 9 . 无
- // 0 1 2 3 4 5 6 7 8 9 10 11
- unsigned char dspbuf[8] = {11,11,11,11,11,11,11,11};
- unsigned char dspcom = 0;
- void display(void) //数码管需要放入中断中扫描
- {
- P0 = 0xff;
- P2 = (P2&0x1F|0xE0);
- P2 &= 0x1f;
- P2 = (P2&0x1F|0xC0);
- P0 = (1<<dspcom);
- P2 = 0x1f;
- P2 = (P2&0x1F|0xE0);
- P0 = tab[dspbuf[dspcom]];
- P2 = 0x1f;
- if(++dspcom == 8)
- dspcom = 0; //如
- }
8、 中断函数
可以通过软件直接生成。
- void Timer0Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xCD; //设置定时初值
- TH0 = 0xD4; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1;
- EA = 1;
- }
- void T0time() interrupt 1
- {
- display();
- }
9、 温度函数
温度函数为调用官方提供的onewire.h因为15芯片的时间要快12倍因此需要将延迟函数进行变慢12倍。然后加入读取温度函数。
- void Delay_OneWire(unsigned int t)
- {
- unsigned char i;
- while(t--)
- for(i=0;i<12;i++);
- }
- unsigned char read_temper(void)
- {
- unsigned char low,high,temp;
- Init_DS18B20(); //初始化DS18B20
- Write_DS18B20(0xcc); //跳过芯片ROM区
- Write_DS18B20(0x44); //启动温度转换
- Delay_OneWire(200); //延时
- Init_DS18B20(); //重复初始化DS18B20
- Write_DS18B20(0xcc); //跳过芯片ROM区
- Write_DS18B20(0xbe); //开始读取温度暂存器中的值
- low=Read_DS18B20(); //读取温度低字节
- high=Read_DS18B20(); //读取温度高字节
- temp=low>>4|high<<4; //去除符号位与小数位
- return temp; //返回温度
- }
10、 时间函数
调用官方提供的时间函数ds1302.h 然后添加两个函数,一个为涉资函数一个为读取函数。
- void Set_Ds1302(unsigned char* put_time)
- {
- unsigned char temp;
- Write_Ds1302_Byte( 0x8e,0 ); //关闭写保护;
- temp =((put_time[0]/10)<<4)|put_time[0]%10;
- Write_Ds1302_Byte( 0x84,temp); //写入时 ;
- temp =((put_time[1]/10)<<4)|put_time[1]%10;
- Write_Ds1302_Byte( 0x82,temp); //写入分 ;
- temp =((put_time[2]/10)<<4)|put_time[2]%10;
- Write_Ds1302_Byte( 0x80,temp); //写入秒 ;
- Write_Ds1302_Byte( 0x8e, 0x80 ); //开启写保护;
- }
- void red_Ds1302(unsigned char* put_time)
- {
- unsigned char temp;
- temp = Read_Ds1302_Byte ( 0x85 ); //读小时
- put_time[0]=((temp>>4)*10)+(temp&0x0f);
- temp = Read_Ds1302_Byte ( 0x83 ); //读分钟
- put_time[1]=((temp>>4)*10)+(temp&0x0f);
- temp = Read_Ds1302_Byte ( 0x81 ); //读秒钟
- put_time[2]=((temp>>4)*10)+(temp&0x0f);
- }
11、存储函数
一般国赛才用到,具体方法也就是iic的方式。需要查看芯片手册编写程序
- #include "reg52.h" //包含51单片机功能寄存器的头文件
- #include "iic.h" //包含IIC操作函数的头文件
- #define AT24C02_AddrW 0xA0 //宏定义AT24C02的写地址
- #define AT24C02_AddrR 0xA1 //宏定义AT24C02的读地址
- void wirte_eeprom(unsigned char addr,unsigned char date)
- {
- EA=0; //总中断关闭,防止打断IIC总线
- IIC_Start(); //启动总线
- IIC_SendByte(AT24C02_AddrW); //进行寻址,写数据
- IIC_WaitAck(); //等待应答
- IIC_SendByte(addr); //写入指定的存储单元
- IIC_WaitAck(); //等待应答
- IIC_SendByte(date); //写入一字节数据
- IIC_WaitAck(); //等待应答
- IIC_Stop(); //停止总线
- EA=1; //重新使能总中断
- }
- unsigned char read_eeprom(unsigned char addr)
- {
- unsigned char date;
- EA=0; //总中断关闭,防止打断IIC总线
- IIC_Start(); //启动总线
- IIC_SendByte(AT24C02_AddrW); //进行寻址,写数据
- IIC_WaitAck(); //等待应答
- IIC_SendByte(addr); //写入指定的存储单元
- IIC_WaitAck(); //等待应答
- IIC_Start(); //重新启动总线
- IIC_SendByte(AT24C02_AddrR); //进行寻址,读数据
- IIC_WaitAck(); //等待应答
- date=IIC_RecByte(); //读取一字节数据
- IIC_Ack(0); //发送非应答
- IIC_Stop(); //停止总线
- EA=1; //重新使能总中断
- return date; //返回date
- }
12、 数模函数
这里调用pcf8591也就是也是iic驱动带动。
- #include "iic.h" //包含IIC操作函数的头文件
- #include "reg52.h"
- #define PCF8591_AddrW 0x90 //宏定义PCF8591的写地址
- #define PCF8591_AddrR 0x91 //宏定义PCF8591的读地址
- #define control_word 0x40 //宏定义PCF8591控制字
- //允许模拟输出、四通道都为单端输入、不允许自动增量
- unsigned char read_pcf8591(unsigned char AIN)
- {
- unsigned char dat;
- EA=0;
- IIC_Start(); //启动总线
- IIC_SendByte(PCF8591_AddrW); //进行寻址,写数据
- IIC_WaitAck(); //等待应答
- IIC_SendByte(control_word|AIN); //选中传入的通道
- IIC_WaitAck(); //等待应答
- IIC_Start(); //重复启动总线
- IIC_SendByte(PCF8591_AddrR); //进行寻址,读数据
- IIC_WaitAck(); //等待应答,并启动A/D转换,开始传送第一字节
- IIC_RecByte(); //接收第一字节,为上一次的转换值,不是我们想要的,剔除此次数据
- IIC_Ack(1); //发送应答信号
- dat=IIC_RecByte(); //接送第二字节数据
- IIC_Ack(0); //发送非应答信号,停止数据传送
- IIC_Stop(); //停止总线
- EA=1;
- return dat; //返回AD值
- }
- void write_pcf8591(unsigned char dat)
- {
- EA=0;
- IIC_Start(); //启动总线
- IIC_SendByte(PCF8591_AddrW); //进行寻址,写数据
- IIC_WaitAck(); //等待应答
- IIC_SendByte(control_word); //控制为模拟输出
- IIC_WaitAck(); //等待应答
- IIC_SendByte(dat); //发送模拟数据
- IIC_WaitAck(); //等待应答
- IIC_Stop(); //停止总线
- EA=1;
- }
капельница на дому от запоя капельница на дому от запоя .
Сколько стоит диплом высшего и среднего образования и как это происходит?
https://t.me/s/kino_film_serial_online_telegram 232124 лучших фильмов. Фильмы смотреть онлайн. В нашем онлайн-кинотеатре есть новинки кино и бесплатные фильмы самых разных жанров
https://t.me/s/kino_film_serial_online_telegram 559367 лучших фильмов. Фильмы смотреть онлайн. В нашем онлайн-кинотеатре есть новинки кино и бесплатные фильмы самых разных жанров
Рекомендуем – топ мужских пуховиков
купить диплом музыкальной школы russa-diploms.ru .
сопровождение сайта https://is-market.ru
наркологическая скорая в москве наркологическая скорая в москве .
прокапаться от пьянки kapelnica-ot-zapoya-kolomna16.ru .
https://t.me/s/kino_film_serial_online_telegram 615227 лучших фильмов. Фильмы смотреть онлайн. В нашем онлайн-кинотеатре есть новинки кино и бесплатные фильмы самых разных жанров
вызов скорой наркологической помощи https://skoraya-narkologicheskaya-pomoshch-moskva.ru/ .
стоимость капельницы от запоя стоимость капельницы от запоя .
наркологическая скорая помощь москва наркологическая скорая помощь москва .
https://t.me/s/kino_film_serial_online_telegram 926524 лучших фильмов. Фильмы смотреть онлайн. В нашем онлайн-кинотеатре есть новинки кино и бесплатные фильмы самых разных жанров
Сервисный центр предлагает мастер по ремонту кофемашины franke центр ремонта кофемашины franke
Реально ли приобрести диплом стоматолога? Основные этапы
Подробный обзор Istanbul International Airport, успешные этапы развития.
Загадки и тайны Istanbul International Airport, о которых мало кто слышал.
Уникальная архитектура Istanbul International Airport, которые невозможно не отметить.
Планы и развитие Istanbul International Airport, прогнозы и перспективы.
Что делает аэропорт уникальным, что сделано для комфорта путешественников.
main istanbul airport [url=https://airportistanbulinternational.com/]https://airportistanbulinternational.com/[/url] .
Рекомендуем – страшная одежда
Купить диплом техникума
kyc-diplom.com/diplom-tekhnikuma.html
платная наркологическая помощь платная наркологическая помощь .
вывод из запоя на дому химки цены вывод из запоя на дому химки цены .
наркологическая скорая в москве наркологическая скорая в москве .
срочная помощь вывод из запоя химки http://vyvod-iz-zapoya-himki11.ru/ .
как можно купить аттестат как можно купить аттестат .
купить диплом нового образца купить диплом нового образца .
Как приобрести аттестат о среднем образовании в Москве и других городах
forum.osarf.ru/viewtopic.php?f=25&t=137
нарколог на дом в люберцах https://kapelnica-ot-zapoya-lyubercy11.ru/ .
вывод из запоя люберцы цены вывод из запоя люберцы цены .
нарколог вывод из запоя москва нарколог вывод из запоя москва .
вывод из запоя на дому люберцы вывод из запоя на дому люберцы .
вывод из запоя недорого москва вывод из запоя недорого москва .
Реально ли приобрести диплом стоматолога? Основные этапы
Рекомендуем – образы для хэллоуина
buruan daftar di situs slot gacor bonekslot sudah dijamin paling gacor tidak ada tandingannya
Сервисный центр предлагает ремонт philips xenium w626 ремонт philips xenium w626
Приобретение школьного аттестата с официальным упрощенным обучением в Москве
прокапаться от алкоголя в балашихе прокапаться от алкоголя в балашихе .
вывод из запоя недорого москва вывод из запоя недорого москва .
вывод из запоя цены на дому москва вывод из запоя цены на дому москва .
прокапаться от алкоголя в балашихе прокапаться от алкоголя в балашихе .
выведение из запоя в стационаре балашихи выведение из запоя в стационаре балашихи .
Быстрая схема покупки диплома старого образца: что важно знать?
вывод из запоя в подольске вывод из запоя в подольске .
капельница от запоя на дому капельница от запоя на дому .
врач вывод из запоя королев врач вывод из запоя королев .
врач на дом капельница от запоя врач на дом капельница от запоя .
https://t.me/s/kino_film_serial_online_telegram 940514 лучших фильмов. Фильмы смотреть онлайн. В нашем онлайн-кинотеатре есть новинки кино и бесплатные фильмы самых разных жанров
Возможно ли купить диплом стоматолога, и как это происходит
boxer-forum.ru/viewtopic.php?f=17&t=4409
https://t.me/s/kino_film_serial_online_telegram 321309 лучших фильмов. Фильмы смотреть онлайн. В нашем онлайн-кинотеатре есть новинки кино и бесплатные фильмы самых разных жанров
We recommend exploring the best quotes collections: Love Is Quotes From Great People