蓝桥杯第七届省赛 模拟风扇控制系统 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相关推荐

  1. 蓝桥杯单片机第七届省赛-模拟风扇控制系统

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...

  2. 蓝桥杯第七届省赛java组大题解析(“取球博弈”??难度,“压缩变换”三星难度)

    第六题 题目: 方格填数 如下的10个格子    +--+--+--+    | 0| 1| 2| +--+--+--+--+ | 3| 4| 5| 6| +--+--+--+--+ | 7| 8| ...

  3. 蓝桥杯第七届省赛JAVA真题----剪邮票

    剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是 ...

  4. 蓝桥杯第七届省赛JAVA真题----压缩变换

    压缩变换 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些序列的特点是,后面 ...

  5. 蓝桥杯第七届省赛JavaB组题解

    第一题 /** 煤球数目有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共 ...

  6. 蓝桥杯第七届国赛JAVA真题----七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  7. 蓝桥杯第七届省赛 风扇模拟系统

    [冉冰的成长日记001] 咕咕咕,鸽了17天我他喵终于写了一篇省赛.写这篇文章的目的是用以复习和留念一下,如若能帮助到他人和下一届的学弟学妹自然是极好的.QAQ话不多说,上代码. #include&l ...

  8. 蓝桥杯第七届国赛JAVA真题----平方末尾

    平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, ...

  9. 蓝桥杯第七届国赛JAVA真题----机器人塔

    机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上.     B 只能站在 AB 或 BA 的肩上. ...

  10. 蓝桥杯嵌入式——第七届省赛-模拟液位检测告警系统

    第七届省赛-模拟液位检测告警系统 目录 第七届省赛-模拟液位检测告警系统 一.赛题分析 二.代码 一.赛题分析 这一届和上一届也就是第六届一样,没有涉及到定时器得PWM输出和输入捕获.主要得赛题难度是 ...

最新文章

  1. Facial keypoints detection Kaggle 竞赛系列
  2. php获取日期对应的星期,PHP获取日期对应的星期
  3. pandas使用fillna函数将dataframe中缺失值替换为空字符串(replace missing value with blank string in dataframe)
  4. Z-STACK的一些小内容
  5. html语言剖析,HTML语言剖析(十三) 其他标记
  6. Android之GridLayoutManager.setSpanSizeLookup问题
  7. php的在线问卷调查_基于php技术的问卷调查系统
  8. 用 Python 手写机器学习最简单的 KNN 算法
  9. 不用图像文件的圆角解决--跳起按钮制作(html)
  10. javascript 搜索并高亮显示
  11. 视频分析服务器作用,如何选择合适的视频分析解决方案?
  12. 【POJ2155】Matrix(二维区间修改+单点查询---二维树状数组)
  13. 小型游戏《笑傲江湖之精忠报国》全过程_01
  14. Word 2019 插入参考文献
  15. 深入浅出 - Android系统移植与平台开发(四)- Android启动流程
  16. 香港希玛眼科集团第二届眼科精准医疗国际会议在京启幕
  17. 自学python书籍_自学python看什么书
  18. S3C2440上LCD驱动(FrameBuffer)实例开发讲解(一)
  19. 堆栈内存的分析以及作用域的详解
  20. python爬取pbf格式的矢量瓦片并转换为shp使用

热门文章

  1. 深入理解示波器探头各种作用及工作原理
  2. 【送你一张门票】七牛云带你去看杭州云栖大会
  3. case when 多条件查询
  4. Python应用练习题(第一期)——基本语句练习
  5. Servlet 三大作用域
  6. 计算机桌面窗口管理器在哪,W7系统禁用dwm桌面窗口管理器的操作方法
  7. 小程序***已设置仅在企业微信中运行,请前往企业微信打开该小程序,企业微信设置显示小程序。
  8. win10打印服务器纸规格没有显示,win10系统打印机添加了自定义的纸张却找不到的操作办法...
  9. math.floor()函数
  10. 清除node本地缓存