8051f330_18b20temper.txt
来自「这是一个用8051F330编写的测温程序」· 文本 代码 · 共 277 行
TXT
277 行
//-----------------------------------------------------------------------------
// UART.c
//-----------------------------------------------------------------------------
// 版权归新华龙电子有限公司所有
// 作者:Robi Ken
// 功能:串口通讯
// 目标板: C8051F33x
// 日期: 2004.12.28
// 开发工具: Silicon Laboratories IDE
//-----------------------------------------------------------------------------
// 所包含的头文件
//------------------------------------------------------------------------
#include <c8051f330.h>
#include <stdio.h>
//-----------------------------------------------------------------------------
// 常量定义
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 // 系统工作频率
#define BAUDRATE 9600 // 串口工作波特率
#define TIMER2_RATE 1000 // 定时器2溢出标志位频率
//-----------------------------------------------------------------------------
// F33x’定时器2的16位SFR
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca;
sfr16 TMR2 = 0xcc;
sbit LED0=P0^6;
sbit LED1=P0^5;
sbit DQA=P1^0; //定义通信端口
unsigned char Result_hi,Result_low;
//--------------------------------------------------------------------------------
// 功能函数
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void Timer2_Init (int);
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
//延时函数
void DelayUs(unsigned int i)
{
while(i--);
}
void DelayMs(unsigned int n)//延时(n)MS
{
unsigned int i;
for(;n>0;n--)
{
for(i=1289;i>0;i--);
}
}
//初始化函数
bit Init_DSA(void)
{
DQA = 1; //DQA复位
DelayUs(1); //稍做延时
DQA = 0; //单片机将DQA拉低
DelayUs(600); //精确延时 大于 480us
DQA = 1; //拉高总线
DelayUs(120);
if(DQA) return 0;
// x=DQA; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
DelayUs(240);
DQA=1;
return 1;
}
//读一个字节
unsigned char RCharA(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQA = 1;
DelayUs(1);
DQA = 0; // 给脉冲信号
dat>>=1;
DelayUs(2);
DQA = 1; // 给脉冲信号
if(DQA)dat|=0x80;
DelayUs(65);
}
return(dat);
}
//写一个字节
void WCharA(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQA=1;
DelayUs(1);
DQA = 0;
DQA = dat&0x01;
DelayUs(10);
if(dat&0x01)DQA=1;
else DQA=0;
dat>>=1;
DelayUs(65);
}
DQA=1;
}
//启动温度转换函数;
void StartTA(void)
{
Init_DSA();
WCharA(0xCC); // 跳过读序号列号的操作
WCharA(0x44); // 启动温度转换
}
//读取温度
void ReadTA(void)
{
Init_DSA();
WCharA(0xCC); //跳过读序号列号的操作
WCharA(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
Result_low=RCharA(); //读取温度值低位
Result_hi=RCharA(); //读取温度值高位
}
unsigned int DispTA(void)
{
//voliti
volatile unsigned int c=0,TA=0;
unsigned char H=0,M=0,L=0;
float TA_R=0;
TA=Result_hi*256;
TA=TA+Result_low;
TA_R=TA*0.0625;
TA=(unsigned int) TA_R;
return TA;
}
void main (void) {
PCA0MD &= ~0x40; // 禁止看门狗
PORT_Init(); // 初始化端口I/O
SYSCLK_Init (); // 初始化系统时钟
Timer2_Init(SYSCLK/TIMER2_RATE); // 初始化 Timer 2
UART0_Init(); // 串口初始化
while(1)
{
unsigned int wen=0;
unsigned char inS[10];
StartTA();
DelayMs(150);
ReadTA();
wen=DispTA();
// sprintf(inSeqence,"%2d key12345678910415",keyin); //若数组为5CHAR 则有10个字符;
sprintf( inS, "%3d lichao",wen);
// printf ("time is %s\n", wen);
//TIMER2_RATE ,控制发送的波特率。
printf("a=%3d\n", wen); /*结果输出十进制整数a=1234*/
// printf (" KEN :) Happy new year! \n "); // 输出字符
//printf (ins[0]);
// printf (ins[1]);
//printf (" KEN :) Happy new year! ");
// printf (wen," KEN :) Happy new year! ");
DelayMs(1200);
// sprintf( inSeqence, "%s", "I am 8th of a char Array!\n" );//正确
}
}
//-----------------------------------------------------------------------------
// 端口初始化
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
//
// P0.4 - UART TX
// P0.5 - UART RX
// P3.3 - LED
void PORT_Init (void)
{
P0SKIP |= 0x01;
P0MDIN |= 0x01; // 配置P0.0为模拟出入
P0MDOUT |= 0x10; // 使能 UTX 为推挽输出
// P1MDOUT |= 0x08; // 使能 LED 为推挽输出
P1MDIN=0xff;
P1MDOUT=0xff;
XBR0 = 0x01; // 使能 UART on P0.4(TX) and P0.5(RX)
XBR1 = 0x40;
}
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
OSCICN |= 0x03; // 配置内部振荡器的的最大频率
RSTSRC = 0x04; // 使能始终丢失检测寄存器
}
//-----------------------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10;
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON &= ~0x0B;
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B;
CKCON |= 0x09;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B;
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B;
CKCON |= 0x02;
}
TL1 = TH1;
TMOD &= ~0xf0;
TMOD |= 0x20;
TR1 = 1;
TI0 = 1;
}
//-----------------------------------------------------------------------------
// 时钟2中断
//-----------------------------------------------------------------------------
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // 停止时钟2;清除 TF2H 和TF2L;
CKCON |= 0x10;
TMR2RL = -counts;
TMR2 = TMR2RL;
ET2 = 0;
TR2 = 1;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?