南理工紫金单片机课程设计

任务: 采用温度传感器和单片机等电路独立设计并制作一个简易数字式温度控制装置。

资源下载地址:

https://download.csdn.net/download/qq_40707685/10764080

单路温度

双路温度

 部分代码:

#include<reg51.h>
#include<intrins.h>
#include <stdio.h>
#include<absacc.h>
#include<math.h>


#define PIN0 XBYTE[0X7FF8]       //ADC0809的绝对地址
typedef unsigned char byte;
typedef unsigned int word;
unsigned char xuehao[]="000000000 ";
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //数码管熄灭


sbit int0=P3^2;                  //调整设定温度和显示当前温度转换
sbit green=P3^4;                 //加热电阻丝
sbit red=P3^5;                   //风扇
sbit ck=P2^4;                    //串口发送开关
sbit jia=P2^5;
sbit jian=P2^6;
byte l,m,flag1,flag2=0;
byte T,sdH=60,sdL=40;                      //设定温度
                 

float result=0;
float result_reg;
byte i;
/*****************************************************
函数名:延时子函数
调  用:delay(?)
参  数:延时时长
返回值:无
结  果:延时
备  注:无
******************************************************/
void delay(int n)
{
  while(n--);
}

/*****************************************************
函数名:初始化子函数
调  用:init()
参  数:无
返回值:无
结  果:对外部中断0,外部中断1,定时器中断0和串口寄存器进行初始化
备  注:无
*******************************************************/
void init()
{
     
     TMOD=0x01;
     TH0=(65536-50000)/256;       //定时器0计数初值设置,0.5秒定时
     TL0=(65536-50000)%256;
     
     EX0=1;
     EX1=1;
     ET0=1;
     PX0=0;
     PX1=0;
     PT0=1;
     PT1=1;
     EA=1;
     TR0=1;
    
     IT1=1;                       
     IT0=1;
}
/*****************************************************
函数名:AD采集电压子程序
调  用:samp()
参  数:无
返回值:采集到的电压值模拟量
结  果:采集电压
备  注:无
*******************************************************/
float samp()
{
   
           PIN0=0xFF;
           for(i=0;i<0x9f;i++);
		                                      
            result_reg=PIN0;
            result=result_reg*5/255;
           return result;
 }

/*****************************************************
函数名:电压转换为温度子函数
调  用:jisuan(?)
参  数:采集的电压值
返回值:无
结  果:得到当前温度的十位和个位,以及设定温度的十位和个位
备  注:无
*******************************************************/
void jisuan(float result)
{	
	float T1,T2,T3=0.0;
//     if(result>0.00&&result<1.416)
//     {
//		T=48.78*result-39.07;
//	 }
//	 else if(result>1.416&&result<2.968)
//     {
//		T=19.33*result+2.629;
//	 }
//	 else if(result>2.968&&result<3.418)
//     {
//		T=31.11*result-32.338;
//	 }
//	 else if(result>3.418&&result<5.00)
//    {
//		T=105.26*result-285.79;
//	}            //把电压转换为温度
	
	T1 = 11.247*result*result;
	T2 = 13.168*result;
	T3 = T1+T2+25.689;
	if(T3>100)
	{T3 -= 59;}
	else if(T3>80)
	{T3 -= 40;}
	else if(T3>60)
	{T3 -= 20;}
	else if(T3>50)
	{T3 -= 10;}
	else 
	{T3 -= 6;}
	
	T=(char)T3;
	
}

/*****************************************************
函数名:继电器驱动发光二极管子函数
调  用:jidianqi()
参  数:无
返回值:无
结  果:当前温度>设定温度,红灯亮;当前温度<设定温度,绿灯亮
备  注:无
*******************************************************/
void jidianqi()
{   if(T>sdH){red=1;green=0;}
    else if(T<sdL){red=0;green=1;}
    else  {red=0;green=0;}
 }
/******************************************************
函数名:动态显示
调  用:display(?,?,?)
参  数:当前温度的十位,个位和大写C
返回值:无
结  果:数码管动态显示温度
备  注:无
*******************************************************/
void display(byte wendu)
{       
       unsigned char a,b;
       a=wendu/10;
        b=wendu%10;
       
        P1=0xff;			     
        P2=0xf7;
        P1=tab[12];//显示大写'C'
        delay(100);
        P1=0xff;			     
        P2=0xfb;
        P1=0x9c;//显示'o'
        delay(100);
        P1=0xff;
        P2=0xfd;
        P1=tab[b];
        delay(100);
        P1=0xff;
        P2=0xfe;
        P1=tab[a];
       delay(100);
        P1=0xff;  
}


void displayH(byte wendu)
{       
       unsigned char a,b;
        a=wendu/10;
        b=wendu%10;
	
        P1=0xff;			     
        P2=0xf7;
        P1=0x89;//显示大写'H'
        delay(100);
        P1=0xff;			     
        P2=0xfb;
        P1=0xbf;//显示大写'-'
        delay(100);
        P1=0xff;
    	  P2=0xfd;
        P1=tab[b];
        delay(100);
        P1=0xff;
        P2=0xfe;
        P1=tab[a];
	      delay(100);
        P1=0xff; 
		 
		
   	 
}

void displayL(byte wendu)
{       
	   
	    unsigned char a,b;
	      a=wendu/10;
        b=wendu%10;
	
	      P1=0xff;			     
        P2=0xf7;
        P1=0xc7;//显示大写'L'
        delay(100);
        P1=0xff;			     
        P2=0xfb;
        P1=0xbf;//显示大写'-'
        delay(100);
        P1=0xff;
    	  P2=0xfd;
        P1=tab[b];
        delay(100);
        P1=0xff;
        P2=0xfe;
        P1=tab[a];
	      delay(100);
        P1=0xff; 	 
}


byte anjian(byte wendu)
{
	if(jia==0)
	{
		delay(100);
		if(jia==0)
		{
			wendu++;
			if(wendu>90)
				wendu=90;
		}
	}
	while(!jia);
    if(jian==0)
	{
		delay(100);
		if(jian==0)
		{
			wendu--;
			if(wendu<0)wendu=0;
		}
	}
	while(!jian);

    return wendu;

}
void chuankou(float wendu)
{
	char t=0;
	byte a,b;
	if(ck==0)
	{
	    delay(100);
		if(ck==0)
		{
		     TMOD=0x21;
			 SCON=0x40;
			 PCON=0;
			 TH1=0xFD;
			 TL1=0xFD;
			 TR1=1;
			for(t=0;t<9;t++)
			{SBUF=xuehao[t];while(!TI);TI=0;} 
			SBUF=':';while(!TI);TI=0; 
			a=(byte)wendu/10;
			 b=(byte)wendu%10;
			 SBUF=0x30+a;while(!TI);TI=0;
			 SBUF=0x30+b;while(!TI);TI=0;
			 SBUF='C';while(!TI);TI=0;
			 SBUF=' ';while(!TI);TI=0;
			
			
			TR1=0;
		}
		while(!ck);
	}
}
/******************************************************
函数名:主函数
调  用:main()
参  数:无
返回值:无
结  果:0.5秒采集电压,并显示,可调设定温度,按键发送当前温度给PC机
备  注:无
*******************************************************/
void main(void)
{
    byte temp;
    red=0;green=0;
	  l=10;
	  
    init();
     
     while(1)
    {
       if(flag1==1)
         { 
           flag1=0;
           result=samp();
					 jisuan(result); 
         }
		switch(flag2)
		{
			case 0:  display(T);break;
				        
			case 1:  displayH(sdH);
				         sdH=anjian(sdH);
				         break;
				
			case 2:  temp=sdL;
				     temp=anjian(temp);
					 if(temp>sdH)
					{
						displayL(temp);
						sdL=sdH;
					}									 
                     else  
					 {
					 displayL(temp);
					 sdL=temp;
					 }
				         
				         
				         break;
			}			
			
       jidianqi();
	     chuankou(T);
   
    }
}
/******************************************************
函数名:t0定时器中断函数
参  数:无
返回值:无
结  果:0.5秒定时
备  注:无
*******************************************************/  
void t0() interrupt 1 
{  
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    l--;
    if(l==0) 
    {flag1=1;l=10;}
}


/******************************************************
函数名:外部中断0中断函数
参  数:无
返回值:无
结  果:模式选择
备  注:无
*******************************************************/

void int00() interrupt 0 
{	 
	if(int0==0)
	{
		delay(30);
       if(int0==0)
		{  
				flag2++;
				if(flag2==3)
					flag2=0;
                                 
		}
    }
}

完整资源截图:

 

 资源下载地址:https://download.csdn.net/download/qq_40707685/10764080

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
南理工初试试题,很完整的试题哦南京理工大学课程考试试卷 (学生考试用) 课程名称: 数据结构 学分: 3 大纲编号 062204 试卷编号: 考试方式: 闭卷 满分分值: 100 考试时间: 120 分钟 组卷日期: 2006年5月18日 组卷教师(签字) 张宏 审定人(签字) 王树梅 学生班级: 计算机学院 04级 学生学号: 学生姓名: 一、 选择题(1.5*20=30分) 1.若以{4,5,6,3,8}作为叶子结点的权值构造哈夫曼树,则带权路径长度是 A) 55 B)68 C)59 D)28 2. 无向图G=(V,E),其中:V={ a,b,c,d,e,f} , E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图进行广度优先遍历,得到的顶点序列正确的是 A) a,b,e,c,d,f B) a,c,f,e,b,d C) a,e,b,c,f,d D) a,e,d,f,c,b 3. 对关键字码集合K={53,30,37,12,45,24,96},从空二叉树出发建立与集合K对应的二叉排序树,若希望得到树的高度最小,应选择下列哪个输入序列 。 A)45,24,53,12,37,96,30 B)12,24,30,37,45,53,96 C)37,24,12,30,53,45,96 D)30,24,12,37,45,96,53 4. 已知一组数{20,8,6,2,30,1}的排序过程为: (1)20,8,6,2,30,1 (2)1,8,6,2,30,20 (3)1,2,6,8,30,20 (4)1,2,6,8,20,30 问它是下面那一种排序: A)快速排序 B) 直接插入排序 C) 起泡排序 D) 选择排序 5.计算机算法必须具备输入、输出和 等五个特征。 A) 可行性、可移植性和可扩充性 B)可行性、确定性和有穷性 C) 确定性、有穷性和稳定性 D)易读性、稳定性和安全性 6.设哈希表长为14,哈希函数是H(key)=key,表中已有数据的关键字为15,38,61,84共四个,现要将关键字为26的结点加到表中,用二次探测再散列法解决冲突,则放入的位置是 A) 8 B) 3 C)2 D)9 7.在一个单链表中,若要删除p所指结点的后继结点,则执行 。 A) p=p->next; p->next=p->next->next B) free(p->next) (C语言格式) 或 delete p->next (C++语言格式) C) p=p->next->next; D) p->next=p->next->next 8. 数组A的每个元素需要4个字节存放,数组有8行 10列,若数组以行为主顺序存放在内存SA开始的存储区中,则A中8行5列的元素的位置是 A) SA+74 B)SA+292 C)SA+296 D)SA+300 9-10.在一棵7阶B树中,若在某结点中插入一个新关键字而引起该结点分裂,则此结点中原有 (1) 个关键字;若在某结点中删去一个关键字而导致结点合并,则该结点中原有的关键字的个数是 (2) 。 (1) A)6 B)5 C)4 D)3 (2) A)4 B)3 C)2 D)1 11.已知四个元素a,b,c,d依次进栈,进栈过程中可出栈,下面那一种出栈顺序是不正确的 A)a,d,c,b B)b,c,d,a C)c,a,d,b D)c,d,b,a 12.队列操作的原则是 。 A) 先进先出 B) 后进先出 C) 只能进行插入 D)只能进行删除 13.在有n 个结点的二叉链表中,值为空链域的个数为 A)n-1 B)2n-1 C)n+1 D)2n+1 14.具有1080个结点的完全二叉树的深度为 A) 12 B)10 C)11 D)13 15.若已知一个栈的入栈序列是元素1,2,3,....,n,其输出序列为p1,p2,p3,…pn,若p1是n,则pi是( ) A) i B)n-i C)n-i+1 D)不确定 16.对于一个具有n个顶点的无向图,若采用邻接矩阵表示,则该矩阵的大小是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值