单片机c语言编程300例编程题,求大神

推荐到广播
1521 人聚集在这个小组
(huo动小王子)
(酷毙小龙霞)
(叶凌霜寒)
(种花家。)
第三方登录:(饼干有毒就别碰)
(奶蓋綠茶?)
第三方登录:【图片】求大神帮忙了.我们考试题【单片机学习吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:16,833贴子:
求大神帮忙了.我们考试题收藏
求大神帮忙了.我们考试题
登录百度帐号推荐应用【求助帖】求大神帮忙看段程序【单片机吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:139,941贴子:
【求助帖】求大神帮忙看段程序收藏
#include&reg52.h&bit cmdArrived = 0;unsigned char *prtTunsigned char cntTxd = 0;unsigned char cmdIndex = 0;unsigned char array1[1] = {1};unsigned char array2[2] = {1, 2};unsigned char array3[4] = {1, 2, 3, 4};unsigned char array4[8] = {1, 2, 3, 4, 5, 6, 7, 8};void ConfigUART(unsigned int baud);void main(){EA = 1;ConfigUART(9600);while(1){if(cmdArrived){cmdArrived = 0;switch(cmdIndex){case 1:prtTxd = array1;cntTxd = sizeof(array1);TI = 1;case 2:prtTxd = array2;cntTxd = sizeof(array2);TI = 1;case 3:prtTxd = array3;cntTxd = sizeof(array3);TI = 1;case 4:prtTxd = array4;cntTxd = sizeof(array4);TI = 1;default:}}}}void ConfigUART(unsigned int baud){SCON = 0x50;TMOD &= 0x0F;TMOD |= 0x20;TH1 = 256 - (/2/16)/TL1 = TH0;ET1= 0;ES = 1;TR1 = 1;}void InterruptUART() interrupt 4{if(RI){RI = 0;cmdIndex = SBUF;cmdArrived = 1;}if(TI){TI = 0;if(cntTxd & 0){SBUF = *prtTcntTxd--;prtTxd++;}}}
为用户提供各种低成本,低功耗,低能耗,功能强的微控制器解决方案.恩智浦微控制器,高性能,设计新颖,性能稳定,价格超低,欲购从速,欢迎垂询!
有一个疑问想请教大家:在串口中断函数中:void InterruptUART() interrupt 4{
cmdIndex=SBUF;
cmdArrived=1;
if(cntTxd&0)
SBUF=*ptrT
}}我的疑问是字节发送过程中if(cntTxd&0)可以起到循环判断的作用吗?一直等到一个数组发送完才结束!
#include &reg52.h&bit cmdArrived = 0;
//命令到达标志,即接收到上位机下发的命令unsigned char cmdIndex = 0; //命令索引,即与上位机约定好的数组编号unsigned char cntTxd = 0;
//串口发送计数器unsigned char *ptrT
//串口发送指针unsigned char array1[1] = {1};unsigned char array2[2] = {1,2};unsigned char array3[4] = {1,2,3,4};unsigned char array4[8] = {1,2,3,4,5,6,7,8};void ConfigUART(unsigned int baud);void main(){
//开总中断
ConfigUART(9600);
//配置波特率为9600
if (cmdArrived)
cmdArrived = 0;
switch (cmdIndex)
ptrTxd = array1;
//数组1的首地址赋值给发送指针
cntTxd = sizeof(array1); //数组1的长度赋值给发送计数器
//手动方式启动发送中断,处理数据发送
ptrTxd = array2;
cntTxd = sizeof(array2);
ptrTxd = array3;
cntTxd = sizeof(array3);
ptrTxd = array4;
cntTxd = sizeof(array4);
}}/* 串口配置函数,baud-通信波特率 */void ConfigUART(unsigned int baud){
//配置串口为模式1
TMOD &= 0x0F;
//清零T1的控制位
TMOD |= 0x20;
//配置T1为模式2
TH1 = 256 - (/32)/
//计算T1重载值
TL1 = TH1;
//初值等于重载值
//禁止T1中断
//使能串口中断
//启动T1}/* UART中断服务函数 */void InterruptUART() interrupt 4{
//接收到字节
//清零接收中断标志位
cmdIndex = SBUF;
//接收到的数据保存到命令索引中
cmdArrived = 1;
//设置命令到达标志
//字节发送完毕
//清零发送中断标志位
if (cntTxd & 0)
//有待发送数据时,继续发送后续字节
SBUF = *ptrT
//发出指针指向的数据
//发送计数器递减
//发送指针递增
同求解哈。。郁闷ing.
已经解决了,谢谢。
有个叫向sbuf赋值就中断的叫法!所以……
为什么啊?
登录百度帐号推荐应用求助,做51单片机仿真时出错,求哪位大神帮看下什么问题 - proteus论坛|仿真论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
求助,做51单片机仿真时出错,求哪位大神帮看下什么问题
12:30:49  
4.png (30.49 KB, 下载次数: 7)
12:25 上传
在做基于AT89C52的温湿度测量计的仿真,仿真电路如图。
点击开始仿真以后,1602没有任何显示,调节温湿度传感器,马上就弹出
2.png (34.35 KB, 下载次数: 7)
12:27 上传
调节1602引脚3的电位器调节对比度,就弹出
3.png (44.36 KB, 下载次数: 7)
12:27 上传
,两个点确定完以后不是未响应就是程序自动关闭,求大神指教下到底是什么问题T^T已被逼疯
& & 要是有会单片机的大神在也麻烦帮忙看下电路和程序有没有什么问题,先行谢过~
12:31:13  
#include&reg52.h&
#include&intrins.h&
#include&math.h&
#define uchar unsigned char
#define uint unsigned int
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06
#define STATUS_REG_R 0x07
#define MEASURE_TEMP 0x03
#define MEASURE_HUMI 0x05
#define RESET 0x1e
sbit SCK =P1^0;
sbit DATA=P1^1;
sbit led1=P1^7;
sbit&&rs=P2^3; //H数据寄存器,L命指令寄存器
sbit&&en=P2^5; //高脉冲使能,使能脉宽最小150ns,写操作下降沿,读操作高电平有效
sbit&&rw=P2^4; //1进行写操作,0进行读操作
uchar code table_temp[]=& TEMP: &;
uchar code table_humi[]=& HUMI: &;
uchar code table_c[]=& C&&&;
uchar code table_p[]=& %&&&;
uchar error=0;
void delayms(uint z)
& & & & uint i,j;
& & & & for(i=z;i&0;i--)
& & & & for( j=110;j&0;j--);
void transstart() //启动时序
& & & & SCK=1;
& & & & _nop_();
& & & & DATA=0;
& & & & _nop_();
& & & & SCK=0;
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();
& & & & SCK=1;
& & & & _nop_();
& & & & DATA=1;
& & & & _nop_();
& & & & SCK=0;
uchar write_byte(uchar value) //写入命令子函数
& & & & for(i=0x80;i&0;i=i/2)
& & & & & & & & if(i&value)
& & & & & & & & & & & & DATA=1;
& & & & & & & & else
& & & & & & & & & & & & DATA=0;
& & & & & & & & SCK=1;
& & & & & & & & _nop_();
& & & & & & & & _nop_();
& & & & & & & & _nop_();
& & & & & & & & SCK=0;
& & & & DATA=1;
& & & & SCK=1;
& & & & error=DATA;
& & & & SCK=0;
uchar read_byte(bit ack) //从传感器读数据
& & & & uchar i,val=0;
& & & & DATA=1;
& & & & for(i=0x80;i&0;i=i/2)
& & & & & & & & SCK=1;
& & & & & & & & if(DATA)
& & & & & & & & val=val|i;
& & & & & & & & SCK=0;
& & & & DATA=!
& & & & SCK=1;
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();
& & & & SCK=0;
& & & & DATA=1;
void connectionreset()
& & & & DATA=1;
& & & & SCK=0;
& & & & for(i=0;i&9;i++)
& & & & & & & & SCK=1;
& & & & & & & & SCK=0;
& & & & transstart();
uint measure1() //测量温度函数
& & & & uchar value_1,value_2;
& & & & transstart();
& & & & error+=write_byte(MEASURE_TEMP);
& & & & if(error!=0)
& & & & & & & & connectionreset();
& & & & else
& & & & & & & & while(DATA==1)
& & & & & & & & {
& & & & & & & & & & & & _nop_();
& & & & & & & & }
& & & & & & & & if(DATA==0)
& & & & & & & & {
& & & & & & & & & & & & value_1=read_byte(ACK);
& & & & & & & & & & & & value_2=read_byte(noACK);
& & & & & & & & & & & & tempvalue=value_2+value_1*256; //转换成 16 位的 int 型
& & & & & & & & }
& & & & & & & & else error=1;
uint measure2() //测量湿度函数
& & & & uchar value_1,value_2;
& & & & transstart();
& & & & error+=write_byte(MEASURE_HUMI);
& & & & if(error!=0)
& & & & connectionreset();
& & & & else
& & & & & & & & while(DATA==1)
& & & & & & & & _nop_();
& & & & & & & & if(DATA==0)
& & & & & & & & {
& & & & & & & & & & & & value_1=read_byte(ACK);
& & & & & & & & & & & & value_2=read_byte(noACK);
& & & & & & & & & & & & tempvalue=value_2+value_1*256;
& & & & & & & & }
& & & & & & & & else error=1;
void lcdwrdata(uchar dat)
& & & & dat = ((dat&0x01)&&7)|((dat&0x02)&&5)|((dat&0x04)&&3)|((dat&0x08)&&1)|((dat&0x10)&&1)|((dat&0x20)&&3)|((dat&0x40)&&5)|((dat&0x80)&&7);
& & & & rs=1;//写数据时RS拉高
& & & & en=1;
& & & & P0=
& & & & delayms(6);
& & & & en=0;
& & & & delayms(6);
void lcdwrcom(uchar cdat)//写指令数据到LCD&&
& & & & cdat = ((cdat&0x01)&&7)|((cdat&0x02)&&5)|((cdat&0x04)&&3)|((cdat&0x08)&&1)|((cdat&0x10)&&1)|((cdat&0x20)&&3)|((cdat&0x40)&&5)|((cdat&0x80)&&7);
& & & & rs=0;//写指令时RS拉低
& & & & en=1;
& & & & P0=//
& & & & delayms(6);//不加此延时将导致不能写入指令,但能写入显示数据
& & & & en=0;
& & & & delayms(6);
void lcd_init()
& & & & lcdwrcom(0x38); //0x38设置显示模式为:16X2显示,5X7点阵,8位数据接口
& & & & lcdwrcom(0x0c); //打开显示光标闪烁
& & & & lcdwrcom(0x06); //
& & & & lcdwrcom(0x01); //
void display(float temp,float humi) //1602显示函数(温度,湿度)
& & & & uint a,b,c,d,e,f,g,h;
& & & & a=(temp/1000);
& & & & b=((temp-a*);
& & & & c=((temp-a*1000-b*100)/10);
& & & & d=(temp-a*1000-b*100-c*10);
& & & & e=(humi/1000);
& & & & f=((humi-e*);
& & & & g=((humi-e*1000-f*100)/10);
& & & & h=(humi-e*1000-f*100-g*10);
& & & & lcdwrcom(0x80+0x07);lcdwrdata('0'+a);
& & & & lcdwrcom(0x80+0x08);lcdwrdata('0'+b);
& & & & lcdwrcom(0x80+0x09);lcdwrdata('.')&&;
& & & & lcdwrcom(0x80+0x0A);lcdwrdata('0'+c);
& & & & lcdwrcom(0x80+0x0B);lcdwrdata('0'+d);
& & & & lcdwrcom(0x80+0x47);lcdwrdata('0'+e);
& & & & lcdwrcom(0x80+0x48);lcdwrdata('0'+f);
& & & & lcdwrcom(0x80+0x49);lcdwrdata('.')&&;
& & & & lcdwrcom(0x80+0x4A);lcdwrdata('0'+g);
& & & & lcdwrcom(0x80+0x4B);lcdwrdata('0'+h);
float calc_temp(uint tempvalue) //计算温度值子函数
& & & & const float d1=-39.9;
& & & & const float d2=+0.01;
& & & & float temp_
& & & & tempvalue=tempvalue&0x3 //取出低 14 位
& & & & temp_final=d1+d2*((float)tempvalue);
& & & & return temp_ //返回温度值
float calc_humi(float humivalue) //计算湿度值子函数
& & & & const float c1=-4.0,c2=0..=0.01,t2=0.00008;
& & & & float rh=
& & & & rhlin=c1+c2*rh+c3*rh*
& & & & rhtrue=(27.87-25)*(t1+t2*rh)+
& & & & if(rhtrue&100)
& & & & & & & & rhtrue=100;
& & & & if(rhtrue&0.1)
& & & & & & & & rhtrue=0.1;
& & & & humivalue=
void main()
& & & & //定义计数器
& & & & uint value1; //定义传感器传出来的数值(16位)
& & & & uint value2; //定义传感器传出来的数值(16位)
& & & & float dis_ //定义温度变量
& & & & float dis_ //定义湿度变量
& & & & //以下是初始化液晶操作
& & & & rw=0;
& & & & delayms(200);
& & & & en=0;
& & & & lcd_init();
& & & & //以下是液晶固定显示
& & & & lcdwrcom(0x80+0x00); //第1行00位置
& & & & for(i=0;i&7;i++)
& & & & & & & & lcdwrdata(table_temp[i]);
& & & & lcdwrcom(0x80+0x0C); //第1行0C位置
& & & & for(i=0;i&4;i++)
& & & & & & & & lcdwrdata(table_c[i]);
& & & & lcdwrcom(0x80+0x40); //第2行40位置
& & & & for(i=0;i&7;i++)
& & & & & & & & lcdwrdata(table_humi[i]);
& & & & lcdwrcom(0x80+0x4C); //第2行4C位置
& & & & for(i=0;i&4;i++)
& & & & & & & & lcdwrdata(table_p[i]);
& & & & //
& & & & while(1)
& & & & & & & & connectionreset();
& & & & & & & & error=0;
& & & & & & & & value1=measure1();
& & & & & & & & value2=measure2();
& & & & & & & & if(error==0)
& & & & & & & & {
& & & & & & & & & & & & led1=0;
& & & & & & & & & & & & delayms(200);
& & & & & & & & & & & & led1=1;
& & & & & & & & & & & & delayms(200);
& & & & & & & & & & & & dis_tempvalue=calc_temp(value1);& &//计算温度值
& & & & & & & & & & & & dis_humivalue=calc_humi(value2);& &//计算湿度值
& & & & & & & & & & & & display(dis_tempvalue*100,dis_humivalue*100); //LCD1602显示温湿度
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & &
& & & & & & & & }
12:31:39  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
二楼附上程序
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
下载发烧友APP
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 单片机c语言编程 的文章

 

随机推荐