c语言程序加仿真,求助。C语言的程序和仿真

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include "msp430x14x.h"

#define uint unsigned int

#define uchar unsigned char

#define DQ_OUT P1DIR|=BIT0

#define DQ_IN P1DIR&=~BIT0

#define DQ_LOW P1OUT&=~BIT0

#define DQ_HIGH P1OUT|=BIT0

#define DQ_DATA P1IN&BIT0

//共阳数码管编码表

uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,3

0x99,0x92,0x82,0xF8,//4,5,6,7

0x80,0x90,0x88,0x83,//8,9,A,b

0xC6,0xA1,0x86,0x8E,//C,d,E,F

0xBF,0xFF};//-,全灭

uchar Bit[4]={0,0,0,17}; //数码管各位显示的数字

uchar BitCode=0x01; //数码管位码初值

uchar wei[]={0x01,0x02,0x04,0x08};

uint j=0;

uint l=0;

uchar MSB; //温度高字节

uchar LSB; //温度低字节

int t1=0; //温度整数部分数值

uint t2=0; //温度小数部分数值

uchar flag; //负温度标志

//时钟初始化函数

void InitClock(void){

BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2 开启 LFXT1 工作在低频模式 ACLK

//不分频 最高的标称频率

DCOCTL=DCO2+DCO1+DCO0;//DCO 为最高频率

do{

IFG1&=~OFIFG;//清除振荡器失效标志

for(uint i=255;i>0;i--);

}while(IFG1&OFIFG);//判断XT2 是否起振

BCSCTL2=SELM1+SELS;//MCLK SMCLK 时钟源为TX2CLK 不分频

}

//端口初始化函数

void InitPort(void){

P2SEL=0x00;//P2 口所有引脚设置为一般的IO 口

P3SEL=0x00;//P3 口所有引脚设置为一般的IO 口

P2DIR=0xFF;//P2 口所有引脚设置为输出方向

P3DIR=0xFF;//P3 口所有引脚设置为输出方向

P2OUT=0x00;//P2 口先输出低电平

P3OUT=0x80;//P3 口先输出低电平

P5SEL&=~BIT7;//P5. 设7置为一般的IO 口

P5DIR|=BIT7;//P5.7 设置为输出方向

P5OUT&=~BIT7;//P5.7 输出低电平来使能74HC573 来驱动数码管

}

//ms 级延时子程序

void DelayMs(uint ms){

while(ms--){

for(uint i=0;i<700;i++);

}

}

//数码管扫描显示程序

void Display(void){

for(uchar i=0;i<4;i++){

P3OUT=BitCode; //输出位码

if(i==3){ //输出段码,如果第三位显示小数点

P2OUT=Code[Bit[i]]&0x7F;

}else{

P2OUT=Code[Bit[i]];

}

BitCode<<=1;//位码右移一位

if(BitCode==0x10) BitCode=0x01;

DelayMs(2); //延时1ms

//P2OUT=0XFF;

}

}

//10us 级延时子程序

void Delayus(uint us){

while(us--){

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

_NOP();_NOP();_NOP();_NOP();_NOP();

}

}

//初始化DS18B20

void DS18B20Init(void){

DQ_OUT;//设置为输出方向

DQ_LOW;//拉低总线

Delayus(50);

DQ_HIGH;//释放总线

Delayus(6);

DQ_IN;//设置为输入方向

while(DQ_DATA);//等待应答信号

while(~DQ_DATA);//等待释放总线

}

//读一个字节

uchar ReadByte(void){

uchar i;

uchar ReadData=0;

for(i=0;i<8;i++){

DQ_OUT;

DQ_LOW;

ReadData>>=1;

DQ_HIGH;

Delayus(1);

DQ_IN;

if(DQ_DATA) ReadData|=0x80;

Delayus(6);

}

return ReadData;

}

//写一个字节

void WriteByte(uchar WriteData){

uchar i;

uchar tmpData;

for(i=0;i<8;i++){

tmpData=WriteData&0x01;

WriteData>>=1;

DQ_OUT;

DQ_LOW;

if(tmpData){

DQ_HIGH;

}

else{

DQ_LOW;

}

Delayus(5);

DQ_HIGH;

}

}

//温度计算程序

void GetT(){

if((MSB&0xF0)>0){ //判断是否为负温度

flag=1;

}else{

flag=0;

}

if(flag){ //如果为负温度取反加1

MSB=~MSB;

LSB=~LSB+1;

}

t1=MSB<<4; //得到温度整数部分

t1|=(LSB>>4);

t2=(uint)((LSB&0x0F)*0.0625*10000); //得到温度小数部分并扩大10000 倍

//计算各位数码管要显示的数值

if(flag){

Bit[1]=16; //如果为负温度则显示"-"

}else{

Bit[1]=t1/100;

}

Bit[2]=t1%100/10;

Bit[3]=t1%10;

//Bit[4]=t2/1000;

//Bit[5]=t2%1000/100;

//Bit[6]=t2%100/10;

//Bit[7]=t2%10;

}

void main(){

WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

InitClock();

InitPort();

_DINT();//关闭中断

j=0;l=0;

while(1){

DS18B20Init();

WriteByte(0xCC); //跳过ROM 配置

WriteByte(0x44);//启动温度转换

DS18B20Init();

WriteByte(0xCC);

WriteByte(0xBE); //读温度寄存器

LSB=ReadByte(); //读温度数据低字节

MSB=ReadByte(); //读温度数据高字节

GetT(); //计算温度

Display();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值