📄 com.c
字号:
/*******************************************************************************
********************************************************************************
* 描述: *
* 单片机接收主机的数据,然后将数据传送到P0口, 并传回给主机; *
* 当按下K1时, 单片机发送字串"welcome! www.willar.com\n\r" 给主机 *
* *
*
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
#include <iccard.h>
unsigned char key_s, key_v, tmp;
char code str[] = "I am a good boy!!! \n";
#define uint unsigned int
#define uchar unsigned char
#define nop() _nop_();_nop_();
sbit key0=P1^0;
uint16 temper;
sbit CLK=P0^6;
sbit DAT=P0^4;
sbit RCLK=P0^7;
//sbit CS=P2^3;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭
void send_str();
bit scan_key();
void key_pro();
void delayms(unsigned char ms);
void send_char(unsigned char txd);
sbit K1 = P1^0;
void delay(uint j)//延时
{ uchar m;
for(;j>0;j--)
{
for(m=0;m<=60;m++)
{;}
}
}
//=====================================================
void sendbyte(uchar byte)
{
uchar num,i;
num=tab[byte];
for(i=0;i<8;i++)
{
CLK=0;
DAT=num&0x80;
num=num<<1;
CLK=1;
}
// RCLK=0;
// nop();
// nop();
// RCLK=1;
}
void out595(void)
{
RCLK=1;
nop();
RCLK=0;
}
void display(uchar number)
{
uchar sw,gw;
sw=number/10;
gw=number-(10*sw);
sendbyte(gw);
sendbyte(sw);
//delay(18);
out595();
}
//=====================================================================
//=====================================================
//串口初始化
void initcom(void)
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0x0F3; // 波特率2400
TL1 = 0x0F3;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
ES=1; //允许串行口中断
TR1 = 1; // 启动定时器1
IE = 0x00; // 禁止任何中断
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
void send_str()
// 传送字串
{
unsigned char i = 0;
while(str[i] != '\0')
{
SBUF = str[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
bit scan_key()
// 扫描按键
{
key_s = 0x00;
key_s |= K1;
return(key_s ^ key_v);
}
void key_pro()
{
if ((key_v&0x01)==0)
{ send_str();}
}
uchar init_1820()//初始化1820
{
dat_1820=1;
delay(8);
dat_1820=0;
delay(80);
dat_1820=1;
delay(14);
if(dat_1820==0)
{
delay(20);
return(1);
}
else return(2);
dat_1820=1;
delay(20);
}
void wr_1820(uchar x)//写入1字节数据
{
uchar i;
for(i=8;i>0;i--)
{
dat_1820=1;
delay(1);
dat_1820=0;
delay(1);
if(x&0x01)dat_1820=1;
else dat_1820=0;
delay(20);
dat_1820=1;
// delay(1);
x>>=1;
}
}
void rd_1820()//读1字节数据
{
uint16 i;
uchar j;
i=0;
for(j=16;j>0;j--)
{
dat_1820=1;
delay(1);
dat_1820=0;
delay(1);
dat_1820=1;
if(dat_1820)
{
i>>=1;
i=i|0x8000;
}
else i>>=1;
delay(20);
dat_1820=1;
}
temper=i;
}
void get_temper()//进行温度测量并取温度数据
{
uchar i;
i=init_1820();//
if(i==1)//判断1820是否存在
{
wr_1820(0xcc);//跳过rom
wr_1820(0x44);//发送温度转换指令
delayms(3);
init_1820();
wr_1820(0xcc);//跳过rom
wr_1820(0xbe);//去温度数据
rd_1820();//读出数据
}
}
void init_sys()//系统初始化设置
{
// P0=0;//P0口清零
P2=0x86;//屏蔽其它模块
P1=P1&0X01;;//
}
void main()
{ uchar t;
uint sw,gw,k;
initcom();
init_sys();
while(1)
{
get_temper();
if(!key0)
{
delayms(5);
if(!key0)
{
t=temper/16;
k=(temper*10/100);
sw=k/10;
gw=k%10;
send_char(t);
WriData(sw+0x30);WriData(gw+0x30);
}
}
delayms(5);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -