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;
- }
пансионат для пожилых в песчаном [url=http://xn—–3-43da3arnf4adrboggk3ay6e3gtd.xn--p1ai/]пансионат для пожилых в песчаном[/url] .
Официальная покупка школьного аттестата с упрощенным обучением в Москве
mos.flybb.ru/viewtopic.php?f=2&t=2959
Стоимость дипломов высшего и среднего образования и процесс их получения
Unlu Sahabet Casino’da yeni oyuncular icin en buyuk bonus f?rsat?n? yakalay?n
Sahabet Casino Sahabet .
порно россия детское порно чат телеграмм
1 с предприятие купить программу 1 с предприятие купить программу .
купить дипломную работу russa-diploms.ru .
пансионат для престарелых в бахчисарае xn—–6kcacwibu7aeobnlkrcglni7eyhud.xn--p1ai .
Всё, что нужно знать о покупке аттестата о среднем образовании без рисков
пансионат для престарелых цены пансионат для престарелых цены .
вывод из запоя стационар вывод из запоя стационар .
Looking for a reliable activation tool? kmspico activator.
Узнайте стоимость диплома высшего и среднего образования и процесс получения
forumkasino.bestff.ru/viewtopic.php?id=5107#p11132
Официальная покупка диплома ПТУ с упрощенной программой обучения
вывод из запоя круглосуточно сочи вывод из запоя круглосуточно сочи .
generic zyban 150mg – order orlistat 60mg for sale buy shuddha guggulu without prescription
вывод из запоя на дому нижний вывод из запоя на дому нижний .
капельница от запоя цена snyatie-zapoya-na-domu16.ru .
вывод запой нижний http://www.snyatie-zapoya-na-domu17.ru .
диплом о среднем образовании landik-diploms.ru .
Необходимый элемент дизайна вашего интерьера, коннелюрный плинтус будет вам к лицу
коннелюрный плинтус для линолеума коннелюрный плинтус для линолеума .
Bird. https://t.me/inewsworldplanet
Griselda blanco young. https://t.me/inewsworldplanet
Временная регистрация в Москве: Быстро и Легально!
Ищете, где оформить временную регистрацию в Москве?
Мы гарантируем быстрое и легальное оформление без очередей и лишних документов.
Ваше спокойствие – наша забота!
Минимум усилий • Максимум удобства • Полная легальность
Свяжитесь с нами прямо сейчас!
Временная регистрация в Москве
Как официально приобрести аттестат 11 класса с минимальными затратами времени
new rummy app
Рекомендуем – daddy casino сайт
tumi outlet哪裡買最便宜
a mobile version of the ancient Indian card game rummy circle
Nike Kobe 4 Protro 搭載 Zoom Air 緩震 技術, nike tw
Nike Kobe 4 Protro 搭載 Zoom Air 緩震 技術,為球員帶來更佳的響應性與舒適性。kobe 球鞋哪裡買最便宜
Sf to acres. https://t.me/inewsworldplanet
Musi. https://t.me/inewsworldplanet
all rummy apps
nike vomero 5
匡威(converse),這個自1908年起便風靡全球的品牌,從最初的籃球鞋製造商,逐步演變成今天潮流文化的象征。converse哪裡買最便宜
Мы занимаемся вывозом мусора газелями разной модификации от стандартных 6 м3 до больших 14 м3 есть также грузчики, работаем по Московской области. Преимущества вывоза мусора газелью в том, что она самая дешёвая услуга вывоза мусора.
Подробный гид по вывозу мусора газелью, с минимальными затратами.
Надежность газели при перевозке мусора, которые важно знать.
Основные типы мусора, которые можно вывозить газелью, с учетом размеров и веса.
Как сэкономить на вывозе мусора газелью, и сохранить качество проведенных работ.
Секрет успешного вывоза мусора газелью, понимая особенности процесса.
вывоз строительного мусора газелью вывоз старой мебели на свалку .
Купить диплом старого образца, можно ли это сделать по быстрой схеме?
Легальная покупка школьного аттестата с упрощенной программой обучения
talkrealty.ru/ofitsialnyiy-diplom-dlya-byistrogo-starta-v-professii
Процесс получения диплома стоматолога: реально ли это сделать быстро?
dianov.bget.ru/forum/thread61805.html#1359240
Официальная покупка диплома вуза с упрощенной программой обучения
crowd-out.social/create-blog
вывод из запоя санкт петербург вывод из запоя санкт петербург .
Стоимость дипломов высшего и среднего образования и процесс их получения
[url=][/url]
Временная регистрация в Москве: Быстро и Легально!
Ищете, где оформить временную регистрацию в Москве? Мы гарантируем быстрое и легальное оформление без очередей и лишних документов. Ваше спокойствие – наша забота!
Минимум усилий • Максимум удобства • Полная легальность
Свяжитесь с нами прямо сейчас!
[url=https://мосрегистрация77.рф/].[/url]
[url=][/url]
вывод из запоя на дому санкт петербург вывод из запоя на дому санкт петербург .
在哪裏可以玩all rummy apps
Tiffany & Co.都以其無可比擬的精湛工藝和優雅設計成爲人們追求高品質生活的首選品牌
nike air
在購買Tiffany & Co.的珠寶時,有幾個因素需要考慮,以確保您獲得壹款真正適合自己的作品
tiffany and co
探索Tiffany & Co. USA:經典奢華的象征與最新流行趨勢
tiffany 官網
Мы занимаемся вывозом мусора газелями разной модификации от стандартных 6 м3 до больших 14 м3 есть также грузчики, работаем по Московской области. Преимущества вывоза мусора газелью в том, что она самая дешёвая услуга вывоза мусора.
Эффективный способ вывоза мусора газелью, не требующий лишних усилий.
Надежность газели при перевозке мусора, которые важно знать.
Основные типы мусора, которые можно вывозить газелью, и какие ограничения существуют.
Минимальные стоимость услуги по вывозу мусора газелью, сотрудничая с профессионалами.
Как избежать неприятностей при вывозе мусора газелью, учитывая все нюансы.
вывоз строительного мусора газелью вывоз старой мебели на свалку .