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;
- }
探索時尚新境界nike sb zoom blazer
好玩的游戏go rummy
時尚與功能的完美融合 adidas 鞋子
好玩的遊戲 new rummy app
探索潮流之巔:Nike Air Force 聯名的無限魅力 stussy x nike air force 1
Nike Air Force 女鞋:經典重塑,時尚之選 air force哪裡買最便宜?
Hi there! I just wanted to ask if you ever have
any issues with hackers? My last blog (wordpress) was hacked and
I ended up losing many months of hard work due to no data backup.
Do you have any methods to stop hackers?
вывод из запоя капельница вывод из запоя капельница .
купить диплом физкультуры russa-diploms.ru .
вывод из запоя в клинике спб вывод из запоя в клинике спб .
вывод из запоя цены http://www.vyvod-iz-zapoya-v-sankt-peterburge16.ru .
Печально, но факт: большинство из нас так никогда и не раскроет всех своих способностей и возможностей. Более того, под давлением общественных стереотипов многие отказываются от того, что идеально им подходит. Безусловно, есть люди, искренне разделяющие общепринятые убеждения, однако для многих «правильный» образ жизни – лишь результат фрустрации, обиды или разочарования от бесплодных попыток найти свое место в жизни. Все мы наделены могучим даром созидания, но он бесполезен, пока у нас нет четкого представления о правильном именно для нас способе принимать решения и воплощать их. Тип Дизайна Человека подскажет вам, как действовать креативно, масштабно, динамично и впечатляюще успешно Карта Дизайна Человека или Бодиграф
«Дизайн человека» — сложная система самопробуждения, которая позволяет найти внутренний авторитет и опереться на него Карта Дизайна Человека или Бодиграф
Профессиональный сервисный центр по ремонту Apple iPhone в Москве.
Мы предлагаем: сервисный центр iphone в москве
Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!
Каждый из нас стремится понять, кто он такой, каково его место в мире и каково его предназначение Дизайн Человека подробно
Временная регистрация в Москве: Быстро и Легально!
Ищете, где оформить временную регистрацию в Москве? Мы гарантируем быстрое и легальное оформление без очередей и лишних документов. Ваше спокойствие – наша забота!
Минимум усилий • Максимум удобства • Полная легальность
Свяжитесь с нами прямо сейчас!
.
как купить диплом медсестры landik-diploms.ru .
Сколько стоит диплом высшего и среднего образования и как его получить?
купить диплом московская область arusak-diploms.ru .
Я не заслуживаю. Я недостойна. Все, что со мной происходит – лишь череда случайных совпадений. На самом-то деле я ничего из себя не представляю, и вот-вот наступит тот страшный момент, когда вся правда обо мне всплывет Дизайн человека (Human design) – расчет карты онлайн
Сильные стороны: какие навыки нужно развивать для профессионального и личностного роста Консультация Дизайн Человека – human design
Многие люди очень стараются не видеть реальности, поскольку считают, что объективное восприятие помешает им достигнуть намеченных целей — счастья, успеха и власти. Они думают, что для достижения всего этого следует смотреть на себя и на мир через искажающий объектив Дизайн Человека подробно
бизнес план цветочного магазина для социального контракта бизнес план цветочного магазина для социального контракта .
агентство интернет маркетинга http://www.marketing99.ru/ .
снятие ломки наркологом снятие ломки наркологом .
Дизайн человека помогает осознать, что делает нас особенными и как мы взаимодействуем с миром Дизайн человека (Human design) – расчет карты онлайн
Лучший сервис доставки цветов в Нижнем Новгороде, с нами легко и просто.
Доставка цветов в Нижнем Новгороде откроет мир нежности и красоты, не упустите шанс сделать приятное.
Самый широкий ассортимент цветов для доставки в Нижнем Новгороде, закажите прямо сейчас.
Очаруйте своих близких уникальной доставкой цветов в Нижнем Новгороде, доставляем красоту прямо к вам домой.
Сделайте приятный сюрприз с доставкой цветов в Нижнем Новгороде, заказывайте у нас.
Закажите доставку цветов в Нижнем Новгороде прямо сейчас, качество и свежесть гарантированы.
Удивите близких невероятной доставкой цветов в Нижнем Новгороде, заказывайте цветы прямо сейчас.
Сделайте день особенным: доставка цветов в Нижнем Новгороде, удивите своих близких прекрасным подарком.
Осуществим мечту о цветах в Нижнем Новгороде, сделайте заказ у нас.
цветы нижний новгород доставка https://dostavka-cvetov-nizhnij-novgorod.ru/ .
Советы по выбору материала для обивки мебели, как не ошибиться
перетяжка мебели недорого https://csalon.ru/ .
Идеальные варианты тканей для перетяжки мебели|Как выбрать мягкую мебель для дома: лучшие ткани|Советы по перетяжке мягкой мебели для начинающих|Мастер-класс по перетяжке мягкой мебели|Ткани для перетяжки мебели: как выбрать правильно|Цены на перетяжку мебели в вашем городе|Как найти лучшего мастера по перетяжке мебели|Творческие подходы к перетяжке мягкой мебели|Необычные способы перетяжки мягкой мебели: советы дизайнеров|Перетяжка мебели: новая жизнь для старых предметов|Перетяжка кресел и стульев: как сделать качественно|Как самостоятельно перетянуть мебель: пошаговая инструкция|Идеи для обновления интерьера с помощью перетяжки мебели|Советы по подбору цветовой гаммы для мебели|Преимущества перетяжки мебели своими руками|Перетяжка мягкой мебели: стильные тренды и модные идеи|Скрытые опасности перетяжки мягкой мебели: что нужно знать|Как подобрать узор ткани для перетяжки мягкой мебели|Перетяжка мягкой мебели: с чего начать и как продолжить
снятие ломки наркологом снятие ломки наркологом .
снятие ломок снятие ломок .
снятие ломок на дому снятие ломок на дому .
лечение алкоголизма в стационаре http://vyvod-iz-zapoya-v-stacionare-voronezh15.ru/ .
снятие ломки наркозависимого снятие ломки наркозависимого .
oral capecitabine 500 mg – order naproxen 250mg online cheap danocrine where to buy
Рекомендуем – пуховики мужские брендовые
Холостяк 2024 13 сезон
Сервисный центр предлагает замена клавиатуры fujitsu siemens stylistic st5111 замена разъема зарядки fujitsu siemens stylistic st5111
вывод из запоя нижний новгород вывод из запоя нижний новгород .
выведение из запоя в клинике выведение из запоя в клинике .
вывод из запоя нижний новгород вывод из запоя нижний новгород .
купить диплом в геленджике landik-diploms.ru .
Официальная покупка диплома ПТУ с упрощенной программой обучения
за выводом из запоя в стационаре за выводом из запоя в стационаре .
Trouvez votre parfait
Couteau a genoise
a ajouter a votre arsenal culinaire
Как получить диплом техникума с упрощенным обучением в Москве официально
вывод из запоя в стационаре Самары вывод из запоя в стационаре Самары .
Как получить диплом техникума с упрощенным обучением в Москве официально
speciesgame.com/forum/viewtopic.php?f=2&t=12033
Официальная покупка школьного аттестата с упрощенным обучением в Москве
ukrom.in.ua/users/327#google_vignette
Как не попасть впросак при покупке диплома колледжа или ПТУ в России
thefreedommovement.ca/read-blog/3894