单片机C编程高手请进
首先,PB0只是一个普通IO,它只能判断高低电平,要是换成C口(AD转换口)倒是可以,另外,PC4也不是PWM口,MEGA48和MEGA8基本上一样,都只有3路PWM。当然,你可以把PB0接一个按键,每按一次,占空比对应变化一个值。给你一个小程序,希望你能用的上:
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define key1 (PINB&0x01)
#define key2 (PINB&0x02)
#define beep_on PORTD|=0x02
#define beep_off PORTD&=0xfd
#define xtal 8
void beep_three(void);
char t=0;
void delay_1ms(void)
{
uint i;
for(i=0;i<(xtal*143-2);i++)
{
NOP();
}
}
void delay_ms(uint k)
{
uint i=0;
while(i<k)
{
i++;
delay_1ms();
}
}
void port_init(void)
{
DDRB=0xfc; //PB0、1作为按键输入口
PORTB=0xff;
DDRD=0xff;
PORTD=0x00;
DDRC=0xff;
PORTC=0x00;
}
void scan_s1(void)
{ if(t<=250)
{ if(key1==0)
{
delay_ms(20); //消除抖动
if(key1==0)
{
beep_on;
delay_ms(100);
beep_off;
t=t+5; //t递加5,你可以改为1
OCR2=t; //把t值赋给OCR2,用以调节占空比。
delay_ms(200); //防止按压按键时间稍长而导致连加
}
}
}
else //if(t>=244)
{
if(key1==0)
{delay_ms(20);
if(key1==0)
{
t=255;
OCR2=t;
beep_three();
delay_ms(200);
}
}
}
}
void scan_s2(void)
{ if(t>4)
{if(key2==0);
{
if(key2==0)
{
beep_on;
delay_ms(100);
beep_off;
t=t-5;
OCR2=t;
delay_ms(200);
}
}
}
else //if(t==0)
{
if(key2==0)
{delay_ms(20);
if(key2==0)
{
OCR2=0;
beep_three();
delay_ms(200);
}
}
}
}
void beep_three(void)
{
beep_on;
delay_ms(95);
beep_off;
delay_ms(95);
beep_on;
delay_ms(95);
beep_off;
delay_ms(95);
beep_on;
delay_ms(95);
beep_off;
}
void scan_key(void)
{
scan_s1();
scan_s2();
}
void timer2_init(void)
{
TCCR2 = 0x00; //停止定时器
ASSR = 0x00; //异步时钟模式
TCNT2 = 0x00; //初始值
TIMSK |= 0x00; //中断允许
TCCR2 = 0x61; //启动定时器
}
void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80; //禁止JTAG
GICR = 0x00;
port_init();
timer2_init();
SEI(); //开全局中断
}
void main(void)
{
init_devices();
while(1)
{
scan_key();
}
}
呵呵,电路图,被我发现了。
***************************************************
晶振要是12M.
你的显示函数有问题,是一个死循环。
可以把while语句去掉,如果效果不好的话,加个几百次的for循环。
程序在哪?
c语言高手请进,请用C语言帮小弟搞定它,不胜感激!!!如果全对,加分100...
include <stdio.h> void main(){ int abtra[22][22]={0};int n,t,j,i,k=1,nn=0;printf("Please input n: ");scanf("%d",&n);t=n;for( i=1; i<=n; ++i){ \/\/先把上三角全置-1 for( j=1; j<=t; ++j)abtra[i][j]=-1;--t;} for( i=1;i<=n;++i) ...
C语言编程高手请进,帮我看看这个迷宫程序
while(c!=13)\/*如果按下的不是回车键*\/ { c=getch();\/*接收字符后开始各个方向的探索*\/ if(c=='w'&&map[x-1][y]!=1)DrawPeople(&x,&y,1);\/*上*\/ else if(c=='e'&&map[x-1][y+1]!=1)DrawPeople(&x,&y,2);\/*右上*\/ else if(c=='d'&&map[x][y+1]!=1)Dr...
C语言编程问题.请高手进(附源码)!!!HELP
printf("请输入所需要的功能:");scanf("%d",&a);switch(a){ case 1:fcxxwh();break;case 2:;break;case 3:;break;case 4:;break;default:printf("输入错误,请重新打开程序输入!");} } void fcxxwh(void){int a,b,c;printf("1.录入\\t");printf("2.修改\\t");printf("3.删除\\...
C语言:高手请进,对你来说很简单
因为整数和整数相除只取商,余数不管,例如:1\/2,商0,所以结果是0,3\/2,商1,结果是1.你要把最后一段代码这样写:x[i]=1.0\/(float)z[i];进行强制类型转换,转换为FLOAT型的,就可以了;
C编程高手请进,一个关于字符型数据输出为整型的问题
0x是16进制,你定义的char只能接收一个字节,也就是8bit.对于0xFFFF,只能接收前两个FF,前两个F的二进制是11111111,高为是符号位,1代表负值.后面无论有几个F 也等于没有,根本就读不到.负数的补码取反加1,你知道吧,第一个1是符号,表示负值.后面的7位,1111111,把它还原,先减1:1111110,再取反...
高手请进!关于C语言编程,请教一下!
include "stdio.h"int main(){ char ch;ch=getchar();if(ch>'a'&&ch<'z')printf("%c%c%c\\n",ch-1,ch,ch+1);else printf("Input ERROR");return 0;} 望楼主采纳
高手请进!一道C语言编程的题,对于您这相当简单!急!!
int i=010,j=10;printf("%d,%d\\n",++i,j--);前面是0的数字是八进制。由于后面的%d表示输出的是十进制数,所以010就等于十进制的8。而++,--符号在前面的话,就先加减,再用值。而在后面就先用值在加减。所以++i=9,j--=10
高手请进!一道C语言编程的题,对于您这相当简单!急!!
(x++*1\/3)相当于((x++)*1\/3)而x++是后缀运算符,是先进行表达式运算,再对x加1.所以此式相当于x*1\/3 然后x++ 注意到式中有* \/两种运算符,他们的优先级相同,结合性为"左结合",即先算左再算右.以此推之11*1\/3, 11、1、3三个数都是整型数据,所以基运算结果也必为整型。11\/3=3 ...
高手请进!一道C语言编程的题,对于您这相当简单!急!!
m\\n都是十六进制数 0xabc相对应的十进制数为2748 (oxabc是十六进制数,0123是八进制数;)m-=n;相当于m=m-n;(-=称为自反赋值运算)m=2748-2748 所以m=0 最后,printf("%X\\n",m);意即将m按%X\\n(%X\\n表示按十六进制输出,并换行,0的对应十六进制即0),所以屏幕输出0 换行 ...
急!!!高难度c语言编程题,高手请进帮忙!!!
很简单 include<stdio.h> void main(){ int ix,iy;printf("please input the data of x:");scanf("%d",&ix);if(x<-5&&x>0)printf("the y is :%d",ix);if(x==0){ iy=ix-1;printf("the y is:%d"&iy);} if(x<0&&x<10)printf("the y is: 1");printf("input any ...
第南勤可: 首先,PB0只是一个普通IO,它只能判断高低电平,要是换成C口(AD转换口)倒是可以,另外,PC4也不是PWM口,MEGA48和MEGA8基本上一样,都只有3路PWM.当然,你可以把PB0接一个按键,每按一次,占空比对应变化一个值....
未央区15632392153: 单片机c语言编程(关于单片机c语言编程的基本详情介绍) ?
第南勤可: 1、单片机c语言编程是基于C语言的单片机编程.2、单片机的C语言采用C51编译器(简称C51).3、由C51产生的目标代码短,运行速度高,存储空间小,符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言PL/M51语言目标代码混合使用.
未央区15632392153: C语言高手进、单片机编程、 - ?
第南勤可: 首先你声明的void display()函数是没参数的,而你定义的是void display(int x)有参数的.其次你的display函数中的switch case没有break,default.其他没仔细看,你改一下试试.
未央区15632392153: 单片机C程序高手进.. - ?
第南勤可: 行列式键盘扫描程序,再返回键值show(f,0x00+count);
未央区15632392153: 单片机C语言入门? - ?
第南勤可: 1,首先要学习C语言基础,就相当于80%会单片机了,因为现在所有8/16/32位(51系列,MSP430系列,ARM系列)都是使用C语言. 2,听起来单片机比较陌生,不是因为不懂,而是不知道方法和流程.现简单说说,仅供参考; 3,看一下...
未央区15632392153: 单片机C语言怎么编程`?
第南勤可: 每一种单片机都有一套自己的C编译器,你可以直接用,也可以挂载到其他的编译环境中 比如 Wave6000 等 51系列的 推荐用keilV8 Microchip系列的推荐用HT-PICC 编译环境用MPLAB 然后编程代码部分你写好之后,编译,此时会生成一些文件,如*.hex ,*.bin …… 然后把.hex 文件 利用烧写器烧写到单片机里面 这样单片机就可以按照编译的程序执行了 单片机的种类不一样,程序代码也略有区别
未央区15632392153: 单片机C语言编程问题,高手请进 帮忙解释打了问号的语句是什么意思,为什么要那样写? - ?
第南勤可: void respons() //应答 {uchar i;scl=1; 时钟信号 ???delay();while((sda==1)&&(i<250))i++; 数据传送启动 ???scl=0; 先1后0表示一个时钟脉冲 ???delay(); }void init() {sda=1; 同上 ???delay();scl=1; ???delay(); }void ...
未央区15632392153: 单片机怎么用 C语言编程 - ?
第南勤可: keil是比较好的C编译程序.和一般C语言应该没有区别.你看看我这个例子: #include...
未央区15632392153: 单片机c语言如何精通 - ?
第南勤可: 用过瑞萨R8C25的,和你分享一下心得:1.C语言基础打扎实,指针这块一定要透彻,比如随便问一下,int a[3][4],请问a+2是第几号元素的地址,答案有a[0][2]和a[2][0].很容易弄错的.2.文件方面倒是不用看了,单片机不用C语言文件操作....
未央区15632392153: 单片机C语言编程 - ?
第南勤可: /*该程序流水灯有两种模式,顺序左移和顺序右移,独立开关控制*/#include#include#define uchar unsigned char#define uint unsigned int uchar tmp,flag; sbit key1=P3^4; sbit key2=P3^5; void delay(uint z); void led(); void keyscan(); void main() { ...