#include
#include
#include
#include "18b20.h"
#include "delay.h"
#include "key.h"
sbit RS = P2^5; //定义LCD1602端口
sbit RW = P2^6;
sbit EN = P2^7;
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P0
#define TIME 10000 //与PWM频率有关 12M晶振 10000周期为 10ms 频率100Hz
sbit PWMOUT=P3^6;
int PWM_Z;//PWM脉冲占空比
long PWM_D;//定时器赋值相关
int count=0;//进入定时中断计数
int TH=30; //温度上限
int TL=10; //温度下限
unsigned char KeyValue; //返回按键值
int temp,temp1;
float temperature;
char displaytemp[16];//定义显示区域临时存储数组
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
unsigned char LCD_Status;
RS = 0;
RW = 1;
EN = 1;
DelayMs(1);
LCD_Status = P0;
EN = 0;
return LCD_Status;
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
while((LCD_Check_Busy()&0x80)==0x80);
RS = 0;
RW = 0;
EN = 0;
P0 = com;
EN = 1;
DelayMs(1);
EN = 0;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while((LCD_Check_Busy()&0x80)==0x80);
RS = 1;
RW = 0;
EN = 0;
P0 = Data;
EN = 1;
DelayMs(1);
EN = 0;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x); //表示第一行
}
else
{
LCD_Write_Com(0xC0 + x); //表示第二行
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
//LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
DelayMs(5);
LCD_Write_Com(0x06); /*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
DelayMs(5);
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
LCD_Init();
Init_Timer0();
PWMOUT=0;
while (1)
{
KeyValue=KeyScan();
if(KeyValue!=0)//如果有键按下
{
Keyprocessing(KeyValue); //键值处理
}
temp1=ReadTemperature(); //读取温度值
if(temp1>0)
{ if(temp1<2000)temp=temp1;}
temperature=(float)temp*0.0625;
sprintf(displaytemp,"Temp=%3.1f",temperature);//
LCD_Write_String(0,1,displaytemp);// 显示温度值
PWM_Z=(temperature-TL)/(TH-TL)*100; //计算占空比
if(PWM_Z>100)PWM_Z=100;
if(PWM_Z<0)PWM_Z=0;
if(PWM_Z==100)
{
TR0=0;
ET0=0;
EA=0; //
PWMOUT=1;
}
if(PWM_Z==0)
{
TR0=0;
ET0=0;
EA=0; //
PWMOUT=0;
}
if((PWM_Z>0)&&(PWM_Z<100))
{
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
sprintf(displaytemp,"P=%3d",PWM_Z);//
LCD_Write_String(10,1,displaytemp);// 显示占空比
sprintf(displaytemp,"TH=%2d",TH);//
LCD_Write_String(0,0,displaytemp);// 显示温度上限
sprintf(displaytemp,"TL=%2d",TL);//
LCD_Write_String(10,0,displaytemp);// 显示温度下限
DelayMs(300);
}
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
if(PWMOUT==0) //如果正输出低电平 设置高电平延时时间
{
PWM_D=TIME/100*PWM_Z;
TH0=(65536-PWM_D)/256; //
TL0=(65536-PWM_D)%256;
PWMOUT=1;
}
else //如果正输出高电平 设置低电平延时时间
{
PWM_D=TIME/100*PWM_Z;
//PWM_D=20000-PWM_D;
TH0=(65536-(TIME-PWM_D))/256; //
TL0=(65536-(TIME-PWM_D))%256;
PWMOUT=0;
}
}
上一篇:基于单片机+pt100热敏电阻的体温计
下一篇:基于单片机的直流电机PWM调速设计
推荐阅读
史海拾趣
CP Technology Inc一直注重产品质量和客户服务。公司建立了严格的质量管理体系,从原材料采购到生产过程控制,再到产品检测和售后服务,都力求做到精益求精。这种对品质的执着追求赢得了客户的广泛赞誉和口碑传播,为公司的长期发展奠定了坚实基础。
Deltron Emcon,即现在的DEM Manufacturing,起源于四家英国制造企业的合并。这些企业分别是成立于1946年的Deltron Components,专业音频连接器和压铸盒制造商Roxburgh EMC(成立于1969年),EMC滤波器和组件的制造商Media Products(成立于1990年),以及广播跳线产品制造商BES Electronics(成立于1982年)。这些公司在各自的领域内都有着丰富的经验和卓越的技术,合并后,DEM Manufacturing凭借这些优势,在电子行业中迅速崭露头角。
在国内市场取得一定成绩后,艾迈斯(AMASS)公司开始积极拓展国际市场。他们通过与国外知名企业的合作,成功将产品打入国际市场。同时,艾迈斯还针对不同国家和地区的市场需求,推出了定制化的产品和服务,进一步提升了公司在国际市场上的竞争力。如今,艾迈斯的产品已经远销全球多个国家和地区,成为了国际市场上备受瞩目的品牌之一。
在产品研发和技术创新的同时,艾迈斯(AMASS)公司也注重品牌建设和市场推广。公司积极参加各种行业展会和交流活动,与业界同行建立了广泛的合作关系。同时,艾迈斯还通过广告宣传、媒体报道等多种方式提升品牌知名度和影响力。这些努力使得艾迈斯在电子行业中的地位逐渐提升,成为了业内颇具影响力的品牌之一。
ALCOA,全称美国铝业公司,其发展历程可追溯至19世纪末。当时,铝在地球上蕴藏丰富,但提炼单质的铝却十分困难。年轻的查尔斯·霍尔(Charles Hall)发明了用电解方式生产单质铝的方法,并于1889年获得专利。随后,他与艾尔弗雷德·亨特(Alfred E. Hunt)船长合作,投资建厂,开始批量生产铝。这一技术创新不仅推动了铝产量的快速上升,还使得铝这种曾经比金子还贵的金属逐渐走进了人们的日常生活。
意华在发展过程中,积极拓展国内外市场,与华为、中兴、富士康等知名企业建立了长期稳定的合作伙伴关系。这些合作伙伴的加入,不仅为意华带来了更多的订单和业务机会,也促进了公司技术的交流和提升。通过与这些行业巨头的合作,意华在电子连接器领域的影响力逐渐扩大。
一、 IC 设计领域简介 (一)模拟与混号讯号电路设计 IC 电路可分为为模拟 IC 与数字 IC 两大类,以及两者兼具的混合讯号等三种。模拟与数字的差异在于数字的讯号是以 0 、 1 的非连续方式传递、运算及储存。而模拟讯号则是以连续性的型式来传递, ...… 查看全部问答∨ |
|
.Net是架构于操作系统上的平台,它是一套虚拟机,其核心功能由一系列运行在用户层的Dll文件实现。它的出现,大大减少了软件开发的工作量,但是也同时带来了版权保护难的新问题。不过,.Net最突出的跨平台优势使得它不能被编译成本地代码,而要以中 ...… 查看全部问答∨ |
|
今年电赛做智能小车 要求两辆小车需要无线通信 想用PT2262发送4位同步数据 但是PT2294接收不回数据 2262我用了4位发送位 1个VCC 1个GND 2294我也用上述6个引脚 空着1个VT 求解! … 查看全部问答∨ |
安装了aStudio4.13却无法启动,谁能帮帮我? 提示“应用程序配置错误,不能启动” 我没有配置过什么啊?都是按默认的路径和状态来装的,一直“下一步”到最后的。… 查看全部问答∨ |
module test2( input [15:0] xinput, output reg [15:0] xoutput); reg [15:0] routput ; always @ (xinput) begin case (xinput) 16\'b???????????????0 : routput <= 16\'b111111111 ...… 查看全部问答∨ |
|
新手上路,想做一个ASK的解调电路,感觉分立元件搭建检波电路性能不会很好,,听说用MC3361可以实现,但没看懂怎么用,MC3361引脚的10到14引脚用得上吗?是不是直接第9脚就可以输出了? 请问还有什么其他的推荐芯片?(最好外围器件少一 ...… 查看全部问答∨ |
\' TMS320VC5502调试SDRAM时, , 两个问题, 求解 1,写一个字节,结果所以内存全部变掉; 2,0x1e0000到0x200000之间的内存变成----了 … 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 协作机器人渗透全球市场,占有率逐步上升
- Toposens推出采用英飞凌XENSIV™MEMS麦克风的新型3D超声波传感器
- 罗克韦尔自动化助力南京浦园入选福布斯中国年度Top10榜单
- 全新版本莱迪思sensAI解决方案集合加速下一代客户端设备
- 艾尼克斯总裁兼CEO展望更好服务于客户的电子产品价值链
- 英伟达收购Arm:美国也表示担忧,中国还没启动反垄断审查
- 工信部将加强锂离子电池行业管理 引导企业减少单纯扩大产能制造项目
- 发布不到24小时就被打脸,Meta的元宇宙触觉手套是抄的?
- 艾尼克斯任命 Michael Cappello 先生为其首席商务官(CBO)
- ROHM开发出轻松实现小型薄型设备无线供电的无线充电模块