#include #include #include #define uchar unsigned char #define uint unsigned int #写数据地址 #读数据地址 #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 s定义端口 sbit RW = P1^1; sbit EN = P2^5; sbit DU = P2^6; sbit WE = P2^7; sbit DS=P2^2; sbit FM=P2^3; s时钟 加上后可以关掉DS1302芯片输出 s定义总线连接端口 sbit Scl=P2^1; sbit LED1=P1^0; 定义指示灯端口 sbit LED2=P1^2; sbit LED3=P1^4; sbit LED4=P1^6; //sbit LED5=P1^1; //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //键盘引脚定义 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #define KeyPort P3 b定义AD采样标志位 uint temp; uchar ADtemp; //定义中间变量 uchar w; uchar w1=30; uchar y; uchar y1=80; uchar num; void DelayUs2x(unsigned char t) while(--t); } /*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) { 大致延时1mS } } //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //按键扫描函数,返回扫描键值 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> unsigned char KeyScan(void) { unsigned char keyvalue; if(KeyPort!=0xff) } void keyvalue() 键盘功能程序 { 循环调用按键扫描 } 烟雾采集程序*/ /*------------------------------------------------ 初始化定时器1 ------------------------------------------------*/ void Init_Timer0(void) { TMOD= 0x01; TH0=0xff; TL0=0x00; 优先级 TR0=1; } /*------------------------------------------------ 启动IIC总线 ------------------------------------------------*/ void Start(void) { } /*------------------------------------------------ 停止IIC总线 ------------------------------------------------*/ void Stop(void) { /*------------------------------------------------ 应答IIC总线 ------------------------------------------------*/ /*------------------------------------------------ 非应答IIC总线 ------------------------------------------------*/ /*------------------------------------------------ 发送一个字节 ------------------------------------------------*/ /*------------------------------------------------ 读入一个字节并返回 ------------------------------------------------*/ /*------------------------------------------------ 写入DA数模转换值 ------------------------------------------------*/ 写入芯片地址 写入控制位,使能DAC输出 写数据 /*------------------------------------------------ 读取AD模数转换的值,有返回值 ------------------------------------------------*/ Start(); //写入芯片地址 写入选择的通道,本程序只用单端输入,差分部分需要自行添加 的值分别为0、1、2、3,分别代表1-4通道 Send(AddRd); //读入地址 Data=Read(); //读数据 return Data; //返回值 void yanwuget() 获得烟雾值 { if(ADFlag) //定时采集输入模拟量 } 数据采集*/ v延时函数 { uint i; while(count) { } } void Init_Com(void) 串口初始化,波特率9600,方式1 { } void dsreset(void)//发送复位和初始化命令 { uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } { DS=0;i++; //i++ for delay } { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { 读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); } v向DS18B20写一位 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { if(testb) //写1 DS=0; //写0 } } void tmpchange(void) //DS18B20 begin change { dsreset(); delay(1); tmpwritebyte(0xcc); // address all drivers on bus tmpwritebyte(0x44); // initiates a single temperature conversion } { float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; temp=temp|a; tt=temp*0.05; temp=tt*10+0.5; return temp; } { uchar sn1,sn2; dsreset(); delay(1); tmpwritebyte(0x33); sn1=tmpread(); sn2=tmpread(); } 显示程序 void cmg(void)//数码管锁存函数 关时钟DS1302 { DU=1; P0=0x00; DU=0; WE=1; P0=0x00; WE=0; RST=0; 关时钟DS1302 } /*------------------------------------------------ 判忙函数 ------------------------------------------------*/ bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); } /*------------------------------------------------ 写入命令函数 ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { while(LCD_Check_Busy()); //忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /*------------------------------------------------ 写入数据函数 ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /*------------------------------------------------ 清屏函数 ------------------------------------------------*/ 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) 表示第一行 else 表示第二行 while (*s) } /*------------------------------------------------ 写入字符函数 ------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y == 0) else LCD_Write_Data( Data); } /*------------------------------------------------ 初始化函数 ------------------------------------------------*/ void LCD_Init(void) { LCD_Write_Com(0x38); /*显示模式设置*/ LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ LCD_Write_Com(0x0C); /*显示开及光标设置*/ void wendudisplay(uint temp) 温度显示程序 { } void yanwudisplay(uint temp) 浓度显示程序 { } void beep(void) 蜂鸣器函数 { FM=0; delay(100); FM=1; } void baojing(void) 报警程序 { } /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main(void) { 关数码管,点阵函数 清屏 避免初始温度报警 避免初始烟雾报警 while (1) { } void Timer0_isr(void) interrupt 0 using 1//定时器1执行数码管动态扫描 { 重新赋值 if(j==200) 定时置位AD采样标志位 }下载本文