欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機C語言怎么將字符型變量改成整型變量?
[打印本頁]
作者:
q10047790434
時間:
2018-8-17 19:58
標題:
單片機C語言怎么將字符型變量改成整型變量?
程序在下面
就是我想將單價和總價變量改成整型的 但直接改又編譯不了
請問改怎么解決
#include <reg52.h>
#include <intrins.h>
#include <string.h>
bit bdata flag_key;
#include "main.h"
#include "LCD1602.h"
#include "HX711.h"
#include "keyboard.h"
#include "eeprom52.h"
#define uchar unsigned char
#define uint unsigned int
unsigned long HX711_Buffer = 0;
unsigned long Weight_Maopi = 0;
unsigned long Weight_Maopi_0 = 0;
unsigned int qupi=0;
long Weight_Shiwu = 0;
//鍵盤處理變量
unsigned char keycode;
unsigned char DotPos; //小數點標志及位置
uint GapValue,GapValue1;
unsigned char idata price; //單價,長整型值,單位為分
unsigned char idata money; //總價,長整型值,單位為分
//定義標識
volatile bit FlagTest = 0; //定時測試標志,每0.5秒置位,測完清0
volatile bit FlagKeyPress = 0; //有鍵按下標志,處理完畢清0
//校準參數
//因為不同的傳感器特性曲線不是很一致,因此,每一個傳感器需要矯正這里這個參數才能使測量值很準確。
//當發現測試出來的重量偏大時,增加該數值。
//如果測試出來的重量偏小時,減小改數值。
//該值可以為小數
//#define GapValue 349
sbit LED=P1^1;
volatile bit ClearWeighFlag = 0; //傳感器調零標志位,清除0漂
/******************把數據保存到單片機內部eeprom中******************/
void write_eeprom()
{
SectorErase(0x1000);
GapValue1=GapValue&0x00ff;
byte_write(0x2000, GapValue1);
GapValue1=(GapValue&0xff00)>>8;
byte_write(0x2001, GapValue1);
byte_write(0x2060, a_a);
}
/******************把數據從單片機內部eeprom中讀出來*****************/
void read_eeprom()
{
GapValue = byte_read(0x2001);
GapValue = (GapValue<<8)|byte_read(0x2000);
a_a = byte_read(0x2060);
}
/**************開機自檢eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 1) //新的單片機初始單片機內問eeprom
{
GapValue = 3600;
a_a = 1;
write_eeprom(); //保存數據
}
}
//顯示單價,單位為元,四位整數,兩位小數
void Display_Price()
{
LCD1602_write_com(0x8c);
LCD1602_write_data(price/100 + 0x30);
LCD1602_write_data(price%100/10 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(price%10 + 0x30);
}
//顯示重量,單位kg,兩位整數,三位小數
void Display_Weight()
{
LCD1602_write_com(0x83);
LCD1602_write_data(Weight_Shiwu/1000 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
LCD1602_write_data(Weight_Shiwu%10 + 0x30);
}
//顯示總價,單位為元,四位整數,兩位小數
void Display_Money()
{
// unsigned int i,j;
if (money>9999) //超出顯示量程
{
LCD1602_write_com(0x80+0x40+6);
LCD1602_write_word("---.-");
return;
}
if (money>=1000)
{
LCD1602_write_com(0x80+0x40+6);
LCD1602_write_data(money/1000 + 0x30);
LCD1602_write_data(money%1000/100 + 0x30);
LCD1602_write_data(money%100/10 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(money%10 + 0x30);
}
else if (money>=100)
{
LCD1602_write_com(0x80+0x40+6);
LCD1602_write_data(0x20);
LCD1602_write_data(money%1000/100 + 0x30);
LCD1602_write_data(money%100/10 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(money%10 + 0x30);
}
else if(money>=10)
{
LCD1602_write_com(0x80+0x40+6);
LCD1602_write_data(0x20);
LCD1602_write_com(0x80+0x40+7);
LCD1602_write_data(0x20);
LCD1602_write_data(money%100/10 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(money%10+ 0x30);
}
else
{
LCD1602_write_com(0x80+0x40+6);
LCD1602_write_data(0x20);
LCD1602_write_com(0x80+0x40+7);
LCD1602_write_data(0x20);
LCD1602_write_com(0x80+0x40+8);
LCD1602_write_data(0 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(money%10 + 0x30);
}
}
//數據初始化
void Data_Init()
{
price = 0;
DotPos = 0;
}
//定時器0初始化
void Timer0_Init()
{
ET0 = 1; //允許定時器0中斷
TMOD = 1; //定時器工作方式選擇
TL0 = 0xb0;
TH0 = 0x3c; //定時器賦予初值
TR0 = 1; //啟動定時器
}
//定時器0中斷
void Timer0_ISR (void) interrupt 1 using 0
{
uchar Counter;
TL0 = 0xb0;
TH0 = 0x3c; //定時器賦予初值
//每0.5秒鐘刷新重量
Counter ++;
if (Counter >= 10)
{
FlagTest = 1;
Counter = 0;
}
}
//按鍵響應程序,參數是鍵值
//返回鍵值:
// 1 2 3 10 //10:清零重量,兼去皮功能
// 4 5 6 11 //11:清除單價
// 7 8 9 12 //12:顯示數值偏大調節按鍵
// 14 0 15 13 //14:無功能(用于擴展)15:小數點 13:顯示數值偏小調節按鍵
void KeyPress(uchar keycode)
{
switch (keycode)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9: //目前在設置整數位,要注意price是整型,存儲單位為分
if (DotPos == 0)
{ //最多只能設置到千位
if (price<100)
{
price=price*10+keycode*10;
/*輸入第一個數字時,price是等于0的,當第一次輸入一個數字,例如輸入5,那么計算:price=price*10+5*10=50
我們看到液晶上顯示的是05.0,但是在程序里直接處理小數顯示是比較麻煩的,所以我們是將這個數乘以10,擴大10倍后處理的
那么當第二次輸入數字時,例如輸入4,那么計算:price=50*10+4*10=540,液晶顯示的就是54.0
*/
}
}//目前在設置小數位
else if (DotPos==1) //小數點后第一位
{
price=price+keycode;
DotPos=2;
}
Display_Price();
break;
case 10: //去皮鍵
if(qupi==0)
qupi=Weight_Shiwu;
else
qupi=0;
Display_Price();
// FlagSetPrice = 0;
DotPos = 0;
break;
case 11: //刪除鍵
price=0;
DotPos=0;
Display_Price();
break;
case 12: //加
if(GapValue<10000)
GapValue++;
break;
case 13: //減
if(GapValue>1)
GapValue--;
break;
case 15: //小數點按下
DotPos = 1; //小數點后第一位
break;
}
}
//****************************************************
//主函數
//****************************************************
void main()
{
init_eeprom(); //開始初始化保存的數據
Init_LCD1602(); //初始化LCD1602
EA = 0;
Data_Init();
Timer0_Init();
//初中始化完成,開斷
EA = 1;
// Get_Maopi();
LCD1602_write_com(0x80); //指針設置
LCD1602_write_word(" Welcome To Use "); //
LCD1602_write_com(0x80+0x40); //指針設置
LCD1602_write_word("Electronic Scale");
// Delay_ms(2000);
Get_Maopi();
LCD1602_write_com(0x80); //指針設置
LCD1602_write_word("WE:0.000 PR:00.0");
LCD1602_write_com(0x80+0x40); //指針設置
LCD1602_write_word("MONEY: 0.00 ");
Display_Price();
// Get_Maopi(); //稱毛皮重量
while(1)
{
//每0.5秒稱重一次
if (FlagTest==1)
{
Get_Weight();
FlagTest = 0;
}
keycode = Getkeyboard();
//有效鍵值0-15
if (keycode<16)
{
KeyPress(keycode);
Buzzer=0;
Delay_ms(100);
Buzzer=1;
while(keycode<16)
{
if(keycode==12||keycode==13)
{
Buzzer=0;
Delay_ms(10);
Buzzer=1;
KeyPress(keycode);
Get_Weight();
flag_key=1;
}
keycode = Getkeyboard();
}
write_eeprom(); //保存數據
}
}
}
//****************************************************
//稱重
//****************************************************
void Get_Weight()
{
Weight_Shiwu = HX711_Read();
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //獲取凈重
Weight_Shiwu = (unsigned int)((float)Weight_Shiwu*10/GapValue)-qupi; //計算實物的實際重量
if(Weight_Shiwu > 10000) //超重報警
{
Buzzer = !Buzzer;
LED=!LED;
LCD1602_write_com(0x83);
LCD1602_write_word("-.---");
}
else
{
if(Weight_Shiwu==0)
LED=1;
else if(Weight_Shiwu>0)
LED=0;
Buzzer = 1;
Display_Weight();
money = Weight_Shiwu*price/1000; //money單位為分
//顯示總金額
Display_Money();
}
}
//****************************************************
//獲取毛皮重量
//****************************************************
void Get_Maopi()
{
unsigned char clear;
mm: Weight_Maopi_0 = HX711_Read();
for(clear=0;clear<10;clear++)
{
Buzzer=1;
LED=1;
Delay_ms(100);
LED=0;
Delay_ms(100);
}
Weight_Maopi = HX711_Read();
if(Weight_Maopi/GapValue!=Weight_Maopi_0/GapValue)
goto mm;
Buzzer=0;
Delay_ms(500);
Buzzer=1;
}
//****************************************************
//MS延時函數(12M晶振下測試)
//****************************************************
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
復制代碼
作者:
angmall
時間:
2018-8-18 08:34
unsigned char idata price; //單價,長整型值,單位為分
unsigned char idata money; //總價,長整型值,單位為分
unsigned char是一個8位的二進制碼 他可以存儲字符代表的ascii碼也可以表示一個0-255的數字,一般變量的大小不超過255的話盡量用char,因為這樣可以節省一些RAM
2000在作為money的入參時,會被強制轉換成unsigned char,此時超出范圍的部門會被忽略。具體來說,2000的二進制值是111 1101 0000,在強制轉換后,實際函數內部使用的 money的二進制值是1101 0000,也就是十進制的208。
因此不能達到正確的結果。
對于這種值域由大變小的數據類型轉換,編譯器一般都會有警告的。除非明確知道轉換的結果對自己的代碼無不良影響,應避免這種轉換。
作者:
passer2008
時間:
2018-8-18 11:43
可以試試強制類型轉換,但是就象一樓說的,一偶風險哦。
作者:
ppsppsppsxz
時間:
2018-8-18 12:45
強制轉換類型,但是可能導致丟失數據最后輸出錯誤
作者:
zhaoyinlo
時間:
2018-8-31 17:10
可以用 atoi函數 在stdlib.h中也可以自己寫一個函數 我寫的如下:
int my_atoi(const char *str)
{
if(str == NULL) {return -1;} int t = 1, sum = 0;char *str1 = str; int len = strlen(str1) - 1;
while(len >= 0) {sum += my_Ctoi(str1[len]) * t; t *= 10; len--;}
return sum;
}
int my_Ctoi(char c){ return c - '0';} //將字符轉換為整數;
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1