蓝桥杯第七届省赛 模拟风扇控制系统 by YYC
蓝桥杯第七届省赛 模拟风扇控制系统 by YYC
onewire.c:
/*程序说明: 单总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机日 期: 2011-8-9
*/
#include "reg52.h"sbit DQ = P1^4; //单总线接口//单总线延时函数
void Delay_OneWire(unsigned int t); //STC89C52RC//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;} Delay_OneWire(5);}return dat;
}//DS18B20设备初始化
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ; Delay_OneWire(5);return initflag;
}void Delay_OneWire(unsigned int t) //STC89C52RC
{t*=11;while(t--);
}float read_temp(void)
{float temp;unsigned char low,high=0;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);low=Read_DS18B20();high=Read_DS18B20();temp=(high<<8|low)*0.0625;return temp;
}
common.c
#include<common.h>uchar dsp_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
uchar dsp_show[8];uchar temp;
uint remain_time;
uint level=0;
uint temp_flag=0;
uint mode=1;
uint count_temp=0; //用来计时
uchar L1,L2,L3;
uchar pwm_duty;
uint count_sec=0;
uint count_key=0;void system_init(void)
{uchar i;P0=0xff;P2=0x80;P2=0;P0=0x00;P2=0xa0;P2=0;for(i=0;i<70;i++)temp=read_temp()+0.5;Timer0Init();
}void Timer0Init(void) //100微秒@11.0592MHz
{AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0xAE; //设置定时初值TH0 = 0xFB; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0=1;EA=1;
}void tm0(void) interrupt 1
{static uchar bit_com=0,count_dsp;if(++count_dsp<=pwm_duty) //控制占空比P34=1; //题目要求P34输出脉冲调制信号elseP34=0;P0=~(4*L3+2*L2+L1);P2=0x80;P2=0; //控制LED P0=0;P2=0xc0;P2=0;P0=dsp_show[bit_com];P2=0xe0;P2=0;P0=1<<bit_com;P2=0xc0;P2=0;if(bit_com==7)bit_com=0;elsebit_com++;if(count_sec==10000) //因为是100ms中断,所以中断10000次达到1s,remain_time--{count_sec=0;if(remain_time>0) //一定注意要大于0才能继续减remain_time--; }count_temp++; //计时用于温度count_sec++; //计时用于1scount_key++; //为了按键防抖}void scan_button(void)
{static uint key_stat=0;uchar key_val=0,key_x=0,key_y=0;P3=0x0f;P4=0x00;if(!P30) key_x=3;else if(!P31) key_x=2;else if(!P32) key_x=1;else if(!P33) key_x=0;P3=0xf0;P4=0xff;if(!P34) key_y=4;else if(!P35) key_y=3;else if(!P42) key_y=2;else if(!P44) key_y=1;key_val=key_x+key_y*4;switch(key_stat) //按键防抖{case 0:if(key_val!=0) //第一次检测key_stat=1; //有输入则由阶段0进入阶段1break;case 1:if(key_val==0) key_stat=0; //认为为抖动,清零else{key_stat=2; //进入阶段2switch(key_val){case 4: //模式切换,1,2,3对应三种模式if(mode==3)mode=0;mode++;break; //记住要写break!!!case 5: //定时按键count_sec=0;if(level==0)remain_time=0;else if(level==1)remain_time=60;else if(level==2)remain_time=120;level++;if(level==3)level=0;break; //记得要写break!!!case 6: //停止按键remain_time=0;break; //记得要写break!!!case 7: //室温按键temp_flag=~temp_flag;break; //记得要写break!!!}}case 2:if(key_val==0) key_stat=0;}
}
main.c
#include <main.h>extern uchar dsp_code[];
extern uchar dsp_show[8];extern uchar temp;
extern uint remain_time;
extern uint level;
extern uint temp_flag;
extern uint mode;
extern uint count_temp; //用来计时
extern uchar L1,L2,L3;
extern uchar pwm_duty;
extern uint count_sec;
extern uint count_key;void main()
{system_init();while(1){if(temp_flag) //显示温度{if(count_temp>7499){count_temp=0;temp=read_temp()+0.5;}dsp_show[0]=dsp_code[11]; //-dsp_show[1]=dsp_code[4]; //4dsp_show[2]=dsp_code[11]; //-dsp_show[3]=dsp_code[10]; //熄灭dsp_show[4]=dsp_code[10]; //熄灭dsp_show[5]=dsp_code[temp/10]; //温度dsp_show[6]=dsp_code[temp%10];dsp_show[7]=0xc6; //C}else{dsp_show[0]=dsp_code[11]; //-dsp_show[1]=dsp_code[mode]; //模式dsp_show[2]=dsp_code[11]; //-dsp_show[3]=dsp_code[10]; //熄灭dsp_show[4]=dsp_code[remain_time/1000%10]; dsp_show[5]=dsp_code[remain_time/100%10];dsp_show[6]=dsp_code[remain_time/10%10];dsp_show[7]=dsp_code[remain_time%10];}if(remain_time==0) //当前remain_time为0{L1=0;L2=0;L3=0;pwm_duty=0;}else //信号频率为1kHz,则时间中断为100微妙,100微妙*10=1ms{if(mode==1){L1=1;L2=0;L3=0;pwm_duty=2;}else if(mode==2){L1=0;L2=1;L3=0;pwm_duty=3;}else if(mode==3){L1=0;L2=0;L3=1;pwm_duty=7;}}if(count_key>99) //10ms执行一次scan_button{count_key=0;scan_button();}}
}
蓝桥杯第七届省赛 模拟风扇控制系统 by YYC相关推荐
- 蓝桥杯单片机第七届省赛-模拟风扇控制系统
九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...
- 蓝桥杯第七届省赛java组大题解析(“取球博弈”??难度,“压缩变换”三星难度)
第六题 题目: 方格填数 如下的10个格子 +--+--+--+ | 0| 1| 2| +--+--+--+--+ | 3| 4| 5| 6| +--+--+--+--+ | 7| 8| ...
- 蓝桥杯第七届省赛JAVA真题----剪邮票
剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...
- 蓝桥杯第七届省赛JAVA真题----压缩变换
压缩变换 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面 ...
- 蓝桥杯第七届省赛JavaB组题解
第一题 /** 煤球数目有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共 ...
- 蓝桥杯第七届国赛JAVA真题----七星填数
七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...
- 蓝桥杯第七届省赛 风扇模拟系统
[冉冰的成长日记001] 咕咕咕,鸽了17天我他喵终于写了一篇省赛.写这篇文章的目的是用以复习和留念一下,如若能帮助到他人和下一届的学弟学妹自然是极好的.QAQ话不多说,上代码. #include&l ...
- 蓝桥杯第七届国赛JAVA真题----平方末尾
平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, ...
- 蓝桥杯第七届国赛JAVA真题----机器人塔
机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上. B 只能站在 AB 或 BA 的肩上. ...
- 蓝桥杯嵌入式——第七届省赛-模拟液位检测告警系统
第七届省赛-模拟液位检测告警系统 目录 第七届省赛-模拟液位检测告警系统 一.赛题分析 二.代码 一.赛题分析 这一届和上一届也就是第六届一样,没有涉及到定时器得PWM输出和输入捕获.主要得赛题难度是 ...
最新文章
- Facial keypoints detection Kaggle 竞赛系列
- php获取日期对应的星期,PHP获取日期对应的星期
- pandas使用fillna函数将dataframe中缺失值替换为空字符串(replace missing value with blank string in dataframe)
- Z-STACK的一些小内容
- html语言剖析,HTML语言剖析(十三) 其他标记
- Android之GridLayoutManager.setSpanSizeLookup问题
- php的在线问卷调查_基于php技术的问卷调查系统
- 用 Python 手写机器学习最简单的 KNN 算法
- 不用图像文件的圆角解决--跳起按钮制作(html)
- javascript 搜索并高亮显示
- 视频分析服务器作用,如何选择合适的视频分析解决方案?
- 【POJ2155】Matrix(二维区间修改+单点查询---二维树状数组)
- 小型游戏《笑傲江湖之精忠报国》全过程_01
- Word 2019 插入参考文献
- 深入浅出 - Android系统移植与平台开发(四)- Android启动流程
- 香港希玛眼科集团第二届眼科精准医疗国际会议在京启幕
- 自学python书籍_自学python看什么书
- S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
- 堆栈内存的分析以及作用域的详解
- python爬取pbf格式的矢量瓦片并转换为shp使用
热门文章
- 深入理解示波器探头各种作用及工作原理
- 【送你一张门票】七牛云带你去看杭州云栖大会
- case when 多条件查询
- Python应用练习题(第一期)——基本语句练习
- Servlet 三大作用域
- 计算机桌面窗口管理器在哪,W7系统禁用dwm桌面窗口管理器的操作方法
- 小程序***已设置仅在企业微信中运行,请前往企业微信打开该小程序,企业微信设置显示小程序。
- win10打印服务器纸规格没有显示,win10系统打印机添加了自定义的纸张却找不到的操作办法...
- math.floor()函数
- 清除node本地缓存